Основы Docker: Контейнеры (Containers)
Docker Container — это исполняемый экземпляр Docker-образа. Контейнеры содержат все необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки. Контейнеры изолированы друг от друга и от хост-системы, что обеспечивает переносимость и воспроизводимость приложений.
Основные характеристики Docker Containers
- Изоляция (Isolation): Контейнеры запускаются в изолированной среде, называемой контейнеризацией. Это означает, что процессы внутри контейнера не могут напрямую взаимодействовать с процессами в других контейнерах или на хост-машине (за исключением явно настроенных взаимодействий, например, через сеть или тома).
- Легковесность (Lightweight): Контейнеры используют ядро операционной системы хост-машины и совместно используют общие библиотеки (если это возможно), что делает их гораздо легче и быстрее в запуске по сравнению с виртуальными машинами.
- Переносимость (Portability): Поскольку контейнер содержит все зависимости приложения, его можно запускать на любой системе, где установлен Docker, независимо от базовой операционной системы.
- Жизненный цикл (Lifecycle): Контейнеры имеют определенный жизненный цикл: создание, запуск, остановка, перезапуск, удаление.
Управление контейнерами Docker
Вы можете управлять контейнерами Docker с помощью команды docker container (или просто docker).
Просмотр списка запущенных контейнеров
docker ps
docker container lsЭти команды выводят список всех запущенных контейнеров, включая их ID контейнера, образ, команду, статус, порты и имена.
- CONTAINER ID: Уникальный идентификатор контейнера.
- IMAGE: Образ, на основе которого был создан контейнер.
- COMMAND: Команда, выполняющаяся внутри контейнера.
- CREATED: Время создания контейнера.
- STATUS: Текущий статус контейнера (например,
Up,Exited). - PORTS: Информация о опубликованных портах контейнера.
- NAMES: Автоматически сгенерированное или заданное пользователем имя контейнера.
Просмотр всех контейнеров (включая остановленные)
docker ps -a
docker container ls -aЗапуск контейнера
Для запуска контейнера из Docker-образа используется команда docker run:
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: Автоматически удаляет контейнер после его остановки.
Примеры запуска контейнеров:
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:
docker stop <container_id_or_name>Эта команда отправляет сигнал SIGTERM процессу внутри контейнера и дает ему некоторое время на корректное завершение работы (по умолчанию 10 секунд).
Принудительная остановка контейнера
Если контейнер не отвечает на сигнал SIGTERM, вы можете принудительно остановить его с помощью команды docker kill:
docker kill <container_id_or_name>Эта команда отправляет сигнал SIGKILL, который немедленно завершает процесс контейнера.
Перезапуск контейнера
Для перезапуска остановленного или работающего контейнера используется команда docker restart:
docker restart <container_id_or_name>Присоединение к работающему контейнеру
Чтобы взаимодействовать с процессом, запущенным в контейнере (например, получить доступ к интерактивной оболочке), используется команда docker attach:
docker attach <container_id_or_name>Эта команда присоединяет ваш терминал к стандартному вводу, выводу и ошибкам основного процесса контейнера. Выход из присоединенной сессии обычно приводит к остановке контейнера (если не использовались специальные опции при запуске).
Для интерактивных сессий лучше использовать docker exec -it <container_id_or_name> <command>, как показано в примере запуска Ubuntu выше. docker exec запускает новую команду в уже работающем контейнере.
Выполнение команд в работающем контейнере
Для выполнения дополнительных команд внутри уже запущенного контейнера используется команда docker exec:
docker exec [OPTIONS] <container_id_or_name> <command> [ARG...]Полезные опции docker exec:
-iили--interactive: Поддерживает интерактивный ввод/вывод.-tили--tty: Выделяет псевдотерминал.
Примеры использования docker exec:
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:
docker logs <container_id_or_name>
docker logs -f <container_id_or_name> # Следить за логами в реальном времени (как tail -f)Копирование файлов из/в контейнер
Для копирования файлов между хост-машиной и контейнером используется команда docker cp:
docker cp <container_id_or_name>:<path_in_container> <host_path>
docker cp <host_path> <container_id_or_name>:<path_in_container>Примеры:
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf # Копирование файла из контейнера на хост
docker cp ./my-app.log my-app:/var/log/ # Копирование файла с хоста в контейнерУдаление контейнера
Для удаления остановленного контейнера используется команда docker rm:
docker rm <container_id_or_name>Чтобы принудительно удалить работающий контейнер, используйте флаг -f или --force:
docker rm -f <container_id_or_name>Будьте осторожны при удалении контейнеров, так как это необратимая операция и все данные, не сохраненные в томах, будут потеряны.
Чтобы удалить все остановленные контейнеры:
docker container pruneЖизненный цикл контейнера
Контейнер проходит через различные состояния в течение своего жизненного цикла:
- Created: Контейнер был создан, но еще не запущен (
docker createилиdocker run --rm). - Running: Контейнер запущен и выполняет свой основной процесс.
- Paused: Контейнер приостановлен. Все процессы внутри заморожены, но контейнер остается в памяти.
- Exited: Контейнер завершил свою работу (успешно или с ошибкой).
- Dead: Контейнер находится в неработоспособном состоянии.
Вы можете использовать команды docker pause, docker unpause для управления состоянием приостановки контейнера.
Docker Containers являются основными строительными блоками для запуска приложений в Docker. Понимание того, как управлять контейнерами, является ключевым для эффективной работы с Docker.