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

Введение

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

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

Обзор

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

Изображения оживают с помощью команды docker run, которая создает контейнер, добавляя слой для чтения и записи поверх изображения. Это сочетание слоев только для чтения с верхним слоем для чтения и записи известно как объединенная файловая система. Когда в работающем контейнере вносится изменение в существующий файл, файл копируется из области только для чтения в слой для чтения и записи, где применяются изменения. Версия в слое для чтения и записи скрывает исходный файл, но не удаляет его. Изменения в слое для чтения и записи существуют только в рамках отдельного экземпляра контейнера. При удалении контейнера все изменения теряются, если не предприняты меры для их сохранения.

Как работать с контейнерами Docker

  1. Создание двух контейнеров Docker
  2. Перезапуск первого контейнера
  3. Удаление обоих контейнеров

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

При каждом использовании команды docker run создается новый контейнер из указанного вами образа. Это может вызывать путаницу, поэтому давайте рассмотрим несколько примеров:

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

Следующая команда docker run создаст новый контейнер, используя базовый образ ubuntu. Флаг -t предоставит нам терминал, а -i позволит взаимодействовать с ним. Мы будем использовать стандартную команду в Docker-файле базового образа Ubuntu, bash, чтобы попасть в оболочку.

  1. docker run -ti ubuntu

Приглашение командной строки изменится, указывая, что мы находимся внутри контейнера как пользователь root, за которым следует идентификатор контейнера из 12 символов.

Мы внесем изменение, выполнив вывод некоторого текста в каталог /tmp контейнера, а затем воспользуемся командой cat, чтобы проверить, что изменения успешно сохранены.

  1. echo "Example1" > /tmp/Example1.txt
  2. cat /tmp/Example1.txt
Output
Example1

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

  1. exit

Контейнеры Docker прекращают свою работу сразу после выполнения команды, которую они запустили, поэтому наш контейнер остановился, когда мы вышли из оболочки bash. Если мы запустим docker ps, команду для отображения работающих контейнеров, мы не увидим нашего.

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Если мы добавим флаг -a, который показывает все контейнеры, остановленные или работающие, то наш контейнер появится в списке:

  1. docker ps -a
Output
CONTAINER 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”, за которым следовало бы время его работы.

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

  1. docker run -ti ubuntu

Мы можем определить, что это новый контейнер, потому что ID в приглашении командной строки отличается, и когда мы ищем наш файл Example1, мы его не найдем:

  1. cat /tmp/Example1
Output
cat: /tmp/Example1: No such file or directory

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

  1. exit

Когда мы снова перечислим контейнеры, оба они появятся:

  1. docker ps -a
Output
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" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi

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

Чтобы перезапустить существующий контейнер, мы будем использовать команду start с флагом -a для присоединения к нему и флагом -i для включения интерактивного режима, а затем указываем либо идентификатор, либо имя контейнера. Убедитесь, что заменили идентификатор вашего контейнера в команде ниже:

  1. docker start -ai 11cc47339ee1

Мы снова находимся в командной строке оболочки контейнера, и когда мы выполняем команду cat для файла, который мы ранее создали, он все еще там.

  1. cat /tmp/Example1.txt
Output
Example1

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

  1. exit

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

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

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

  1. docker rm 11cc47339ee1 kickass_borg
Output
11cc47339ee1 kickass_borg

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

Вывод

Мы подробно рассмотрели команду docker run, чтобы увидеть, как она автоматически создает новый контейнер при каждом запуске. Мы также видели, как найти остановленный контейнер, запустить его и подключиться к нему. Если вы хотите узнать больше о управлении контейнерами, вам может быть интересен руководство Названия контейнеров Docker: 3 совета для начинающих.

Source:
https://www.digitalocean.com/community/tutorials/working-with-docker-containers