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

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

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

Введение

В этой лабораторной работе вы научитесь эффективно управлять контейнерами с помощью команды docker compose up. Мы рассмотрим базовое использование docker compose up для запуска сервисов, определённых в файле docker-compose.yml, включая запуск сервисов в foreground-режиме и в detached-режиме.

Кроме того, вы изучите расширенные опции docker compose up, такие как принудительное пересоздание контейнеров с помощью force-recreate, предотвращение ненужного пересоздания с no-recreate и автоматическую сборку образов перед запуском контейнеров. По завершении этой лабораторной работы вы будете уверенно использовать docker compose up в различных сценариях управления контейнерами.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) 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/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555096{{"Как использовать команду docker compose up для управления контейнерами"}} docker/ps -.-> lab-555096{{"Как использовать команду docker compose up для управления контейнерами"}} docker/stop -.-> lab-555096{{"Как использовать команду docker compose up для управления контейнерами"}} docker/rm -.-> lab-555096{{"Как использовать команду docker compose up для управления контейнерами"}} docker/build -.-> lab-555096{{"Как использовать команду docker compose up для управления контейнерами"}} end

Запуск сервисов с помощью docker compose up

На этом шаге вы узнаете, как запускать сервисы, определённые в файле docker-compose.yml, с помощью команды docker compose up. Перед началом необходимо установить Docker Compose, так как он не предустановлен в данной среде.

Сначала установим Docker Compose. Загрузим последнюю стабильную версию и сделаем её исполняемой.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Теперь, когда Docker Compose установлен, создадим простой файл docker-compose.yml для определения сервиса. Создадим файл с именем docker-compose.yml в вашей директории ~/project.

nano ~/project/docker-compose.yml

Добавим следующее содержимое в файл:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Этот файл docker-compose.yml определяет один сервис с именем web. Он использует образ nginx:latest и пробрасывает порт 80 хоста на порт 80 контейнера.

Теперь используем docker compose up для запуска сервиса. Перейдём в директорию ~/project и выполним команду.

cd ~/project
docker compose up

Вы увидите вывод, указывающий, что Docker Compose создаёт и запускает контейнер web. По умолчанию docker compose up работает в foreground-режиме, показывая логи запущенных сервисов.

Чтобы проверить, что контейнер Nginx работает, можно открыть новый терминал или использовать curl для доступа к веб-серверу.

curl http://localhost

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

Для остановки сервисов нажмите Ctrl+C в терминале, где выполняется docker compose up. Это остановит и удалит контейнеры.

Запуск сервисов в detached-режиме

На предыдущем шаге вы запускали сервисы с помощью docker compose up, который работал в foreground-режиме. Это полезно для отладки, но для работы сервисов в продакшене или фоновом режиме следует использовать detached-режим.

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

Для запуска сервисов в detached-режиме достаточно добавить флаг -d к команде docker compose up. Убедитесь, что находитесь в директории ~/project, где расположен ваш файл docker-compose.yml.

cd ~/project
docker compose up -d

Вы увидите вывод о создании и запуске контейнеров, но команда вернёт управление терминалу после запуска сервисов.

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

docker ps

Вы должны увидеть запись для контейнера project-web-1 (имя обычно формируется как [имя_директории]-[имя_сервиса]-[номер_экземпляра]).

Вы по-прежнему можете получить доступ к веб-серверу Nginx с помощью curl, чтобы убедиться в его работоспособности.

curl http://localhost

Вы снова увидите HTML-код стандартной приветственной страницы Nginx.

Для остановки сервисов, запущенных в detached-режиме, используйте команду docker compose down в той же директории, где находится ваш файл docker-compose.yml.

docker compose down

Эта команда остановит и удалит контейнеры, сети и тома, созданные командой docker compose up.

Принудительное пересоздание контейнеров с force-recreate

На предыдущем шаге вы узнали, как запускать сервисы в detached-режиме. По умолчанию, при повторном запуске docker compose up с тем же файлом docker-compose.yml и уже работающими контейнерами, Docker Compose не будет пересоздавать контейнеры, если не было изменений в определении сервиса (например, образ или порты).

Иногда может потребоваться принудительно остановить и пересоздать контейнеры, даже если определение сервиса не изменилось. Это может быть полезно для применения обновлений, не требующих изменения файла docker-compose.yml, или просто для гарантии свежего запуска контейнера.

Для принудительного пересоздания контейнеров используйте флаг --force-recreate с командой docker compose up.

Сначала убедитесь, что ваш сервис web работает в detached-режиме с предыдущего шага. Если нет, выполните:

cd ~/project
docker compose up -d

Теперь запустим docker compose up снова с флагом --force-recreate:

cd ~/project
docker compose up -d --force-recreate

Вы увидите вывод, указывающий, что Docker Compose останавливает и затем пересоздает контейнер web. Несмотря на то что файл docker-compose.yml не изменился, флаг --force-recreate заставляет Docker Compose удалить существующий контейнер и создать новый на основе текущей конфигурации.

