Содержание
Illustration credit: Vecteezy!
Это третья часть серии статей про Docker и она всецело посвящена Docker-файлам. В первой части основные концепции Docker объясняются на простых примерах из жизни. Во второй статье — краткий обзор экосистемы Docker.
Docker-образы
Docker-образ создаётся во время сборки, а Docker-контейнер — во время запуска приложения.
Docker-файл — сердце Docker’а. Он указывает Docker’у как построить образ, который будет использоваться при создании контейнера.
Каждый Docker-образ содержит файл с именем Dockerfile (он без расширения). При вызове docker build
предполагается, что Dockerfile будет находиться в текущей рабочей директории. Но с помощью флага -f
можно указать другое расположение.
Frontend-разработчик (Vue)
, ,
tproger.ru Вакансии на tproger.ru
Контейнер состоит из ряда слоёв. Все слои доступны только для чтения, кроме последнего — он располагается над остальными. Docker-файл указывает порядок добавления слоёв.
Каждый слой — это просто файл с изменением предыдущего слоя. В Unix практически всё является файлом. Базовый слой, его ещё называют родительским, — это начальный слой.
При загрузке Docker-образа из удалённого репозитория скачиваются только отсутствующие у вас слои. Docker экономит место и время, повторно используя уже существующие слои.
Инструкция Docker-файла — слово в верхнем регистре, которое стоит перед аргументом какой-либо команды. Каждая строка в Docker-файле может содержать инструкцию, все они обрабатываются сверху вниз. Инструкции выглядят так:
FROM ubuntu:18.04 COPY . /app
И только инструкции FROM
, RUN
, COPY
и ADD
создают слои в конечном образе. Другие инструкции производят настройку, добавляют метаданные или же просто говорят Docker’у сделать что-либо во время запуска (например открыть порт или выполнить команду).
Эта статья предполагает использование Unix Docker-образа. Вы, конечно, можете использовать и Windows Docker-образ, но он медленнее, менее удобный и, вообще, его не часто применяют. Так что, пользуйтесь Unix по возможности.
Несколько Docker-инструкций
-
FROM
— задаёт родительский (главный) образ; -
LABEL
— добавляет метаданные для образа. Хорошее место для размещения информации об авторе; -
ENV
— создаёт переменную окружения; -
RUN
— запускает команды, создаёт слой образа. Используется для установки пакетов и библиотек внутри контейнера; -
COPY
— копирует файлы и директории в контейнер; -
ADD
— делает всё то же, что и инструкцияCOPY
. Но ещё может распаковывать локальные.tar
файлы; -
CMD
— указывает команду и аргументы для выполнения внутри контейнера. Параметры могут быть переопределены. Использоваться может только одна инструкцияCMD
; -
WORKDIR
— устанавливает рабочую директорию для инструкцииCMD
иENTRYPOINT
; -
ARG
— определяет переменную для передачи Docker’у во время сборки; -
ENTRYPOINT
— предоставляет команды и аргументы для выполняющегося контейнера. Суть его несколько отличается отCMD
, о чём мы поговорим ниже; -
EXPOSE
— открывает порт; -
VOLUME
— создаёт точку подключения директории для добавления и хранения постоянных данных.
Инструкции и примеры к ним
Docker-файл чисто теоретически может содержать только одну строчку:
FROM ubuntu:18.04
FROM
Docker-файл должен начинаться с инструкции FROM
или ARG
, за которой следует FROM
. Команда FROM
говорит Docker’у использовать базовый образ, который соответствует репозиторию и тегу.
В этом примере хранилище образов — Ubuntu. Ubuntu — название официального Docker-репозитория, в котором и содержится данная ОС.
Заметьте, что этот Docker-файл содержит тег для базового образа: 18.04, который указывает Docker’у, какую именно версию образа нужно использовать. Если тег не указан, по умолчанию берётся последняя версия образа. Но лучше всё же указывать тег базового образа. Когда Docker-файл, приведённый выше, используется для создания локального Docker-образа впервые, он загружает слои, указанные в образе Ubuntu.
При создании Docker-контейнера, вы помещаете наверх слой, который впоследствии можно будет изменить.
Когда образ запущен, и нужно произвести некоторые изменения, файл копируется на верхний слой, доступный для редактирования. Узнать, как это делается, можно здесь.
Подробнее про Docker-файл
Кроме того, что ваш однострочный образ сжат, он ещё и медленный, предоставляет мало информации и ничего не делает во время запуска контейнера. Посмотрите на более длинный Docker-файл, который запускает более легковесный образ, а также выполняет скрипт во время запуска.
FROM python:3.7.2-alpine3.8 LABEL maintainer="jeffmshale@gmail.com" ENV ADMIN="jeff" RUN apk update && apk upgrade && apk add bash COPY . ./app ADD https://raw.githubusercontent.com/discdiver/pachy-vid/master/sample_vids/vid1.mp4 /my_app_directory RUN ["mkdir", "/a_directory"] CMD ["python", "./my_script.py"]
Но что же это всё обозначает?
В роли базового образа выступает официальный Python-образ с тегом 3.7.2-alpine3.8. Как вы можете увидеть из исходников, образ включает в себя Linux, Python и ничего более. Alpine-образы очень популярны, потому что они маленькие, быстрые и безопасные. Однако Alpine-образы не поставляются сразу со всеми компонентами, характерными для вашей ОС. Некоторые пакеты вам придётся установить самостоятельно.
LABEL
Следующая инструкция — LABEL
. LABEL
добавляет метаданные к образу, предоставляет контактную информацию. Она не замедляет процесс запуска и не занимает много места, наоборот, обеспечивает образ полезной информацией, так что обязательно используйте её. Больше про LABEL
читайте здесь.
ENV
ENV
создаёт переменную окружения, которая становится доступной во время запуска контейнера. В примере выше вы могли видеть использование переменной ADMIN
при создании контейнера.
ENV
удобна для обозначения констант. Если константа используется в нескольких местах файла Dockerfile, и вам понадобится изменить её значение позднее, это можно будет сделать в одном месте.
Docker-файл зачастую предоставляет несколько путей решения одной задачи. Будет хорошо, если в вашем решении будет учитываться баланс Docker-соглашений, прозрачность и скорость. К примеру, RUN
, CMD
и ENTRYPOINT
служат различным целям и могут использоваться для выполнения команд.
RUN
RUN
создаёт слой во время запуска. Docker фиксирует состояние образа после каждой инструкции RUN
.
Чаще всего используется для установки нужных пакетов внутрь контейнера. В примере выше RUN apk update && apk upgrade
говорит Docker’у обновить пакеты из базового образа. && apk add bash
указывает на то, что для базового образа нужно установить bash
.
apk
— это сокращение от Alpine Linux package manager. Если вы используете базовый образ не Alpine Linux, то установка пакетов производится командой RUN apt-get
.
RUN
и её родственные инструкции: CMD
, ENTRYPOINT
— могут быть как форме оболочки, так и в форме shell-скрипта. Во втором случае используют JSON-синтаксис: RUN ["my_executable", "my_first_param1", "my_second_param2"]
. А в примере выше использовалась форма оболочки: RUN apk update && apk upgrade && apk add bash
.
Позднее в вашем Docker-файле вы будете создавать новую директорию, используя ["mkdir", "/a_directory"]
. Не забывайте, что в JSON нужно использовать двойные кавычки!
COPY
Инструкция COPY . ./app
говорит Docker’у, что нужно скопировать файлы и папки из вашей локальной сборки в рабочую директорию образа. COPY
создаст все нужные папки, если они отсутствуют.
ADD
ADD
делает то же самое, что и COPY
, но с двумя отличиями. ADD
может загружать файлы по URL, а также извлекать локальные TAR-файлы.
В примере выше ADD
копировала файлы по URL внутрь директории контейнера. Но официальныя документация не рекомендует использовать ADD
так, потому что потом вы попросту не сможете удалить файлы. А дополнительные файлы увеличивают размер образа.
Ещё официальная документация для ясности рекомендует использовать, когда это возможно, COPY
вместе ADD
. Жаль только, что в Docker’е невозможно использовать ADD
и COPY
в одной команде.
Заметьте, инструкция содержит символ . Это нужно для лучшей читаемости — так вы разбиваете длинную инструкцию на несколько строк.
CMD
CMD
— инструкция для запуска чего-либо во время запуска самого контейнера. По ходу сборки она не фиксирует никакого результата. В примере выше во время сборки запускался скрипт my_script.py
.
Ещё пара моментов о CMD
:
- Только одна
CMD
-инструкция на весь Docker-файл. Иначе все кроме последней будут проигнорированы; -
CMD
может включать исполняемый файл; - Если же
CMD
не содержит никакого файла, обязательно должна быть инструкцияENTRYPOINT
. В этом случает обе инструкции должны быть в формате JSON; - Аргументы командной строки для запуска Docker переопределяют аргументы, предоставленные
CMD
в Docker-файле.
Готовы к большему?
В следующем примере представлены ещё несколько Docker-инструкций:
FROM python:3.7.2-alpine3.8 LABEL maintainer="jeffmshale@gmail.com" # Install dependencies RUN apk add --update git # Set current working directory WORKDIR /usr/src/my_app_directory # Copy code from your local context to the image working directory COPY . . # Set default value for a variable ARG my_var=my_default_value # Set code to run at container run time ENTRYPOINT ["python", "./app/my_script.py", "my_var"] # Expose our port to the world EXPOSE 8000 # Create a volume for data storage VOLUME /my_volume
В Docker-файле вы можете добавлять комментарии. Комментарии начинаются со знака #
.
Обычно установка пакетов — приоритетная задача для Docker’а. Как говорилось ранее, есть несколько способов загрузки пакетов при помощи инструкции RUN
.
Для Alpine Docker-образа вы используете apk. apk
для типичной Linux-сборки — apt-get
. Например, пакеты для базового Ubuntu-образа могут быть установлены и обновлены так: RUN apt-get update && apt-get install my_package
.
В дополнение к apk
и apt-get
, Python-пакеты могут быть установлены через pip, wheel и conda. Методы варьируются в зависимости от языка.
Нижележащие слои должны предоставить свое средство установки и управления пакетами. Если возникнет проблема с установкой пакетов, убедитесь, что у вас установлен менеджер пакетов.
Можно использовать RUN
вместе с pip и списком нужных пакетов. Для этого объедините команды установки пакетов в одну инструкцию и разделите их символом продолжения строки (). Этот метод позволяет улучшить читаемость и уменьшить количество слоев (из-за отсутствия возможности использовать несколько
RUN
инструкций).
Также вы можете запустить установщик, указав ему файл, содержащий все зависимости для вашего образа. Обычно он называется requirements.txt.
WORKDIR
Меняет текущую рабочую директорию в контейнере для инструкций: COPY
, ADD
, RUN
и ENTRYPOINT
.
Несколько замечаний:
- Предпочтительно задать абсолютный путь с помощью WORKDIR, а не перемещаться по файловой системе с помощью команд
cd
в Docker-файле; -
WORKDIR
автоматически создаёт директорию, если её ещё нет; - Можно использовать несколько
WORKDIR
-инструкций. Если используются относительные пути — каждая инструкция поменяет рабочую директорию.
ARG
Определяет переменную для передачи из командной строки в образ. Для ARG
можно указать значение по умолчанию: ARG my_var=my_default_value
.
В отличие от ENV
-переменных, ARG
-переменные не доступны для запущенных контейнеров. Однако вы можете использовать их для установки дефолтных значений для ENV
-переменных, когда вы создаёте образ. И затем ENV-переменные сохраняются. Больше про это вы найдёте здесь.
ENTRYPOINT
ENTRYPOINT
тоже позволяет вам задавать дефолтные команды и аргументы во время запуска контейнера. Она похожа на CMD
, но параметры ENTRYPOINT
не переопределяются, если контейнер запущен с параметрами командной строки.
Вместо этого аргументы командной строки, передаваемые docker run myimagename
, добавляются к аргументам инструкции ENTRYPOINT
. Например, docker run my_image bash
добавляет аргумент bash
в конец, ко всем другим аргументам ENTRYPOINT
.
Docker-файл обязательно должен содержать либо CMD
-инструкцию, либо ENTRYPOINT
-инструкцию. В официальной документации есть несколько советов, которые помогут сделать выбор между CMD
и ENTRYPOINT
для начальной команды:
- Если вам нужно запускать одну и туже команду несколько раз, выбирайте
ENTRYPOINT
; - Используйте
ENTRYPOINT
, когда ваш контейнер выступает в роли исполняющейся программы; - При наличии дополнительных дефолтных аргументов, которые могут быть изменены через командную строку, лучше подойдёт
CMD
.
В примере выше, ENTRYPOINT ["python", "my_script.py", "my_var"]
запускает в контейнере Python-скрипт my_script.py
с аргументом my_var
. Затем переменная my_var
может быть использована в my_script
argparse. Заметьте, у my_var
есть дефолтное значение, ранее установленное в Docker-файле при помощи ARG
. Так что, если аргумент не будет задан через командную строку, возьмётся его значение по умолчанию.
Как правило, Docker рекомендует вам использовать исполняемую форму с JSON-синтаксисом ENTRYPOINT ["executable", "param1", "param2"]
.
EXPOSE
Инструкция EXPOSE
показывает, какой порт пробрасывать из контейнера.
Используйте команду docker run
с флагом -p
для пробрасывания и сопоставления нескольких портов во время запуска. Флаг в верхнем регистре -P
будет пробрасывать все открытые порты.
VOLUME
VOLUME
определяет, где контейнер будет хранить постоянные данные и получать к ним доступ.
Заключение
В этой статье не были упомянуты такие инструкции, как USER
, ONBUILD
, STOPSIGNAL
, SHELL
, и HEALTHCHECK
, информацию про них вы сможете найти здесь.
Перевод статьи «Learn Enough Docker to be Useful»
Выполнение docker version
возвращает следующие результаты.
C:Projects> docker version Client: Version: 1.13.0-dev API version: 1.25 Go version: go1.7.3 Git commit: d8d3314 Built: Tue Nov 1 03:05:34 2016 OS/Arch: windows/amd64 error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.25/version: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
Запуск диагностики дает следующее:
C:Projects> wget https://github.com/Microsoft/Virtualization- Documentation/raw/master/windows-server-container-tools/Debug- ContainerHost/Debug-ContainerHost.ps1 -UseBasicParsin | iex Checking for common problems Describing Windows Version and Prerequisites [+] Is Windows 10 Anniversary Update or Windows Server 2016 608ms [+] Has KB3192366, KB3194496, or later installed if running Windows build 14393 141ms [+] Is not a build with blocking issues 29ms Describing Docker is installed [-] A Docker service is installed - 'Docker' or 'com.Docker.Service' 134ms Expected: value to not be empty 27: $services | Should Not BeNullOrEmpty at , : line 27 [+] Service is running 127ms [+] Docker.exe is in path 2.14s Describing User has permissions to use Docker daemon [+] docker.exe should not return access denied 42ms Describing Windows container settings are correct [-] Do not have DisableVSmbOplock set to 1 53ms Expected: {0} But was: {1} 66: $regvalue.VSmbDisableOplocks | Should Be 0 at , : line 66 [+] Do not have zz values set 42ms Describing The right container base images are installed error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.25/images/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running. [-] At least one of 'microsoft/windowsservercore' or 'microsoft/nanoserver' should be installed 129ms ValidationMetadataException: The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. ParameterBindingValidationException: Cannot validate argument on parameter 'Property'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. at , : line 90 Describing Container network is created [-] Error occurred in Describe block 1.08s RuntimeException: Cannot index into a null array. at , : line 119 Showing output from: docker info Showing output from: docker version Client: Version: 1.13.0-dev API version: 1.25 Go version: go1.7.3 Git commit: d8d3314 Built: Tue Nov 1 03:05:34 2016 OS/Arch: windows/amd64 Showing output from: docker network ls Warnings & errors from the last 24 hours Logs saved to C:Projectslogs_20161107-084122.csv C:Projects>
— Джим
Docker – это система управления контейнерами для Linux. Если говорить просто, то контейнеры – это что-то среднее между виртуальными машинами, с полной изоляцией и chroot окружением. Все процессы выполняются в изолированном пространстве, но в то же время на одном ядре, что позволяет экономить ресурсы основной системы.
Для работы docker ваша система должна отвечать таким требованиям:
- Программа работает только на системах 64 битной архитектуры;
- Необходимо ядро версии не ниже чем 3.10. В более старых версиях реализованы не все необходимые возможности, и это будет вызывать различные ошибки;
- Быстрый интернет – для загрузки или выгрузки образов контейнера.
Если вы используете Ubuntu версии выше 16.04, то проблем с ядром не возникнет, так как эта система поставляется с ядром 4.2 по умолчанию.
Перед тем как переходить к установке самой программы, нужно обновить систему до актуального состояния. Для этого выполните:
Перед тем как установить Docker Ubuntu необходимо установить дополнительные пакеты ядра, которые позволяют использовать Aufs для контейнеров Docker. С помощью этой файловой системы мы сможем следить за изменениями и делать мгновенные снимки контейнеров:
Ещё надо установить пакеты, необходимые для работы apt по https:
После того как все приготовления завершены и вы убедились что ваша система полностью готова, можно перейти к установке. Мы будем устанавливать программу из официального репозитория разработчиков. Сначала надо добавить ключ репозитория:
Затем добавьте репозиторий docker в систему:
И установка Docker на Ubuntu:
Теперь установка Docker Ubuntu и всех необходимых компонентов завершена. Первой командой мы добавили ключ репозитория разработчиков, второй – сам репозиторий. Далее обновили списки пакетов и сообщили системе что можно заменять системные пакеты на пакеты из этого репозитория.
Чтобы завершить установку осталось добавить нашего пользователя в группу docker. Иначе при запуске утилиты вы будете получать ошибку подключения к сокету:
Для добавления выполните:
Затем проверяем запущен ли сервис:
Все готово к работе. Теперь рассмотрим подробнее использование Docker.
Сейчас работа с docker не обходится без утилиты управления контейнерами docker compose, давайте её тоже установим. Чтобы установить docker compose Ubuntu выполните последовательность команд:
Утилита была загружена из официального сайта и теперь вы можете посмотреть её версию:
Все действия с контейнерами выполняются утилитой docker. Ее можно запускать от имени вашего пользователя после того, как он был добавлен в группу программы. Синтаксис утилиты очень прост:
$ docker опции команда опции_команды аргументы
Давайте сначала рассмотрим основные опции утилиты их всего несколько:
- -D – включить режим отладки;
- -H – подключиться к серверу, запущенному на другом компьютере;
- -l – изменить уровень ведения логов, доступно: debug,info,warn,error,fatal;
- -v – показать версию;
- –help вывести справку по команде или утилите в целом;
Команд намного больше, ниже приведены все команды, которые вы можете использовать в своих программах:
- attach – подключиться к запущенному контейнеру;
- build – собрать образ из инструкций dockerfile;
- commit – создать новый образ из изменений контейнера;
- cp – копировать файлы между контейнером и файловой системой;
- create – создать новый контейнер;
- diff – проверить файловую систему контейнера;
- events – посмотреть события от контейнера;
- exec – выполнить команду в контейнере;
- export – извлечь содержимое контейнера в архив;
- history – посмотреть историю изменений образа;
- images – список установленных образов;
- import – создать контейнер из архива tar;
- info – посмотреть информацию о системе;
- inspect – посмотреть информацию о контейнере;
- kill – остановить запущенный контейнер;
- load – загрузить образ из архива;
- login – авторизация в официальном репозитории Docker;
- logout – выйти из репозитория Docker;
- logs – посмотреть логи контейнера;
- pause – приостановить все процессы контейнера;
- port – подброс портов для контейнера;
- ps – список запущенных контейнеров;
- pull – скачать образ контейнера из репозитория;
- push – отправить образ в репозиторий;
- restart – перезапустить контейнер;
- rm – удалить контейнер;
- run – выполнить команду в контейнере;
- save – сохранить образ в архив tar;
- search – поиск образов в репозитории по заданному шаблону;
- start – запустить контейнер;
- stats – статистика использования ресурсов контейнером;
- stop – остановить контейнер;
- top – посмотреть запущенные процессы в контейнере;
- unpause – проложить выполнение процессов в контейнере.
В этой статье мы будем часто использовать команду run, рассмотрим ее опции:
- -e – переменные окружения для команды;
- -h – имя хоста контейнера;
- -i – интерактивный режим, связывающий stdin терминала с командой;
- -m – ограничение памяти для команды;
- -u – пользователь, от имени которого будет выполнена команда;
- -t – связать tty с контейнером для работы ввода и вывода;
- -v – примонтировать директорию основной системы в контейнер.
Теперь, когда мы рассмотрели все основы, приведем несколько примеров работы с контейнерами. Это очень просто.
Чтобы убедиться что все работает давайте запустим тестовый образ. Для этого наберите:
Больше ничего не нужно, программа сама скачает образ, и выполнит оболочку в нем. Вы увидите сообщение Hello from Docker:
Использование docker очень простое по своей сути. Если вы не знаете название нужного пакета, можете воспользоваться поиском, например, найдем Ubuntu:
Утилита выведет список всех доступных для загрузки образов из репозитория Docker, которые содержат такое слово. Колонка Official означает, что образ поддерживается официальным разработчиком, а Stars – это количество пользователей, которым этот образ понравился.
Для загрузки образа на локальный компьютер используйте команду pull:
После завершения загрузки вы можете посмотреть список установленных образов:
Теперь, давайте запустим командную оболочку контейнера с помощью команды run, для получения интерактивного доступа используйте опции -i и -t:
Вы в окружении контейнера. У вас есть права суперпользователя, но вы не можете получить доступ к основной системе. Контейнер содержит минимум необходимых файлов, нет даже текстовых редакторов. Для установки чего-либо сначала нужно обновить репозиторий:
Например, установим утилиту dialog:
Вы можете изменять контейнер как захотите, добавлять и удалять программы и многое другое. Но когда вы его удалите, все изменения будут потеряны. Вы можете создать новое образ из модифицированного контейнера, для этого используется команда commit. Сначала смотрим список запущенных контейнеров:
Отсюда возьмите id контейнера, затем выполните такую команду для создания нового образа:
Например:
Новый образ был сохранен на вашем компьютере и вы можете увидеть его в списке образов:
Как я уже говорил, вы можете посмотреть список запущенных контейнеров с помощью команды ps:
Если вам нужны все контейнеры, используйте опцию -a:
Чтобы вывести последний созданный контейнер, используйте:
Чтобы остановить запущенный контейнер используйте команду stop:
Для запуска:
Вы можете подключиться к запущенному контейнеру с помощью attach:
Чтобы удалить контейнер со всеми изменениями выполните:
Вы этой статье мы рассмотрели как выполняется установка Docker Ubuntu. В этом дистрибутиве процесс установки не будет трудным даже для новичков. А возможность установки различных дистрибутивов в несколько команд может быть полезной во многих ситуациях. А вы пользуетесь Docker? Для решения каких задач? Напишите в комментариях!
–>14/01/2018 13:41 Если у вас появилась потребность в запуске Docker под Windows на машине со старым железом (без поддержки hyper-v), то в данной статье я расскажу как это сделать. Скорее всего при запуске Docker Вы получили следующее сообщение: Данное сообщение говорит о том, что у вас в bios отключена система аппаратной виртуализации и ее необходимо включить. К сожалению не все машины имеют данную систему виртуализации. Или же при использовании Windows 10 Home вы могли получить следующее сообщение: Docker for Windows requires Windows 10 Pro or Enterprise version 14393 to run. Данное сообщение говорит о том, что для работы Docker требуется версия Windows 10 PRO. К сожаление с hyper-v системой виртуализации можно работать только в PRO версии системы. Как быть если в BIOS нельзя включить HYPER-V или ваша версия операционной системы не позволяет вам этого сделать? Для этого вам понадобится Docker ToolBox. Скачать его можно тут (официальный сайт). Для запуска/установки Docker ToolBox вам может понадобиться VirtualBox. Вы можете выбрать любую другую версию VIrtualBox на официальном сайте. Далее после установки Docker ToolBox у вас появятся ярлыки для запуска Docker Quickstart Terminal и Kitematic (Alpha). В данной статье я расскажу как запустить контейнер hello-world-nginx в Kitematic (Alpha). Запустите Kitematic (Alpha): В списке доступных контейнеров будет hello-world-nginx. Он нам и нужен. Нажмите create. После чего контейнер будет скачан с Docker hub и скорее всего автоматически запущен. Откройте вкладку Setting, а в ней вкладку Hostname / ports: Теперь необходимо задать порты для вашего контейнера. В первой колонке DOCKER PORT задайте 80 порт. Во второй колонке PUBLISHED IP:PORT необходимо прописать порт 9090. На всякий случай, для избежания конфликтов, убедитесь, что данные порты на вашей машине свободны. После проведения данных манипуляций необходимо перезагрузить машину и снова запустить Kitematic (Alpha). После загрузки Kitematic (Alpha) вы увидите созданный контейнер: Запустите его, нажав кнопку start и перейдите по IP указанному в настройках hostname/ports (В моем случае на скриншоте это был IP 192.168.99.100 и порт 9090). После перехода в браузере по данному URL и порту вы должны увидеть страницу со следующим содержимым: На этом все! Docker установлен, контейнер запущен.Виртуализация / Docker
В *nix-системах изначально реализована многозадачность и предлагаются средства, позволяющие изолировать и контролировать процессы. Такие технологии, как chroot(), обеспечивающая изоляцию на уровне файловой системы, FreeBSD Jail, ограничивающая доступ к структурам ядра, LXC и OpenVZ, давно известны и широко используются. Но импульсом в развитии технологии стал Docker, позволивший удобно распространять приложения. Теперь подобное добралось и до Windows.
Контейнеры в Windows
Современные серверы обладают избыточной производительностью, и приложения порой не используют даже их части. В результате системы какое-то время «простаивают», нагревая воздух. Выходом стала виртуализация, позволяющая запускать несколько ОС на одном сервере, гарантированно разделяя их между собой и выделяя каждой нужное количество ресурсов. Но прогресс не стоит на месте. Следующий этап — микросервисы, когда каждая часть приложения развертывается отдельно, как самодостаточный компонент, который легко масштабируется под нужную нагрузку и обновляется. Изоляция предотвращает вмешательство в работу микросервиса со стороны других приложений. С появлением проекта Docker, упростившего процесс упаковки и доставки приложений вместе с окружением, архитектура микросервисов получила дополнительный толчок в развитии.
Контейнеры — это иной тип виртуализации, предоставляющий обособленную среду для выполнения приложений, называемую OS Virtualization. Реализуются контейнеры за счет использования изолированного пространства имен, включающего все необходимые для работы ресурсы (виртуализированные имена), с которыми можно взаимодействовать (файлы, сетевые порты, процессы и прочее) и выйти за которые нельзя. То есть ОС показывает контейнеру только то, что выделено. Приложение внутри контейнера считает, что оно единственное, и работает в полноценной ОС без каких-либо ограничений. Если необходимо изменить существующий файл или создать новый, контейнер получает копии с основной ОС хоста, сохраняя только измененные участки. Поэтому развертывание нескольких контейнеров на одном хосте очень эффективно.
Отличие контейнеров от виртуальных машин заключается в том, что контейнеры не загружают собственные копии ОС, библиотеки, системные файлы и прочее. Операционная система как бы делится с контейнером. Единственное, что дополнительно требуется, — это ресурсы, необходимые для запуска приложения в контейнере. В результате контейнер стартует в считаные секунды и меньше нагружает систему, чем в случае применения виртуальных машин. Docker в настоящее время предлагает 180 тысяч приложений в репозитории, а формат унифицирован в Open Container Initiative (OCI). Но зависимость от ядра подразумевает, что в другой ОС контейнеры не будут работать. Контейнеры Linux требуют Linux API, соответственно Windows в Linux работать не станет.
Разработчики Windows до недавнего времени предлагали две технологии виртуализации: виртуальные машины и виртуальные приложения Server App-V. Каждая имеет свою нишу применения, свои плюсы и минусы. Теперь ассортимент стал шире — в Windows Server 2016 анонсированы контейнеры (Windows Server Containers). И хотя на момент TP4 разработка еще не была завершена, уже вполне можно посмотреть новую технологию в действии и сделать выводы. Нужно отметить, что, догоняя и имея на руках готовые технологии, разработчики MS пошли в некоторых вопросах чуть дальше, так что использование контейнеров стало проще и более универсальным. Главное отличие в том, что предложены два вида контейнеров: контейнеры Windows и контейнеры Hyper-V. В TP3 были доступны только первые.
Контейнеры Windows используют одно ядро с ОС, которое динамично разделяют между собой. Процесс распределения (CPU, ОЗУ, сеть) берет на себя ОС. При необходимости можно ограничить максимально доступные ресурсы, выделяемые контейнеру. Файлы ОС и запущенные службы проецируются в пространство имен каждого контейнера. Такой тип контейнера эффективно использует ресурсы, уменьшая накладные расходы, а значит, позволяет более плотно размещать приложения. Этот режим в чем-то напоминает FreeBSD Jail или Linux OpenVZ.
Контейнеры Hyper-V обеспечивают дополнительный уровень изоляции при помощи Hyper-V. Каждому контейнеру выделяется свое ядро и память, изоляцию осуществляет не ядро ОС, а гипервизор Hyper-V. В результате достигается такой же уровень изоляции, как и в виртуальных машинах, при меньших накладных расходах по сравнению с VM, но больший, если сравнить с контейнерами Windows. Для использования такого вида контейнеров нужно установить на хосте роль Hyper-V. Контейнеры Windows больше подходят для использования в доверенной среде, например когда на сервере запускаются приложения одной организации. Когда же сервером пользуются множество компаний и необходимо обеспечить больший уровень изоляции, контейнеры Hyper-V, вероятно, будут более рациональны.
Важная особенность контейнеров в Win 2016 состоит в том, что тип выбирается не в момент создания, а в момент деплоя. То есть любой контейнер может быть запущен и как Windows, и как Hyper-V.
В Win 2016 за контейнеры отвечает слой абстракции Contаiner Management stack, реализующий все нужные функции. Для хранения используется формат образа жесткого диска VHDX. Контейнеры, как и в случае с Docker, сохраняются в образы в репозитории. Причем каждый сохраняет не полный набор данных, а только отличия создаваемого образа от базового, и в момент запуска все нужные данные проецируются в память. Для управления сетевым трафиком между контейнером и физической сетью служит Virtual Switch.
В качестве ОС в контейнере может использоваться Server Core или Nano Server. Первый, в общем-то, давно не новинка и обеспечивает высокий уровень совместимости с имеющимися приложениями. Второй — еще более урезанная версия для работы без монитора, позволяющая запускать сервер в минимально возможной конфигурации для использования с Hyper-V, файловым сервером (SOFS) и облачными службами. Графический интерфейс, естественно, отсутствует. Содержит только самые необходимые компоненты (.NET с CoreCLR, Hyper-V, Clustering и так далее). Но в итоге занимает на 93% меньше места, требует меньше критических исправлений.
Еще интересный момент. Для управления контейнерами, кроме традиционного PowerShell, можно использовать и Docker. И чтобы обеспечить возможность запуска неродных утилит на Win, MS заключила партнерское соглашение для расширения API Docker и набора инструментов. Все разработки открыты и доступны в официальном GitHub проекта Docker. Команды управления Docker применимы ко всем контейнерам как Win, так и Linux. Хотя, естественно, контейнер, созданный на Linux, запустить в Windows невозможно (как и наоборот). В настоящий момент PowerShell по функциям ограничен и позволяет работать только с локальным репозиторием.
Установка Containers
В Azure есть необходимый образ Windows Server 2016 Core with Containers Tech Preview 4, который можно развернуть и использовать для изучения контейнеров. Иначе необходимо все настроить самому. Для локальной установки нужен Win 2016, причем, так как Hyper-V в Win 2016 поддерживает вложенную виртуализацию (Nested virtualization), это может быть как физический, так и виртуальный сервер. Сам процесс установки компонента стандартен. Выбираем соответствующий пункт в мастере добавления ролей и компонентов или, используя PowerShell, даем команду
Другие статьи в выпуске:
ли со статьей или есть что добавить?