Введение
Docker – популярный инструмент контейнеризации, используемый для предоставления программным приложениям файловой системы, содержащей все необходимое для их запуска. Использование контейнеров Docker гарантирует, что программное обеспечение будет вести себя одинаково вне зависимости от того, где оно развернуто, потому что его окружение выполнения безжалостно согласовано.
В этом руководстве мы предоставим краткий обзор отношений между образами Docker и контейнерами Docker. Затем мы более подробно рассмотрим, как запускать, запускать, останавливать и удалять контейнеры.
Обзор
Мы можем рассматривать образ Docker как инертный шаблон, используемый для создания контейнеров Docker. Образы обычно начинаются с корневой файловой системы и добавляют изменения файловой системы и их соответствующие параметры выполнения в упорядоченные, доступные только для чтения слои. В отличие от типичного дистрибутива Linux, образ Docker обычно содержит только необходимый минимум для запуска приложения. Образы не имеют состояния и не изменяются. Вместо этого они являются отправной точкой для контейнеров Docker.
Изображения оживают с помощью команды docker run
, которая создает контейнер, добавляя слой для чтения и записи поверх изображения. Это сочетание слоев только для чтения с верхним слоем для чтения и записи известно как объединенная файловая система. Когда в работающем контейнере вносится изменение в существующий файл, файл копируется из области только для чтения в слой для чтения и записи, где применяются изменения. Версия в слое для чтения и записи скрывает исходный файл, но не удаляет его. Изменения в слое для чтения и записи существуют только в рамках отдельного экземпляра контейнера. При удалении контейнера все изменения теряются, если не предприняты меры для их сохранения.
Как работать с контейнерами Docker
Работа с контейнерами
При каждом использовании команды docker run
создается новый контейнер из указанного вами образа. Это может вызывать путаницу, поэтому давайте рассмотрим несколько примеров:
Шаг 1: Создание двух контейнеров
Следующая команда docker run
создаст новый контейнер, используя базовый образ ubuntu
. Флаг -t
предоставит нам терминал, а -i
позволит взаимодействовать с ним. Мы будем использовать стандартную команду в Docker-файле базового образа Ubuntu, bash
, чтобы попасть в оболочку.
Приглашение командной строки изменится, указывая, что мы находимся внутри контейнера как пользователь root, за которым следует идентификатор контейнера из 12 символов.
Мы внесем изменение, выполнив вывод некоторого текста в каталог /tmp
контейнера, а затем воспользуемся командой cat
, чтобы проверить, что изменения успешно сохранены.
OutputExample1
Теперь давайте выйдем из контейнера.
Контейнеры Docker прекращают свою работу сразу после выполнения команды, которую они запустили, поэтому наш контейнер остановился, когда мы вышли из оболочки bash. Если мы запустим docker ps
, команду для отображения работающих контейнеров, мы не увидим нашего.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Если мы добавим флаг -a
, который показывает все контейнеры, остановленные или работающие, то наш контейнер появится в списке:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
Когда контейнер был создан, ему был присвоен его идентификатор контейнера и случайно сгенерированное имя. В данном случае 11cc47339ee1 является идентификатором контейнера, а small_sinoussi
– случайно сгенерированным именем. ps -a
показывает эти значения, а также образ, из которого был создан контейнер (ubuntu
), время создания контейнера (шесть минут назад
) и команду, которая была выполнена в нем (/bin/bash
). Вывод также предоставляет статус контейнера (Exited
) и время, прошедшее с момента входа контейнера в этот статус (6 секунд назад
). Если контейнер все еще работал, мы увидели бы статус “Up”, за которым следовало бы время его работы.
Если мы снова выполним ту же команду, будет создан совершенно новый контейнер:
Мы можем определить, что это новый контейнер, потому что ID в приглашении командной строки отличается, и когда мы ищем наш файл Example1, мы его не найдем:
Outputcat: /tmp/Example1: No such file or directory
Это может показаться, что данные исчезли, но это не так. Мы выйдем из второго контейнера, чтобы увидеть, что он и наш первый контейнер с файлом, который мы создали, оба находятся в системе.
Когда мы снова перечислим контейнеры, оба они появятся:
OutputCONTAINER 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" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
Шаг 2: Перезапуск первого контейнера
Чтобы перезапустить существующий контейнер, мы будем использовать команду start
с флагом -a
для присоединения к нему и флагом -i
для включения интерактивного режима, а затем указываем либо идентификатор, либо имя контейнера. Убедитесь, что заменили идентификатор вашего контейнера в команде ниже:
Мы снова находимся в командной строке оболочки контейнера, и когда мы выполняем команду cat
для файла, который мы ранее создали, он все еще там.
OutputExample1
Теперь мы можем выйти из контейнера:
Этот вывод показывает, что изменения, внесенные внутри контейнера, сохраняются при его остановке и повторном запуске. Только когда контейнер удаляется, содержимое удаляется. Этот пример также иллюстрирует, что изменения были ограничены индивидуальным контейнером. Когда мы запустили второй контейнер, он отражал первоначальное состояние образа.
Шаг 3: Удаление обоих контейнеров
Мы создали два контейнера, и завершим наш краткий учебник, удалив их. Команда docker rm
, которая работает только с остановленными контейнерами, позволяет указать имя или идентификатор одного или нескольких контейнеров, поэтому мы можем удалить оба следующим образом:
Output11cc47339ee1
kickass_borg
Оба контейнера и все изменения, которые мы внесли внутри них, теперь исчезли.
Вывод
Мы подробно рассмотрели команду docker run
, чтобы увидеть, как она автоматически создает новый контейнер при каждом запуске. Мы также видели, как найти остановленный контейнер, запустить его и подключиться к нему. Если вы хотите узнать больше о управлении контейнерами, вам может быть интересен руководство Названия контейнеров Docker: 3 совета для начинающих.
Source:
https://www.digitalocean.com/community/tutorials/working-with-docker-containers