Docker создание образа. Docker управление контейнерами: базовые возможности

Справка по командам управления образами и контейнерами Docker.

Термины

Образ - это статический билд на основе определенной OS.

Контейнер - это запущенный инстанс образа.

Права на запуск docker

Чтобы запускать Docker контейнеры под своим пользователем (без sudo), нужно добавиться в соответствующую группу:

Sudo usermod -aG docker YOU_USER

Сервис Docker

Управление сервисом Docker"а:

Sudo service docker start|stop|restart|status sudo restart docker # алиас

Образы

Список доступных образов:

Docker images

Скачать образ (или весь репозиторий) из официального регистра (хранилища образов):

Docker pull ubuntu:14.04

Посмотреть информацию об образе:

Docker inspect ubuntu

Удалить образ:

Docker commit CONTAINER_ID IMAGE_NAME

Контейнеры

Внимание!

После запуска Docker контейнера сервисы/демоны (как-то SSH, Supervisor и прочие) не будут запускаться автоматически! Я потратил несколько часов на отладку ошибки: "ssh_exchange_identification: read: Connection reset by peer ", при попытке подключиться к контейнеру по SSH. А оказалось, что всего-то не запускался демон sshd. Вы должны будете вручную запускать нужные демоны или супервизор после старта контейнера:

Docker exec CONTAINER_ID bash -c "service ssh start"

Список всех контейнеров (запущенных и остановленных):

Docker ps -a

Удалить контейнер(ы):

Docker rm CONTAINER_ID CONTAINER_ID

Удалить все контейнеры:

Docker rm $(docker ps -aq)

Создать и запустить Docker контейнер c Ubuntu 14.04 в интерактивном режиме (открыть shell этого контейнера):

Docker run -it ubuntu bash docker run [опции] образ [команда] -i Интерактивный режим, держим STDIN открытым -t Allocate/creates a pseudo-TTY that attaches stdin and stdout --name Имя контейнера вместо ID -w Указать рабочую директорию (--workdir) -e Установить переменную окружения в контейнере -u Пользователь:группа под которым должен быть запущен контейнер -v Смонтировать в контейнер файл или каталог хост-системы -p Пробросить порт(ы) контейнера - <порт хост-системы>:<порт контейнера> (--publish=) --entrypoint Заменить дефолтную команду из ENTRYPOINT файла Dockerfile

Примечание

Чтобы отсоединить TTY без остановки контейнера нажмите Ctr + P + Ctrl + Q .

Создать и запустить Docker контейнер в режиме демона с пробросом SSH порта:

Docker run -itd -p 127.0.0.1:221:22 ubuntu

Создать и запустить контейнер с последующим удалением этого контейнера после остановки (полезно для отладки):

Docker run -i -t --rm ubuntu bash

Запустить остановленный контейнер интерактивно:

Docker start -i CONTAINER_ID

Подключиться к демонизированному контейнеру:

Docker attach CONTAINER_ID

Команды Docker

Usage: docker COMMAND docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files -D, --debug=false Enable debug mode --disable-legacy-registry=false Do not contact legacy registries -H, --host= Daemon socket(s) to connect to -h, --help=false Print usage -l, --log-level=info Set the logging level --tls=false Use TLS; implied by --tlsverify --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA --tlscert=~/.docker/cert.pem Path to TLS certificate file --tlskey=~/.docker/key.pem Path to TLS key file --tlsverify=false Use TLS and verify the remote -v, --version=false Print version information and quit Commands: attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container"s changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container"s filesystem events Get real time events from the server exec Run a command in a running container export Export a container"s filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Register or log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save an image(s) to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container volume Manage Docker volumes wait Block until a container stops, then print its exit code Run "docker COMMAND --help" for more information on a command.

Docker это популярный инструмент, который благодаря использованию контейнеров предоставляет все необходимое для запуска приложений. Используя Docker-контейнеры, вы можете быть уверенными в том, что приложение будет работать одинаково на любых машинах, на которых вы его запустите.

