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

Вступление

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

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

обзор

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

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

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

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

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

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

docker run -ti ubuntu

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

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

echo "Example1" > /tmp/Example1.txt
cat /tmp/Example1.txt
OutputExample1

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

exit

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

docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

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

docker ps -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 +), когда был создан контейнер (+ шесть минут назад +), и команду, которая была в нем запущена ( '+ / бен / Баш + ). Выходные данные также предоставляют состояние контейнера (+ Exited +) и то, как давно контейнер перешел в это состояние (+6 секунд назад +`). Если бы контейнер все еще работал, мы бы увидели статус «Вверх», а затем - как долго он работал.

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

docker run -ti ubuntu

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

cat /tmp/Example1
Outputcat: /tmp/Example1: No such file or directory

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

exit

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

docker ps -a
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 +, чтобы сделать его интерактивным, за которым следует либо идентификатор контейнера, либо имя. Обязательно укажите идентификатор вашего контейнера в приведенной ниже команде:

docker start -ai

Мы снова попадаем в приглашение bash контейнера, и когда мы + cat + файл, который мы создали ранее, он все еще там.

cat /tmp/Example1.txt
OutputExample1

Мы можем выйти из контейнера сейчас:

exit

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

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

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

docker rm 11cc47339ee1 kickass_borg
Output11cc47339ee1
kickass_borg

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

Заключение

Мы подробно рассмотрели команду + docker run +, чтобы увидеть, как она автоматически создает новый контейнер при каждом запуске. Мы также видели, как найти остановленный контейнер, запустить его и подключиться к нему. Если вы хотите узнать больше об управлении контейнерами, вас может заинтересовать руководство, https://www.digitalocean.com/community/tutorials/naming-docker-containers-3-tips-for-beginners[Naming Docker Контейнеры: 3 подсказки для начинающих.