# Docker compose

Инструмент для управления несколькими контейнерами при помощи одного файла.

**Настройка прав на директорию**

Создаем группу, которой будут предоставлены права на управление

```
sudo groupadd docker-users
sudo usermod -aG docker-users user1
sudo usermod -aG docker-users user2
```

Создаем директорию проекта

```
sudo mkdir /var/dockerimages 
sudo chown root:docker-users /var/dockerimages       # Владелец — root, группа — docker-users
sudo chmod 775 /var/dockerimages                    # Права: rwxrwxr-x
```

Права на создаваемые директории

```
sudo chmod g+s /var/dockerimages
```

Добавление пользователей в группу Docker. В этом случае пользователи получат полный доступ к Docker.

```
sudo usermod -aG docker user1 user2 
```

**Политики перезапуска**

Применение compose файла с политикой restart always/unless-stopped нужно быть внимательным. Повторное применение может создать копию, которая будет постоянно перезагружаться и забивать ресурсы. Для диагностики docker ps Если такое произошло, то

```
docker update --restart=no 1945fa12ce27
```

Это обновит политику перезагрузки для контейнера и позволит разобраться в проблеме.

**Консольные команды:**

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF" style="border-collapse: collapse; width: 100%; height: 208.578px;"><colgroup><col style="width: 20.9754%;"></col><col style="width: 20.0258%;"></col><col style="width: 58.9988%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Основная команда</td><td class="align-center" style="height: 29.7969px;">Доп. параметры</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">docker compose up</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">Запуск контейнеров через Compose файл.

Вывод журнальных записей объединяется в один поток.

Создает образы, если они не существовали ранее

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">-d</td><td style="height: 29.7969px;">запуск в фоновом режиме</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">-f</td><td style="height: 29.7969px;">определяет имя compose файла</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">&amp; в конце</td><td style="height: 29.7969px;">возвращает консоль, но продолжает выводить логи</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">docker compose build</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">Пересоздание образов из Dockerfile.</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">docker compose ps</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">Вывод информации о состоянии контейнеров. Работает только в контексте файла в текущей директории. </td></tr><tr><td>docker compose run</td><td>  
</td><td>Одноразовый запуск с выполнением одной команды (не в качестве сервиса).

Также запускаются все контейнеры, с которыми должны быть установлены соединения, если не задан аргумент --no-deps.

(Команды, передаваемые через run, заменяют команды, определенные в файле конфигурации сервиса. Кроме того, по умолчанию команда run не создает портов, определенных в файле конфигурации сервиса.)

</td></tr><tr><td>docker compose top</td><td>  
</td><td>процессы во всех контейнерах

</td></tr><tr><td>docker compose stop</td><td>  
</td><td>Останов контейнеров без их удаления

</td></tr><tr><td>docker compose logs</td><td>  
</td><td>Вывод журнальных записей с цветной подсветкой, объединенный для всех контейнеров

</td></tr><tr><td>docker compose restart</td><td>  
</td><td>запускает остановленные контейнеры

</td></tr><tr><td>docker compose rm</td><td>  
</td><td>Удаление остановленных контейнеров.

</td></tr><tr><td>  
</td><td>-v</td><td>удаляет тома, управляемые механизмом Docker

</td></tr><tr><td>docker compose down</td><td>  
</td><td>это stop+rm

</td></tr><tr><td>  
</td><td>--volumes</td><td>удаляет и тома

</td></tr><tr><td>  
</td><td>--rmi all</td><td>удаляет образы

</td></tr></tbody></table>

**Формат файла 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 <file> up
```

Предварительный вывод итогового yml файла:

```
docker compose config
```

Приоритет переменных (от высокого к низкому):

1. Файл Compose.
2. Переменные среды оболочки.
3. Файл среды.
4. Dockerfile.
5. Переменная не определена.

**Именование контейнеров.**

В случае использования image, имя контейнера берется из имени сервиса. В случае build &lt;имя проекта&gt;-&lt;имя сервиса&gt; Переменные в имени сервиса не поддерживаются.

**Политика перезагрузки контейнера**

- always - всегда
- uness-stopped - если контейнер был остановлен, затем перезагрузилась служба Docker - он не будет запущен. При перезагрузке работающего контейнера с unless-stopped будет запущен.
- on-failure - перезагрузка при аварийном завершении работы. Контейнер запускается если был остановлен и служба Docker была перезапущена.

```
services:
  postgres:
    image: ${PROJECT_NAME}_db:${VERSION}
    restart: always
```