# Docker-compose файл.

Docker-compose - инструмент для совместного запуска несколких контенеров. Основой для docker-compoes является yaml-файл  с настройками. Удобство заключается в том, что единожды написанный docker-compose.yml  можно легко перенести с устройства на устройство.

# Установка
```bash
 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
 sudo chmod +x /usr/local/bin/docker-compose
 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
 ```
 Третья строчка скрипта дает нам возможность использовать docker-compose от имени сисетмы, если этот команда не будет выполнена. команда  docker-compose потребует указания полноценного пути расположения.
 
# Пример написания docker-compose
Пример взят с  docs.microsoft.com
```yaml
version: "3.7"

services:
  app:
    image: node:12-alpine
    #build: .
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
    networks:
      app_net:

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos
    networks:
      app_net:

volumes:
  todo-mysql-data:
  
networks:
  app_net:
    driver: bridge
```


### Ключевые слова используемые в docker-compose:
|Ключи|Применение|
|---|---|
|build|Указывает путь откуда брать Dockerfile для создания образа|
|args|Указание аргументов билда которые требуются во время создания образа|
|command|Переписывает  CMD указанную в  Dockerfile|
|devices|Мапирование физических устройств в рабочий контейнер|
|depends_on|Указание зависимости сервисов друг от друга. Зависимый сервис будет запускаться последний|
|dns|Указанный в ручуню  DNS сервер|
|entrypoint|Переписывает  ENTRYPOINT директиву из  Dockerfile|
|env_file|Добавление переменных с помощью файла переменных окружения|
|environment|Явное указание переменных в контейнер|
|expose|Выставление портов контейнера, они будут доступны только `linked` сервисам, могут быть указаны только внутренние порты.|
|image|Указание образа, который будет взят для старта контейнера|
|links|Связывание контейнеров разных сервисах|
|logging|Настройки логирования для сервиса.|
|networks|Сеть к которой будет присоденен  сервис|
|ports|Маирование портов из контейнера в хост систему |
|volumes|Мапирование папок из хост системы в контенер|

# Docker-compose cli

Сборка контенера, имеет смысл если в `yaml` файле присутствует директива `build`.
Можно использовать ключ `--no-cache`, в таком случае игнорируются кэшированные образы.
```
docker-compose build
```
Запуск приложения. В запуск можно добавить  `--build` ключ, тогда docker-compose перебилдит незакешированные шаги.
```
docker-compose up
```

Docker-compose останавливает и удаляет запущенные контенеры, согласно  yaml конфигурации.
То есть выполянется 2 команды docker: `docker stop` и `docker rm`
```
docker-compose stop
```
Отображает запущенные контейнеры принадлежащие yaml файлу.
```
docker-compose  ps
```

> ВНИМАНИЕ! Выполенение команда, в отличии от `docker`, должно быть с в папке с yaml файлом. Команда `docker` может выполнятся из любой папки.