# Docker compose Инструмент для управления несколькими контейнерами при помощи одного файла. Применение compose файла с политикой restart always/unless-stopped нужно быть внимательным. Повторное применение может создать копию, которая будет постоянно перезагружаться и забивать ресурсы. Для диагностики docker ps Если такое произошло, то ``` docker update --restart=no 1945fa12ce27 ``` Это обновит политику перезагрузки для контейнера и позволит разобраться в проблеме. **Консольные команды:**
Основная командаДоп. параметрыОписание
docker compose up Запуск контейнеров через Compose файл. Вывод журнальных записей объединяется в один поток. Создает образы, если они не существовали ранее
-dзапуск в фоновом режиме
-fопределяет имя compose файла
& в концевозвращает консоль, но продолжает выводить логи
docker compose build Пересоздание образов из Dockerfile.
docker compose ps Вывод информации о состоянии контейнеров. Работает только в контексте файла в текущей директории.
docker compose run Одноразовый запуск с выполнением одной команды (не в качестве сервиса). Также запускаются все контейнеры, с которыми должны быть установлены соединения, если не задан аргумент --no-deps. (Команды, передаваемые через run, заменяют команды, определенные в файле конфигурации сервиса. Кроме того, по умолчанию команда run не создает портов, определенных в файле конфигурации сервиса.)
docker compose top процессы во всех контейнерах
docker compose stop Останов контейнеров без их удаления
docker compose logs Вывод журнальных записей с цветной подсветкой, объединенный для всех контейнеров
docker compose restart запускает остановленные контейнеры
docker compose rm Удаление остановленных контейнеров.
-vудаляет тома, управляемые механизмом Docker
docker compose down это stop+rm
--volumesудаляет и тома
--rmi allудаляет образы
**Формат файла docker-compose.yaml** Имя файла docker-compose.yml Язык yaml. Уровни вложенности определяются пробелами, параметр:значение, - список Compose перекрывает настройки docker файла при пересечении. Если микросервисы в одной сети (networks), то могут взаимодействовать по имени. \# комментарий, пустые строки игнорируются сначала создается сеть и тома, затем сервисы. **Блоки конфигурации:** ```yaml services #настройки запускаемых образов firstapp: build: . #Расположение dockerfile, в данном случае в текущей папке command: python app.py #исполняемая комманда (точка входа) hostname: your-name ports: - target: 8080 #внутренний порт published: 5001 #внешний порт environment: - DEBUG=${DEBUG} networks: - counter-net #название подключенной сети, т е может быть разные подключенные сети. Подключенные к одной сети контейнеры видят друг друга по имени. Д б определена в networks volumes: - type: volume source: counter-vol #Д б определена в volumes target: /app networks #Сеть counter-net: over-net: #имя сети driver: overlay #драйвер attachable: true #разрешено подключаться из других докер контейнеров volumes #Тома ``` **Внешние переменные окружения** По умолчанию файл .env Формат файла: ``` VERSION=v1.3 PG_USERNAME="superadmin" ``` Кавычки: - Тип кавычек после = определяет внешние кавычки, которые убираются. - Внутри строки не может быть внешних неэкранированных кавычек - Одинарные не разыменовывают $ (и скорее всего остальные спец. символы), двойные разыменовывают - Одинарные поддерживают multiline Использование внутри yml файла (без доступа во время выполнения): ```yaml services: web: image: webapp:${VERSION} ``` Для использования внутри сервиса необходимо создать переменную внутри environment ```yaml services: db: image: postgres environment: POSTGRES_USER: ${PG_USERNAME} ``` Использование различных файлов с переменными окружения ``` docker compose --env-file up ``` Предварительный вывод итогового yml файла: ``` docker compose config ``` Приоритет переменных (от высокого к низкому): 1. Файл Compose. 2. Переменные среды оболочки. 3. Файл среды. 4. Dockerfile. 5. Переменная не определена. **Именование контейнеров.** В случае использования image, имя контейнера берется из имени сервиса. В случае build <имя проекта>-<имя сервиса> Переменные в имени сервиса не поддерживаются. **Политика перезагрузки контейнера** - always - всегда - uness-stopped - если контейнер был остановлен, затем перезагрузилась служба Docker - он не будет запущен. При перезагрузке работающего контейнера с unless-stopped будет запущен. - on-failure - перезагрузка при аварийном завершении работы. Контейнер запускается если был остановлен и служба Docker была перезапущена. ``` services: postgres: image: ${PROJECT_NAME}_db:${VERSION} restart: always ```