Из этого руководства вы узнаете о связи контейнеров и образов Docker, а также о том, как устанавливать, запускать, останавливать и удалять контейнеры.

Обзор

Образ Docker можно представить в качестве некоторого шаблона, который используется для создания контейнеров. Образы обычно начинаются с корневой файловой системы, к которой затем сверху слоями добавляются различные изменения и соответствующие им параметры запуска. В отличие от типичных дистрибутивов Linux, образ Docker обычно содержит только части, которые необходимы для запуска приложения. У образов нет статусов, и они не изменяются. Правильнее сказать, что они являются исходной точкой, основой для контейнеров Docker.

Образы «оживают» в тот момент, когда вы вводите команду docker run - она сразу же создает контейнер в результате добавления поверх образа новый уровень для чтения и записи. Эта комбинация уровней только для чтения (поверх которых добавляется уровень для чтения и записи) также известна как UnionFS - файловая система, производящая каскадно-объединённое монтирование файловых систем. Когда в существующий файл запущенного контейнера вносится какое-либо изменение, файл копируется из области только для чтения на уровень для записи и чтения, где и применяются эти изменения. И теперь изначальный файл скрыт версией с уровнем для записи и чтения, но он не удален. Подобные изменения в уровне для записи и чтения существуют только внутри данного отдельного контейнера. Когда контейнер удаляется, все изменения также теряются (если они не были сохранены).

Работа с контейнерами

Каждый раз, когда вы используете команду docker run, из того образа, который вы указываете, создается новый контейнер. Ниже будут рассмотрены более конкретные примеры.

Шаг 1: создание двух контейнеров

Написанная ниже команда docker run создает новый контейнер, который в качестве основания будет использовать образ Ubuntu. Ключ -t предоставит терминал, а -i - возможность взаимодействовать с ним. Для того, чтобы оказаться внутри контейнера, можно использовать стандартную команду bash. То есть вы можете ввести:

$ docker run -ti ubuntu

$ docker run -i -t ubuntu:14.04 /bin/bash

(во втором случае вы запустите команду /bin/bash внутри контейнера и автоматически окажетесь внутри контейнера)

В командной строке появится подтверждение того, что вы находитесь внутри контейнера в качестве суперпользователя. После знака @ вы увидите ID контейнера, в котором находитесь:

Root@11cc47339ee1:/#

Теперь, используя команду echo, внесите изменения в директорию /tmp, а затем проверьте, что изменения были записаны при помощи команды cat:

Echo "Example1" > /tmp/Example1.txt cat /tmp/Example1.txt

На экране вы должны увидеть:

Теперь выйдите из контейнера:

Как только данная команда была выполнена, и вы вышли из командной строки, контейнер Docker перестал работать. Увидеть это вы можете, если используете команду docker ps:

Среди запущенных контейнеров вы не увидите тот, который использовался выше:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Однако вы можете добавить ключ -a для того, чтобы увидеть все контейнеры - как работающие, так и остановленные - и тогда вам высветится контейнер, в котором вы работали ранее:

$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11cc47339ee1 ubuntu "/bin/bash" 9 minutes ago Exited (127) 10 seconds ago small_sinoussi

