Docker – это популярный инструмент, который с помощью контейнеров предоставляет все необходимое для запуска приложений. Используя 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
На экране вы должны увидеть:
Example1
Теперь выйдите из контейнера:
exit
Как только данная команда будет выполнена, а вы выйдете из командной строки, контейнер Docker перестанет работать. Проверить это можно командой docker ps:
$ 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
Вы увидите на экране:
Example1
Теперь вы можете выйти из контейнера:
exit
Все изменения внутри контейнера сохраняются, даже если вы останавливаете и потом заново запускаете контейнер. Данные удаляются лишь в том случае, если удаляется сам контейнер. Также пример выше показывает, что изменения касаются одного отдельного контейнера (а не всех контейнеров сразу).
Шаг 3: Удаление обоих контейнеров
Завершающим шагом будет удаление двух контейнеров, которые вы создали, следуя данному руководству. Для этого необходимо использовать команду docker rm. Однако она действует только на остановленные контейнеры. После команды необходимо указать идентификационный номер либо название одного или нескольких контейнеров. К примеру, чтобы удалить контейнеры, созданные ранее, необходимо ввести команду:
docker rm 6e4341887b69 small_sinoussi
На экране высветится:
6e4341887b69 small_sinoussi
Оба контейнера будут удалены.
Заключение
Из данного руководства вы узнали об основных командах для работы в Docker и научились создавать, останавливать, вновь запускать и удалять контейнеры.
Комментарии
А как выйти из bash не выключая контейнер?