Вы можете проверить пересоздание контейнера, сравнив его ID с помощью команды docker ps. ID контейнера должен отличаться от того, что был до выполнения команды с --force-recreate.

docker ps

Обратите внимание на ID контейнера в выводе.

Для очистки остановите работающие сервисы:

cd ~/project
docker compose down

Предотвращение пересоздания с помощью no-recreate

На предыдущем шаге вы узнали, как принудительно пересоздавать контейнеры с помощью флага --force-recreate. Теперь рассмотрим противоположный сценарий: предотвращение пересоздания.

Как упоминалось ранее, по умолчанию docker compose up не будет пересоздавать контейнеры, если они уже запущены и их конфигурация в файле docker-compose.yml не изменилась. Однако могут возникнуть ситуации, когда нужно явно гарантировать, что существующие контейнеры не будут пересозданы, даже при наличии незначительных изменений, которые в других случаях могли бы вызвать пересоздание.

Для предотвращения пересоздания контейнеров используйте флаг --no-recreate с командой docker compose up.

Сначала убедитесь, что ваш сервис web остановлен. Если он работает, остановите его командой:

cd ~/project
docker compose down

Теперь запустим сервис с помощью docker compose up -d:

cd ~/project
docker compose up -d

Проверим, что контейнер запущен:

docker ps

Запомните ID контейнера.

Теперь запустим docker compose up снова с флагом --no-recreate:

cd ~/project
docker compose up -d --no-recreate

Вы увидите вывод, указывающий, что сервис актуален и контейнер не пересоздается. Если снова выполнить docker ps, вы увидите, что ID контейнера остался прежним.

docker ps

Это демонстрирует, что флаг --no-recreate успешно предотвратил пересоздание существующего контейнера.

Для очистки остановите работающие сервисы:

cd ~/project
docker compose down

Сборка образов перед запуском контейнеров

В предыдущих шагах мы использовали готовые Docker-образы из Docker Hub (например, nginx:latest). Однако часто возникает необходимость создавать собственные Docker-образы для ваших приложений.

Docker Compose может автоматически собирать образы, определенные в вашем файле docker-compose.yml, перед запуском сервисов. Обычно это делается путем указания контекста build вместо имени image для сервиса.

Давайте модифицируем наш файл docker-compose.yml для сборки простого пользовательского образа Nginx.

Сначала создадим новую директорию nginx_custom внутри ~/project:

cd ~/project
mkdir nginx_custom

Теперь создадим Dockerfile внутри директории nginx_custom:

nano ~/project/nginx_custom/Dockerfile

Добавим следующее содержимое в Dockerfile:

FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html

Этот Dockerfile использует официальный образ nginx:latest и заменяет стандартный файл index.html на пользовательский.

Далее изменим файл ~/project/docker-compose.yml, чтобы использовать этот Dockerfile для сборки образа сервиса web. Откроем файл для редактирования:

nano ~/project/docker-compose.yml

Изменим определение сервиса web, указав build вместо image:

version: "3.8"
services:
  web:
    build: ./nginx_custom
    ports:
      - "80:80"

Теперь при запуске docker compose up Docker Compose сначала соберет образ, определенный Dockerfile в директории ./nginx_custom, а затем запустит контейнер с использованием этого нового образа.

Убедитесь, что находитесь в директории ~/project, и выполните:

cd ~/project
docker compose up -d

Вы увидите вывод, показывающий, что Docker Compose собирает образ, а затем создает и запускает контейнер.

Чтобы проверить, что работает пользовательская страница Nginx, используйте curl:

curl http://localhost

Вы должны увидеть вывод <h1>Hello from Custom Nginx!</h1>, что подтверждает успешную сборку образа и работу контейнера с пользовательским содержимым.

Для очистки остановите работающие сервисы:

cd ~/project
docker compose down

Итоги

В этой лабораторной работе вы научились использовать команду docker compose up для управления контейнерами. Вы начали с установки Docker Compose и создания простого файла docker-compose.yml для определения веб-сервиса с использованием образа Nginx. Затем вы применили docker compose up для запуска сервиса, отметив, что по умолчанию он работает в foreground и выводит логи контейнера. Вы проверили работу сервиса, открыв приветственную страницу Nginx.

Лабораторная работа также познакомила вас с запуском сервисов в detached-режиме с использованием флага -d, что позволяет команде завершиться, пока контейнеры продолжают работать в фоновом режиме. Вы узнали, как принудительно пересоздавать контейнеры, даже если их конфигурация не изменилась (с помощью флага --force-recreate), и как предотвратить пересоздание существующих контейнеров (используя флаг --no-recreate). В завершение вы изучили флаг --build для сборки или пересборки образов перед запуском контейнеров, что гарантирует использование актуального образа.