Когда создается контейнер, у него появляется ID и автоматически сгенерированное название. В данном случае 11cc47339ee1 - это идентификационный номер (ID) контейнера, а small_sinoussi - сгенерированное имя. Команда ps -a показывает эти данные, а также образ, из которого контейнер был создан (в данном случае ubuntu), когда контейнер был создан (9 минут назад), и какая команда была в нем запущена ("/bin/bash”). Также вы можете посмотреть статус контейнера (из него вышли 10 секунд назад). В том случае, если бы контейнер до сих пор работал, вы бы увидели статус "Up" и время, которое он уже работает.

Теперь вы можете еще раз ввести команду для создания контейнера:

$ docker run -ti ubuntu

Несмотря на то, что команда выглядит так же, как и в прошлый раз, она создаст абсолютно новый контейнер - он будет иметь другой идентификационный номер, а если вы попробуете посмотреть содержимое файла Example1, который редактировали ранее, то вы его не найдете.

Root@6e4341887b69:/# cat /tmp/Example1

Вывод будет:

Cat: /tmp/Example1: No such file or directory

Вам может показаться, что данные исчезли, но дело, конечно же, не в этом. Выйдите из второго контейнера, чтобы убедиться, что оба контейнера (в том числе первый с нужным файлом) существуют в системе.

Root@6e4341887b69:/# exit $ docker ps -a

Вывод будет:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg 11cc47339ee1 ubuntu "/bin/bash" 15 minutes ago Exited (127) 6 minutes ago small_sinoussi

Шаг 2: перезапуск первого контейнера

Для того, чтобы заново запустить уже созданный контейнер, необходимо команду start использовать с двумя ключами -ai. В конце вам необходимо написать идентификационный номер контейнера, с которым вы хотите работать, либо его название. В итоге ваша команда будет выглядеть следующим образом:

Docker start -ai 11cc47339ee1

Теперь вы снова находитесь в оболочке bash внутри контейнера и можете убедиться в том, что файл, который вы создавали в начале статьи, все еще находится здесь:

Cat /tmp/Example1.txt

Вы увидите на экране:

Теперь вы можете выйти из контейнера:

Таким образом, все изменения внутри контейнера сохраняются, даже если вы останавливаете и потом заново запускаете контейнер. Данные удаляются лишь в том случае, когда удаляется сам контейнер. Также пример выше показывает, что изменения касаются одного отдельного контейнера (а не всех контейнеров сразу).

Шаг 3: удаление обоих контейнеров

Завершающим шагом будет удаление двух контейнеров, которые вы создали, следуя данному руководству. Для этого необходимо использовать команду docker rm. Однако она действует только на остановленные контейнеры. После команды необходимо указать идентификационный номер либо название одного или нескольких контейнеров. К примеру, чтобы удалять контейнеры, созданные ранее, необходимо ввести команду:

Docker rm 6e4341887b69 small_sinoussi

На экране высветится:

6e4341887b69 small_sinoussi

Теперь оба контейнера были удалены.

Заключение

Из данного руководства вы узнали об основных командах для работы в Docker и научились создавать, останавливать, вновь запускать и удалять контейнеры.

Docker — самая распространенная система контейнеризации, позволяющая запускать необходимое для разработки ПО в контейнерах не устанавливая его на локальную систему. В рамках данного материала разберем docker управление контейнерами.

Docker состоит из нескольких компонентов:
  1. Образ — сконфигурированный разработчиками набор ПО, который скачивается с официального сайта
  2. Контейнер — имплементация образа — сущность на сервере, созданная из него, контейнер не должен быть точной копией и может быть скорректирован используя Dockerfile
  3. Volume — область на диске, которую использует контейнер и в которую сохраняются данные. После удаления контейнера ПО не остается, данные же могут использоваться в будущем

Над всей структурой выстроена особым образом сеть, что позволяет пробрасывать желаемым образом порты и делать контейнер доступным снаружи (по умолчанию он работает на локальном IP адресе) через виртуальный бридж. Контейнер при этом может быть доступен как миру, так и одному адресу.

Docker управление контейнерами: базовые возможности

Установим Docker на Ubuntu или Debian сервер если он еще не установлен по инструкции . Лучше выполнять команды от имени непривилегированного пользователя через sudo

Запуск самого простого контейнера покажет, что все работает

Базовые комагды для управления контейнерами

Вывести все активные контейнеры можно так

С ключем -a будут выведены все контейнеры, в том числе неактивные

Dicker назначает имена контейнерам случайным образом, при необходимости можно указать имя непосредственно

docker run —name hello-world

Запускаем контейнер с именем my-linux-container на основе образа ubuntu и переходим в консоль контейнера указывая оболчку bash

docker run -it —name my-linux-container ubuntu bash

Чтобы выйти из контейнера и вновь оказаться на хост системе нужно выполнить

Все образы, на основе которых создаются контейнеры скачиваются с hub.docker.com автоматически при первом создании контейнера, те, что уже существуют локально можно увидеть выполнив docker images

Создание контейнера из уже скачанного образа будет происходить значительно быстрее (практически мгновенно)

При выходе из контейнера с exit он останавливается, чтобы этого не происходило выходить можно сочетанием клавиш CTRL + A + P

Можно убрать все контейнеры, не являющиеся активными

docker rm $(docker ps -a -f status=exited -q)

Или удалять их по одному

Вместо идентификатора в последней команде можно указать имя

В docker управление контейнерами производится за счет небольшого количества интуативно понятных команд:

docker container start ID

docker container stop ID

docker container restart ID

docker container inspect ID

Последняя особенно полезна, она выводит всю информацию о контейнере, конфигурационных файлах и используемых разделах диска. Весь список команд можно легко найти в помощи или на официальном сайте Docker-а

Создание своего образа Docker и использование Dockerfile

Образы обычно создаются из уже существующих за счет использования дополнительных опций, указанных в Dockerfile

FROM ubuntu
CMD echo «hello world»

Сейчас создается новый образ на основе стандартного с ubuntu

Собираем образ дав ему имя (точка в конце команды означает, что используется текущий каталог, а значит и Dockerfile в нем)

docker build -t my-ubuntu .

docker images теперь покажет и созданный только что образ my-ubuntu

Его можно запустить, в консоль при этом будет выведено hello world и это единственное отличие от дефолтного образа

Обычно нужны более сложные правила, например в образ нам нужно включить python3 — перйдем в новый каталог и создадим Dockerfile

FROM ubuntu
CMD apt-get update && apt-get install python3

Все инструкции записываются в одну строку

docker build -t my-ubuntu-with-python3 .

Запускаем контейнер переходя внутрь

docker run -it my-ubuntu-with-python3 bash

Внутри от имени root нужно выполнить dpkg -l | grep python3 , команда покажет, что пакет присутствие в системе, что означает успех

Мы не раз затрагивали тематику и рассматривали множество систем для их построения. Сегодня мы познакомим еще с одной замечательной системой контейнерами Docker.

Начнем с того, что опишем базовый функционал, который пригодится в дальнейших статьях цикла, и кратко напомним об архитектуре Docker. Docker использует клиент-серверную архитектуру и состоит из клиента – утилиты docker, которая обращается к серверу при помощи RESTful API , и демона в операционной системе Linux (см. рис. 1). Хотя Docker работает и в отличных от Linux ОС, в этой статье они не рассматриваются.

Основные компоненты Docker:
    • Контейнеры – изолированные при помощи технологий операционной системы пользовательские окружения, в которых выполняются приложения. Проще всего дать определение контейнеру Docker как запущенному из образа приложению. Кстати, именно этим идеологически и отличается Docker, например, от LXC (Linux Containers ), хотя они используют одни и те же технологии ядра Linux. Разработчики проекта Docker исповедует принцип: один контейнер – это одно приложение.
    • Образы – доступные только для чтения шаблоны приложений. Поверх существующих образов могут добавляться новые уровни, которые совместно представляют файловую систему, изменяя или дополняя предыдущий уровень. Обычно новый образ создается либо при помощи сохранения уже запущенного контейнера в новый образ поверх существующего, либо при помощи специальных инструкций для утилиты . Для разделения различных уровней контейнера на уровне файловой системы могут использоваться AUFS, btrfs, vfs и Device Mapper . Если предполагается использование Docker совместно с SELinux , то требуется Device Mapper.
    • Реестры (registry) , содержащие репозитории (repository ) образов, – сетевые хранилища образов. Могут быть как приватными, так и общедоступными. Самым известным реестром является .

Для изоляции контейнеров в операционных системах GNU/Linux используются стандартные технологии ядра Linux, такие как:
  • Пространства имен (Linux Namespaces ).
  • Контрольные группы (Cgroups ).
  • Средства управления привилегиями (Linux Capabilities ).
  • Дополнительные, мандатные системы обеспечения безопасности, такие как AppArmor или SELinux.

Рассмотрим перечисленные технологии чуть более подробно.

Механизм контрольных групп (Cgroups) предоставляет инструмент для тонкого контроля над распределением, приоритизацией и управлением системными ресурсами. Контрольные группы реализованы в ядре Linux. В современных дистрибутивах управление контрольными группами реализовано через systemd , однако сохраняется возможность управления при помощи библиотеки libcgroup и утилиты cgconfig . Основные иерархии контрольных групп (их также называют контроллерами) перечислены ниже:

  • blkio – задает лимиты на операции ввода-вывода и на доступ к блочным устройствам;
  • cpu – используя планировщик процессов, распределяет процессорное время между задачами;
  • cpuacct – создает автоматические отчеты по использованию ресурсов центрального процессора. Работает совместно с контроллером cpu , описанным выше;
  • cpuset – закрепляет за задачами определенные процессоры и узлы памяти;
  • devices – регулирует доступ задачам к определенным устройствам;
  • freezer – приостанавливает или возобновляет задачи;
  • memory – устанавливает лимиты и генерирует отчеты об использовании памяти задачами контрольной группы;
  • net_cls – осуществляет тегирование сетевых пакеты идентификатором класса (classid ). Это позволяет контроллеру трафика (команда tc ) и брандмауэру (iptables ) учитывать эти тэги при обработке трафика;
  • perf_event – позволяет производить мониторинг контрольных групп при помощи утилиты perf;
  • hugetlb – позволяет использовать виртуальные страницы памяти большого размера и применять к ним лимиты.

Пространства имен, в свою очередь, контролируют не распределение ресурсов, а доступ к структурам данных ядра. Фактически это означает изоляцию процессов друг от друга и возможность иметь параллельно «одинаковые», но не пересекающиеся друг с другом иерархии процессов, пользователей и сетевых интерфейсов. При желании разные сервисы могут иметь даже свои собственные loopback-интерфейсы .

Примеры пространств имен, используемых Docker:
  • PID, Process ID – изоляция иерархии процессов.
  • NET, Networking – изоляция сетевых интерфейсов.
  • PC, InterProcess Communication – управление взаимодействием между процессами.
  • MNT, Mount – управление точками монтирования.
  • UTS, Unix Timesharing System – изоляция ядра и идентификаторов версии.

Механизм под названием Capabilities позволяет разбить привилегии пользователя root на небольшие группы привилегий и назначать их по отдельности. Данный функционал в GNU/Linux появился начиная с версии ядра 2.2. Изначально контейнеры запускаются уже с ограниченным набором привилегий.

При помощи опций команды docker можете разрешать и запрещать:
  • операции монтирования;
  • доступ к сокетам;
  • выполнение части операций с файловой системой, например изменение атрибутов файлов или владельца.

Подробнее ознакомиться с привилегиями можно при помощи man-страницы CAPABILITIES(7) .

Установка Docker

Рассмотрим установку Docker на примере CentOS. При работе с CentOS у вас есть выбор: использовать последнюю версию из upstream или версию, собранную проектом CentOS с дополнениями Red Hat. Описание изменений доступно на странице.

В основном это обратное портирование исправлений из новых версий upstream и изменения, предложенные разработчиками Red Hat, но пока не принятые в основной код. Наиболее заметным различием на момент написания статьи было то, что в новых версиях сервис docker был разделен на три части: демон docker, containerd и runc . Red Hat пока не считает, что это изменение стабильно, и поставляет монолитный исполнимый файл версии 1.10.

Настройки репозитория для установки upstream-версии , как и инструкции для инсталляции в других дистрибутивах и ОС, приведены в руководстве по инсталляции на официальном сайте . В частности, настройки для репозитория CentOS 7:

# cat /etc/yum.repos.d/docker.repo name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg

# cat /etc/yum.repos.d/docker.repo

name = Repository

baseurl = https : / / yum .dockerproject .org / repo / main / centos / 7

enabled = 1

gpgcheck = 1 gpgkey = https : / / yum .dockerproject .org / gpg

Устанавливаем необходимые пакеты на и запускаем и включаем сервис:

# yum install -y docker-engine # systemctl start docker.service # systemctl enable docker.service

# yum install -y docker-engine

# systemctl start docker.service

# systemctl enable docker.service

Проверяем статус сервиса:

# systemctl status docker.service

# systemctl status docker.service

Также можно посмотреть системную информацию о Docker и окружении:

# docker info

При запуске аналогичной команды в случае установки Docker из репозиториев CentOS увидите незначительные отличия, обусловленные использованием более старой версии программного обеспечения. Из вывода docker info можем узнать, что в качестве драйвера для хранения данных используется Device Mapper , а в качестве хранилища – файл в /var/lib/docker/:

# ls -lh /var/lib/docker/devicemapper/devicemapper/data -rw-------. 1 root root 100G Dec 27 12:00 /var/lib/docker/ devicemapper/devicemapper/data

# ls -lh /var/lib/docker/devicemapper/devicemapper/data

Rw -- -- -- - . 1 root root 100G Dec 27 12 : 00 / var / lib / / devicemapper / devicemapper / data

Опции запуска демона, как это обычно бывает в CentOS, хранятся в /etc/sysconfig/ . В данном случае имя файла docker. Соответствующая строчка /etc/sysconfig/docker , описывающая опции:

OPTIONS="--selinux-enabled --log-driver=journald"

Если бы вы запустили команду docker не пользователем root и не пользователем, входящим в группу docker, вы бы увидели подобную ошибку:

$ docker search mysql

$ search mysql

Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon. Is the docker daemon running on this host?). Using system default: https://index. docker.io/v1/

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Обратите внимание, что фактически включение пользователя в группу docker равносильно включению этого пользователя в группу root.

