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

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

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

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555076{{"Как использовать команду docker compose create для сборки и создания контейнеров"}} docker/ps -.-> lab-555076{{"Как использовать команду docker compose create для сборки и создания контейнеров"}} docker/rm -.-> lab-555076{{"Как использовать команду docker compose create для сборки и создания контейнеров"}} docker/create -.-> lab-555076{{"Как использовать команду docker compose create для сборки и создания контейнеров"}} docker/pull -.-> lab-555076{{"Как использовать команду docker compose create для сборки и создания контейнеров"}} end

Подготовка простого файла docker-compose.yml

На этом шаге мы подготовим простой файл docker-compose.yml. Прежде чем начать, установим Docker Compose. Так как в виртуальной среде LabEx Docker Compose не предустановлен, нам нужно установить его вручную. Мы скачаем бинарный файл Docker Compose и сделаем его исполняемым.

Сначала загрузим бинарный файл Docker Compose с помощью curl. Мы будем использовать версию 1.29.2, которая совместима с установленной версией Docker.

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

Эта команда загружает бинарный файл Docker Compose с официальной страницы релизов GitHub и сохраняет его в /usr/local/bin/docker-compose. Части $(uname -s) и $(uname -m) автоматически определяют вашу операционную систему и архитектуру, гарантируя загрузку правильного бинарного файла.

Далее нам нужно сделать загруженный бинарный файл исполняемым.

sudo chmod +x /usr/local/bin/docker-compose

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

Теперь проверим, что Docker Compose установлен корректно, посмотрев его версию.

docker-compose --version

Вы должны увидеть вывод, похожий на docker-compose version 1.29.2, build 5becea4c. Это подтверждает, что Docker Compose установлен и готов к использованию.

Теперь создадим простой файл docker-compose.yml в вашей директории ~/project. Этот файл будет определять один сервис, использующий образ nginx.

nano ~/project/docker-compose.yml

Эта команда открывает текстовый редактор nano для создания и редактирования файла docker-compose.yml. Вставьте следующее содержимое в редактор:

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

Разберём этот файл docker-compose.yml:

  • version: '3.8' указывает версию формата файла Docker Compose.
  • services: определяет сервисы (контейнеры), которые вы хотите запустить.
  • web: — это имя нашего сервиса. Вы можете выбрать любое имя.
  • image: nginx:latest указывает Docker-образ для этого сервиса. В данном случае мы используем последнюю версию официального образа Nginx.
  • ports: сопоставляет порты между хост-машиной и контейнером. "80:80" сопоставляет порт 80 на хосте с портом 80 в контейнере. Это означает, что вы можете получить доступ к веб-серверу Nginx, работающему внутри контейнера, перейдя по адресу http://localhost в вашем браузере (или по IP-адресу виртуальной машины).

Сохраните файл, нажав Ctrl + O, затем Enter, и выйдите из редактора, нажав Ctrl + X.

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

Создание контейнеров с помощью docker compose create

На этом шаге мы используем команду docker-compose create для создания контейнеров на основе файла docker-compose.yml, подготовленного ранее. Команда docker-compose create создаёт контейнеры, но не запускает их. Это полезно, если вы хотите настроить окружение контейнеров без немедленного запуска сервисов.

Перед созданием контейнера убедимся, что образ nginx доступен локально. Если его нет, Docker Compose автоматически загрузит его в процессе создания. Однако рекомендуется заранее знать, какие образы используются. Вы можете вручную загрузить образ с помощью команды docker pull:

docker pull nginx:latest

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

Теперь перейдём в директорию с файлом docker-compose.yml. В нашем случае это директория ~/project.

cd ~/project

Теперь выполним команду docker-compose create:

docker-compose create

Эта команда читает файл docker-compose.yml в текущей директории и создаёт определённые в нём контейнеры. Вы увидите вывод, указывающий на создание контейнера для сервиса web.

После завершения команды вы можете проверить статус созданных контейнеров с помощью команды docker ps -a.

docker ps -a

Вывод docker ps -a покажет все контейнеры, включая не запущенные. Вы должны увидеть контейнер с именем project_web_1 (имя генерируется на основе имени директории и сервиса) со статусом Created. Это подтверждает, что контейнер успешно создан, но ещё не запущен.

Команда docker-compose create полезна для предварительной подготовки контейнеров. В следующих шагах мы рассмотрим, как запускать и управлять этими контейнерами.

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

На этом шаге мы узнаем, как принудительно пересоздать контейнеры с помощью команды docker-compose create --force-recreate. Флаг --force-recreate используется для пересоздания контейнеров, даже если их конфигурация не изменилась. Это полезно в сценариях, когда требуется обновить экземпляр контейнера, например, после внесения изменений в базовый образ, которые Docker Compose может не обнаружить автоматически.

