Как использовать команду docker container run для управления контейнерами

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы получите практический опыт использования команды docker container run для эффективного управления контейнерами. Вы научитесь запускать контейнеры в detached mode (фоновом режиме) для выполнения в фоновом режиме и назначать пользовательские имена для удобства идентификации.

Кроме того, вы изучите, как подключаться к работающим контейнерам с сохранением STDIN открытым, публиковать порты контейнера на хосте для внешнего доступа, монтировать volumes (тома) для обеспечения сохранности данных, а также настраивать контейнеры путем установки environment variables (переменных окружения) и добавления host entries (записей хоста). Эти базовые навыки необходимы для создания и управления Docker-приложениями.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/attach("Attach to Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/run -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/ps -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/stop -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/rm -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/attach -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/exec -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/pull -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} docker/volume -.-> lab-555121{{"Как использовать команду docker container run для управления контейнерами"}} end

Запуск контейнера в detached mode с назначением имени

На этом шаге вы узнаете, как запустить Docker-контейнер в detached mode (фоновом режиме) и назначить ему пользовательское имя. Запуск контейнера в detached mode означает, что контейнер будет работать в фоновом режиме, и вы не увидите его вывод напрямую в терминале. Назначение имени упрощает идентификацию и управление контейнером в дальнейшем.

Сначала загрузим образ hello-world. Это очень маленький образ, который полезен для проверки корректной работы Docker.

docker pull hello-world

Вы должны увидеть вывод, указывающий на загрузку образа, а затем сообщение об успешном завершении.

Теперь запустим контейнер hello-world в detached mode. Мы используем флаг -d для detached mode и флаг --name для назначения имени. Назовем этот контейнер my-hello-world.

docker run -d --name my-hello-world hello-world

После выполнения этой команды Docker выведет длинную строку символов — это ID контейнера. Это означает, что контейнер запущен в фоновом режиме.

Чтобы убедиться, что контейнер работает, можно использовать команду docker ps. Эта команда выводит список всех запущенных контейнеров.

docker ps

Вы должны увидеть список запущенных контейнеров, и один из них должен называться my-hello-world. В колонке STATUS будет указано, что контейнер завершил работу несколько секунд назад. Контейнер hello-world предназначен для кратковременного запуска, вывода сообщения и завершения. Несмотря на то, что он завершил работу, он все равно отображается в docker ps, так как был запущен в detached mode.

Чтобы увидеть все контейнеры, включая завершенные, используйте команду docker ps -a.

docker ps -a

В списке будет отображен my-hello-world вместе с его статусом (Exited).

Подключение к работающему контейнеру с сохранением STDIN открытым

На этом шаге вы научитесь подключаться к работающему контейнеру с сохранением стандартного ввода (STDIN) открытым. Это полезно для взаимодействия с контейнером, в котором выполняется процесс, ожидающий ввода данных, например, командная оболочка.

В предыдущем шаге мы запускали контейнер hello-world, который сразу завершал работу. Для демонстрации подключения нам нужен контейнер, который продолжает работать. Простой способ сделать это — запустить интерактивную оболочку в контейнере.

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

docker pull ubuntu

Теперь запустим контейнер ubuntu в detached mode (-d), выделим псевдо-TTY (-t) и сохраним STDIN открытым (-i). Также присвоим ему имя my-ubuntu. Командой внутри контейнера будет /bin/bash — путь к оболочке Bash.

docker run -itd --name my-ubuntu ubuntu /bin/bash

Флаг -i сохраняет STDIN открытым, позволяя отправлять ввод в контейнер. Флаг -t выделяет псевдо-TTY, что необходимо для интерактивных сессий оболочки. Флаг -d запускает контейнер в фоновом режиме.

Вы должны увидеть ID контейнера, что означает его работу в фоне.

Теперь подключимся к работающему контейнеру my-ubuntu с помощью команды docker attach.

docker attach my-ubuntu

После выполнения команды вы увидите приглашение оболочки Bash внутри контейнера ubuntu. Теперь вы подключены к стандартным потокам ввода, вывода и ошибок контейнера.

Можно взаимодействовать с оболочкой контейнера. Например, выполнить команду ls для просмотра файлов в текущей директории.

ls

Вы увидите содержимое корневой директории (/) контейнера Ubuntu.

Чтобы отключиться от контейнера без его остановки, используйте комбинацию клавиш: CTRL+p, затем CTRL+q. Попробуйте нажать эту комбинацию сейчас.

Вы вернётесь в терминал хоста, а контейнер продолжит работу в фоне. Это можно проверить командой docker ps.

docker ps

Контейнер my-ubuntu будет отображаться как работающий.

Если просто нажать CTRL+c при подключении, сигнал будет отправлен процессу внутри контейнера (оболочке Bash), что, скорее всего, остановит контейнер. Комбинация CTRL+p+CTRL+q — стандартный способ отключения без остановки.

Публикация портов контейнера на хосте

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

Сначала остановим и удалим контейнер my-ubuntu из предыдущего шага, чтобы избежать конфликтов.

docker stop my-ubuntu
docker rm my-ubuntu

После каждой команды вы должны увидеть имя контейнера, подтверждающее его остановку и удаление.

Теперь мы запустим простой веб-сервер внутри контейнера и опубликуем его порт на хосте. Мы будем использовать образ nginx — популярного веб-сервера.

Загрузим образ nginx:

docker pull nginx

Теперь запустим контейнер nginx в фоновом режиме (-d) и опубликуем порт 80 контейнера на порту 8080 хоста. Используем флаг -p для публикации портов в формате хост_порт:контейнер_порт. Также присвоим контейнеру имя my-nginx.

docker run -d --name my-nginx -p 8080:80 nginx

Часть -p 8080:80 сопоставляет порт 80 внутри контейнера (где Nginx слушает по умолчанию) с портом 8080 на вашей хост-машине.

Вы должны увидеть ID контейнера, что означает его работу в фоновом режиме.

Чтобы проверить корректность публикации порта и доступность веб-сервера, используйте команду curl на хосте для обращения к localhost на порту 8080:

curl http://localhost:8080

В выводе терминала вы должны увидеть HTML-страницу приветствия Nginx. Это подтверждает, что вы можете получить доступ к веб-серверу Nginx внутри контейнера через порт 8080 на хосте.

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

docker ps

В выводе вы должны увидеть контейнер my-nginx, а в колонке PORTS — запись 0.0.0.0:8080->80/tcp, указывающую на сопоставление порта 80 контейнера с портом 8080 на всех интерфейсах хоста.

Подключение тома для сохранения данных

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

Сначала остановим и удалим контейнер my-nginx из предыдущего шага:

docker stop my-nginx
docker rm my-nginx

Теперь создадим том Docker. Тома управляются Docker и хранятся в выделенной области на хосте:

docker volume create my-volume

Вы должны увидеть имя тома (my-volume), подтверждающее его создание.

Список существующих томов можно просмотреть командой:

docker volume ls

В списке должен отображаться том my-volume.

Теперь запустим новый контейнер nginx и подключим том my-volume к стандартной веб-директории Nginx (/usr/share/nginx/html). Это означает, что любые файлы в этой директории контейнера будут фактически храниться в томе my-volume на хосте.

Запустим контейнер в фоновом режиме (-d), опубликуем порт 80 контейнера на порт 8081 хоста (-p 8081:80), присвоим имя (my-nginx-volume) и используем флаг -v для подключения тома. Формат подключения именованного тома: имя_тома:путь_в_контейнере.

docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx

Вы должны увидеть ID контейнера, подтверждающий его запуск.

Теперь создадим простой HTML-файл в подключенном томе, выполнив команду внутри контейнера:

docker exec my-nginx-volume sh -c 'echo "<h1>Hello from the volume!</h1>" > /usr/share/nginx/html/index.html'

Эта команда создает файл index.html с содержимым <h1>Hello from the volume!</h1>.

Проверим доступность веб-сервера на порту 8081:

curl http://localhost:8081

В выводе должно отображаться <h1>Hello from the volume!</h1>, что подтверждает работу с файлом в подключенном томе.

Для демонстрации сохранности данных остановим и удалим контейнер:

docker stop my-nginx-volume
docker rm my-nginx-volume

Теперь запустим новый контейнер с тем же томом, назвав его my-nginx-volume-new и опубликовав порт 80 на порт 8082 хоста:

docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx

Проверим доступность сервера на порту 8082:

curl http://localhost:8082

Вы по-прежнему должны видеть <h1>Hello from the volume!</h1>, так как файл сохранился в томе my-volume независимо от контейнера.

Это демонстрирует преимущество томов для сохранения данных независимо от жизненного цикла контейнеров.

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

На этом шаге вы узнаете, как устанавливать переменные окружения для Docker-контейнера и добавлять пользовательские записи в файл /etc/hosts контейнера. Переменные окружения — это распространённый способ настройки приложений, работающих в контейнерах, а добавление записей в hosts может быть полезно для обнаружения сервисов или переопределения DNS-разрешения внутри контейнера.

Сначала остановим и удалим контейнер my-nginx-volume-new из предыдущего шага:

docker stop my-nginx-volume-new
docker rm my-nginx-volume-new

Теперь запустим простой контейнер и установим переменную окружения. Снова используем образ ubuntu и выполним команду, которая выводит значение переменной окружения. Установим переменную MY_VARIABLE со значением hello_docker, используя флаг -e в формате ИМЯ_ПЕРЕМЕННОЙ=значение:

docker run --rm -e MY_VARIABLE=hello_docker ubuntu env | grep MY_VARIABLE

В этой команде:

  • --rm автоматически удаляет контейнер после завершения
  • -e MY_VARIABLE=hello_docker устанавливает переменную окружения внутри контейнера
  • ubuntu — используемый образ
  • env — команда для вывода всех переменных окружения
  • | grep MY_VARIABLE фильтрует вывод, показывая только строку с MY_VARIABLE

В выводе терминала вы должны увидеть MY_VARIABLE=hello_docker, что подтверждает успешную установку переменной.

Теперь добавим пользовательскую запись в файл /etc/hosts контейнера. Это полезно, когда нужно, чтобы контейнер разрешал определённое имя хоста в конкретный IP-адрес без использования внешнего DNS. Используем флаг --add-host в формате имя_хоста:IP_адрес.

Запустим контейнер ubuntu, добавив запись, которая сопоставляет имя my-service с IP-адресом 192.168.1.100, затем проверим содержимое файла /etc/hosts:

docker run --rm --add-host my-service:192.168.1.100 ubuntu cat /etc/hosts | grep my-service

В этой команде:

  • --rm удаляет контейнер после завершения
  • --add-host my-service:192.168.1.100 добавляет запись в файл hosts контейнера
  • ubuntu — используемый образ
  • cat /etc/hosts выводит содержимое файла hosts
  • | grep my-service фильтрует вывод для поиска записи my-service

В выводе вы должны увидеть строку вида 192.168.1.100 my-service, что подтверждает добавление записи.

При необходимости можно комбинировать установку переменных окружения и добавление записей в hosts в одной команде docker run.

Итоги

В этой лабораторной работе вы научились использовать команду docker run для управления контейнерами. Вы начали с запуска контейнера в фоновом режиме с помощью флага -d и присвоения ему пользовательского имени через флаг --name, проверяя его статус командами docker ps и docker ps -a.

Затем вы изучили:

  • Как подключиться к работающему контейнеру с сохранением STDIN
  • Публикацию портов контейнера на хост через флаг -p для обеспечения сетевой доступности
  • Подключение томов с помощью флага -v для сохранения данных после завершения работы контейнера
  • Настройку окружения контейнера через установку переменных окружения флагом -e
  • Добавление записей в hosts через флаг --add-host