У разработчиков RHEL/CentOS несколько иной подход к безопасности демона Docker, чем у разработчиков самого Docker из upstream. Подробнее о подходе Red Hat написано в статье разработчика дистрибутива RHEL Дэна Уолша .

Если же вы хотите «стандартное» поведение Docker, установленного из репозиториев CentOS (т.е. описанное в официальной документации), то необходимо создать группу docker и добавить в опции запуска демона:

OPTIONS="--selinux-enabled --log-driver=journald ↵ --group=docker"

OPTIONS = "--selinux-enabled --log-driver=journald ↵ --group=docker"

После чего рестартуем сервис и проверяем, что файл сокета docker принадлежит группе docker, а не root:

# ls -l /var/run/docker.sock

Поиск образов и тэги Docker

Попробуем найти контейнер на Docker Hub.

$ docker search haproxy

$ search haproxy


В данном выводе мы получили список ряда образов HA Proxy. Самый верхний элемент списка – это HA Proxy из официального репозитория. Такие образы отличаются тем, что в имени отсутствует символ «/» , отделяющий имя репозитория пользователя от имени самого контейнера. В примере за официальным показаны два образа haproxy из открытых репозиториев пользователей eeacms и million12.

Образы, подобные двум нижним, можете создать сами, зарегистрировавшись на Docker Hub. Официальные же поддерживаются специальной командой, спонсируемой Docker, Inc. Особенности официального репозитория:

  • Это рекомендованные к использованию образы, созданные с учетом лучших рекомендаций и практик.
  • Они представляют собой базовые образы, которые могут стать отправной точкой для более тонкой настройки. Например, базовые образы Ubuntu, CentOS или библиотек и сред разработки.
  • Содержат последние версии программного обеспечения с устраненными уязвимостями.
  • Это официальный канал распространения продуктов. Чтобы искать только официальные образы, можете использовать опцию –filter “is-official=true” команды docker search .