Сначала убедитесь, что находитесь в директории ~/project, где расположен ваш файл docker-compose.yml.

cd ~/project

Теперь выполните команду docker-compose create с флагом --force-recreate:

docker-compose create --force-recreate

Поскольку мы уже создавали контейнер на предыдущем шаге, Docker Compose обнаружит существующий контейнер. Благодаря флагу --force-recreate он удалит существующий контейнер и создаст новый с той же конфигурацией. Вы увидите вывод, указывающий на удаление старого контейнера и создание нового.

Проверим статус контейнеров снова с помощью docker ps -a.

docker ps -a

Вы по-прежнему должны увидеть контейнер с именем project_web_1 и статусом Created. Хотя имя и конфигурация остались прежними, это новый экземпляр контейнера, созданный благодаря флагу --force-recreate.

Флаг --force-recreate - это мощный инструмент, когда вам нужно гарантировать свежий экземпляр контейнера, независимо от того, изменилась ли конфигурация в файле docker-compose.yml.

Создание контейнеров без сборки с помощью --no-build

На этом шаге мы рассмотрим опцию docker-compose create --no-build. Этот флаг полезен, когда ваш файл docker-compose.yml включает сервисы, которые собираются из Dockerfile (с использованием инструкции build), но вы хотите только создать контейнеры без пересборки образов. Поскольку наш текущий файл docker-compose.yml использует только предварительно собранный образ (nginx:latest), флаг --no-build не окажет видимого эффекта на процесс сборки образа в данном конкретном случае. Однако важно понимать его назначение для будущего использования с сервисами, требующими сборки.

Сначала убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь выполним команду docker-compose create с флагом --no-build. Так как контейнер project_web_1 уже существует после предыдущих шагов, мы также используем флаг --force-recreate для гарантированного создания нового контейнера.

docker-compose create --no-build --force-recreate

В сценарии, когда ваш docker-compose.yml содержит сервис с инструкцией build, выполнение этой команды создаст контейнер, используя существующий образ (если он доступен) или загрузит образ, но пропустит процесс сборки, определённый в Dockerfile. В нашем текущем случае, поскольку мы используем предварительно собранный образ, вывод будет аналогичен предыдущему шагу, указывая на удаление старого контейнера и создание нового.

Проверим статус контейнера снова.

docker ps -a

Вы по-прежнему должны увидеть контейнер project_web_1 в состоянии Created. Флаг --no-build в первую очередь влияет на сервисы, собираемые из Dockerfile, предотвращая процесс сборки при создании контейнеров.

Создание контейнеров с автоматической загрузкой образов через --pull always

На этом шаге мы используем команду docker-compose create --pull always. Флаг --pull always предписывает Docker Compose всегда загружать последнюю версию образа перед созданием контейнера, даже если локальная копия образа уже существует. Это полезно для гарантии использования самых актуальных версий образов для ваших сервисов.

Сначала убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь выполним команду docker-compose create с флагом --pull always. Поскольку контейнер project_web_1 уже существует, мы также используем флаг --force-recreate для создания нового контейнера на основе потенциально обновлённого образа.

docker-compose create --pull always --force-recreate

При выполнении этой команды Docker Compose сначала проверит наличие обновлений для образа nginx:latest в Docker Hub. Если доступна более новая версия, она будет загружена. Затем произойдёт удаление существующего контейнера project_web_1 и создание нового с использованием загруженного образа. В выводе вы увидите процесс загрузки (если доступен новый образ), за которым последует удаление и создание контейнера.

Проверим статус контейнера в последний раз.

docker ps -a

Вы по-прежнему увидите контейнер project_web_1 в состоянии Created. Ключевое отличие здесь в том, что Docker Compose активно проверил и потенциально загрузил более новый образ перед созданием этого экземпляра контейнера.

Флаг --pull always важен для поддержания ваших сервисов в актуальном состоянии с последними версиями образов, что гарантирует использование новейших функций, исправлений ошибок и обновлений безопасности.

Итоги

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

После подготовки мы исследовали различные параметры команды docker compose create. Мы узнали, как создавать контейнеры с помощью базовой команды, как принудительно пересоздавать существующие контейнеры с флагом --force-recreate, как создавать контейнеры без пересборки образов с помощью флага --no-build, а также как гарантировать загрузку последних версий образов перед созданием с флагом --pull always. Эти шаги продемонстрировали гибкость и контроль, которые предоставляет docker compose create при управлении жизненным циклом контейнеров.