Skip to content

Основы Docker: Контейнеры (Containers)

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

Основные характеристики Docker Containers

  • Изоляция (Isolation): Контейнеры запускаются в изолированной среде, называемой контейнеризацией. Это означает, что процессы внутри контейнера не могут напрямую взаимодействовать с процессами в других контейнерах или на хост-машине (за исключением явно настроенных взаимодействий, например, через сеть или тома).
  • Легковесность (Lightweight): Контейнеры используют ядро операционной системы хост-машины и совместно используют общие библиотеки (если это возможно), что делает их гораздо легче и быстрее в запуске по сравнению с виртуальными машинами.
  • Переносимость (Portability): Поскольку контейнер содержит все зависимости приложения, его можно запускать на любой системе, где установлен Docker, независимо от базовой операционной системы.
  • Жизненный цикл (Lifecycle): Контейнеры имеют определенный жизненный цикл: создание, запуск, остановка, перезапуск, удаление.

Управление контейнерами Docker

Вы можете управлять контейнерами Docker с помощью команды docker container (или просто docker).

Просмотр списка запущенных контейнеров

bash
docker ps
docker container ls

Эти команды выводят список всех запущенных контейнеров, включая их ID контейнера, образ, команду, статус, порты и имена.

  • CONTAINER ID: Уникальный идентификатор контейнера.
  • IMAGE: Образ, на основе которого был создан контейнер.
  • COMMAND: Команда, выполняющаяся внутри контейнера.
  • CREATED: Время создания контейнера.
  • STATUS: Текущий статус контейнера (например, Up, Exited).
  • PORTS: Информация о опубликованных портах контейнера.
  • NAMES: Автоматически сгенерированное или заданное пользователем имя контейнера.

Просмотр всех контейнеров (включая остановленные)

bash
docker ps -a
docker container ls -a

Запуск контейнера

Для запуска контейнера из Docker-образа используется команда docker run:

bash
docker run <image_name>
docker run [OPTIONS] <image_name> [COMMAND] [ARG...]

Некоторые полезные опции docker run:

  • --name <container_name>: Задает имя для контейнера. Если не указано, Docker сгенерирует случайное имя.
  • -d или --detach: Запускает контейнер в фоновом режиме (detached).
  • -p <host_port>:<container_port>: Публикует порт контейнера на порт хост-машины.
  • -v <host_path>:<container_path> или -v <volume_name>:<container_path>: Монтирует том (bind mount или именованный том) в контейнер.
  • -e <VARIABLE>=<value>: Устанавливает переменные окружения внутри контейнера.
  • --network <network_name>: Подключает контейнер к указанной сети Docker.
  • --rm: Автоматически удаляет контейнер после его остановки.

Примеры запуска контейнеров:

bash
docker run --name my-nginx -p 8080:80 -d nginx:latest # Запуск Nginx на порту 8080 хоста в фоне
docker run --name my-ubuntu -it ubuntu:latest /bin/bash # Запуск интерактивной сессии bash в контейнере Ubuntu
docker run --name my-app -v my-data:/app/data my-app-image # Запуск приложения с монтированным томом
docker run --name db --network my-network -e MYSQL_ROOT_PASSWORD=secret mysql:latest # Запуск MySQL в определенной сети с переменной окружения

Остановка контейнера

Для остановки запущенного контейнера используется команда docker stop:

bash
docker stop <container_id_or_name>

Эта команда отправляет сигнал SIGTERM процессу внутри контейнера и дает ему некоторое время на корректное завершение работы (по умолчанию 10 секунд).

Принудительная остановка контейнера

Если контейнер не отвечает на сигнал SIGTERM, вы можете принудительно остановить его с помощью команды docker kill:

bash
docker kill <container_id_or_name>

Эта команда отправляет сигнал SIGKILL, который немедленно завершает процесс контейнера.

Перезапуск контейнера

Для перезапуска остановленного или работающего контейнера используется команда docker restart:

bash
docker restart <container_id_or_name>

Присоединение к работающему контейнеру

Чтобы взаимодействовать с процессом, запущенным в контейнере (например, получить доступ к интерактивной оболочке), используется команда docker attach:

bash
docker attach <container_id_or_name>

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

Для интерактивных сессий лучше использовать docker exec -it <container_id_or_name> <command>, как показано в примере запуска Ubuntu выше. docker exec запускает новую команду в уже работающем контейнере.

Выполнение команд в работающем контейнере

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

bash
docker exec [OPTIONS] <container_id_or_name> <command> [ARG...]

Полезные опции docker exec:

  • -i или --interactive: Поддерживает интерактивный ввод/вывод.
  • -t или --tty: Выделяет псевдотерминал.

Примеры использования docker exec:

bash
docker exec my-nginx ls /usr/share/nginx/html # Просмотр содержимого директории в контейнере Nginx
docker exec -it my-ubuntu /bin/bash # Запуск интерактивной оболочки bash в работающем контейнере Ubuntu
docker exec my-app php artisan migrate # Выполнение миграций Laravel внутри контейнера приложения

Просмотр логов контейнера

Для просмотра стандартного вывода и ошибок контейнера используется команда docker logs:

bash
docker logs <container_id_or_name>
docker logs -f <container_id_or_name> # Следить за логами в реальном времени (как tail -f)

Копирование файлов из/в контейнер

Для копирования файлов между хост-машиной и контейнером используется команда docker cp:

bash
docker cp <container_id_or_name>:<path_in_container> <host_path>
docker cp <host_path> <container_id_or_name>:<path_in_container>

Примеры:

bash
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf # Копирование файла из контейнера на хост
docker cp ./my-app.log my-app:/var/log/ # Копирование файла с хоста в контейнер

Удаление контейнера

Для удаления остановленного контейнера используется команда docker rm:

bash
docker rm <container_id_or_name>

Чтобы принудительно удалить работающий контейнер, используйте флаг -f или --force:

bash
docker rm -f <container_id_or_name>

Будьте осторожны при удалении контейнеров, так как это необратимая операция и все данные, не сохраненные в томах, будут потеряны.

Чтобы удалить все остановленные контейнеры:

bash
docker container prune

Жизненный цикл контейнера

Контейнер проходит через различные состояния в течение своего жизненного цикла:

  1. Created: Контейнер был создан, но еще не запущен (docker create или docker run --rm).
  2. Running: Контейнер запущен и выполняет свой основной процесс.
  3. Paused: Контейнер приостановлен. Все процессы внутри заморожены, но контейнер остается в памяти.
  4. Exited: Контейнер завершил свою работу (успешно или с ошибкой).
  5. Dead: Контейнер находится в неработоспособном состоянии.

Вы можете использовать команды docker pause, docker unpause для управления состоянием приостановки контейнера.

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