Число звезд в выводе команды docker search соответствует популярности образа. Это аналог кнопки Like в социальных сетях или закладок для других пользователей. Automated означает, что образ собирается автоматически из специального сценария средствами Docker Hub. Обычно следует отдавать предпочтение автоматически собираемым образам вследствие того, что его содержимое может быть проверено знакомством с соответствующим файлом .

Скачаем официальный образ HA Proxy:

$ docker pull haproxy Using default tag: latest

Полное имя образа может выглядеть следующим образом:

[имя пользователя]имя образа[:тэг]

Просмотреть список скаченных образов можно командой docker images:

Запуск контейнеров

Для запуска контейнера не обязательно предварительно скачивать образ. Если он доступен, то будет загружен автоматически. Давайте попробуем запустить контейнер с Ubuntu. Мы не будем указывать репозиторий, и будет скачан последний официальный образ, поддерживаемый Canonical.

$ docker run -it ubuntu root@d7402d1f7c54:/#

$ run - it ubuntu

root @ d7402d1f7c54 : / #

Помимо команды run , мы указали две опции: -i – контейнер должен запуститься в интерактивном режиме и -t – должен быть выделен псевдотерминал. Как видно из вывода, в контейнере мы имеем привилегии пользователя root, а в качестве имени узла отображается идентификатор контейнера. Последнее может быть справедливо не для всех контейнеров и зависит от разработчика контейнера. Проверим, что это действительно окружение Ubuntu:

root@d7402d1f7c54:/# cat /etc/*release | grep DISTRIB_DESCRIPTION DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

root @ d7402d1f7c54 : / # cat /etc/*release | grep DISTRIB_DESCRIPTION

DISTRIB_DESCRIPTION = "Ubuntu 16.04.1 LTS"

Команду uname -a для подобных целей использовать не получится, поскольку контейнер работает с ядром хоста.

В качестве одной из опций можно было бы задать уникальное имя контейнера, на которое можно для удобства ссылаться, помимо ID-контейнера. Она задается как –name <имя>. В случае если опция опущена, имя генерируется автоматически.

Автоматически генерируемые имена контейнеров не несут смысловой нагрузки, однако как интересный факт можно отметить, что имена генерируются случайным образом из прилагательного и имени известного ученого, изобретателя или хакера. В коде генератора для каждого имени можно найти краткое описание того, чем известен данный деятель.

Посмотреть список запущенных контейнеров можно командой . Для этого откроем второй терминал:

Однако если отдать команду , контейнера, созданного из образа mysql, мы не обнаружим. Воспользуемся опцией -a , которая показывает все контейнеры, а не только запущенные:

Очевидно, что при запуске контейнера не были указаны обязательные параметры. Ознакомиться с описанием переменных среды, необходимых для запуска контейнера, можно, найдя официальный образ MySQL на Docker Hub. Повторим попытку, используя опцию -e , которая задает переменные окружения в контейнере:

$ docker run --name mysql-test ↵ -e MYSQL_ROOT_PASSWORD=docker -d mysql

Последним параметром выступает команда, которую мы хотим исполнить внутри контейнера. В данном случае это командный интерпретатор Bash . Опции -it аналогичны по назначению использованным ранее в команде docker run.

Фактически после запуска этой команды в контейнер mysql-test добавляется еще один процесс – bash . Это можно наглядно увидеть при помощи команды pstree. Сокращенный вывод до команды docker exec: