docker-compose: docker-compose.yml файл,install


YAML format: Reference
docker-compose download
Compose file version 3 reference
Install docker-compose

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

Темплэйт yml файла:

version: '3.6'  # если не указать версию, то используется v1. Минимум рекомендовано v2

services:  # секция для контейнеры, аналог docker run
  servicename1: # любое имя, также используется как DNS имя внтури сети
    image: # Опционально, если используется build: 
    command: # Опционально, заменяет дефолтный CMD образа
    environment: # Опционально, аналог -e в docker run
    volumes: # Опционально, аналог -v в docker run
  servicename2: и т.д.
volumes: # Опционально, аналог команде docker volume create 
networks: # Опционально, аналог команде docker network creat

Каждый сервис в yml файл обязательно должен иметь одну из опций- либо image, либо build. Большенство же опций аналогичны ключам команды docker run.
По сути вся работа сводится к двум вещам:
1. Созданию/редактированию yml файла содержащего опции конфигурации для:
container
network
volume
2. команда docker-compose — используемая для локальной разработки/тестов описанных опций в yml файле

Список опций поддреживаемых docker-compose:

•	 image : Имя/ID образа
•	 build : путь к Dockerfile
•	 command : заменяет дефолтный CMD образа
•	 ports : аналог -p в docker run, формат портов HOST_port:CONTAINER_port
•	 expose : говорим docker на каких портах будут висеть сервисы контейнера, но при этом не мапить их на хостовую тачку
•	 volumes : опция монтирования папок с хостовой тачки в контейнер
•	 volumes_from : монтирование разделов из другого контенера (аналог volumes-from в docker run)
•	 environment : переменные оружения
•	 env_file : файл с переменными окружения
•	 net : аналог --network в docker run
•	 entrypoint :  заменяет дефолтный ENTRYPOINT образа
•	 user : имя пользователя из под которого будет выполнятся сервис в контейнере
•	 hostname : хостнэйм контейнра
•	 domainname : доменное имя контейнера

docker-compose поддерживает команды:

•	 build : собрать/пересобрать контейнер
•	 kill : пристрелить контейнер
•	 logs : вывести логи контейнера (docker container logs)
•	 port : показать проброшенные порты(аналог docker port)
•	 ps : аналог docker container ls 
•	 pull : скачать образ контейнра
•        push : закачать образ контейнра в Docker Hub или ваш репозитарий
•	 rm : удалить не работающие контейнеры
•	 run : выполнить команду на контейнере (аналог docker container exex)
•	 up : создать и запустить контейнеры
•	 down: остановить и удалить контейнеры

Install docker-compose

1. Скачиваем скрипт docker-compose:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

2. Делаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/docker-compose

3. Проверяем, что docker-compose работает:
docker-compose --version
docker-compose version 1.21.2, build a133471

В качестве примера запустим контейнер с nginx, замапим 80 порт с хоста в контейнер и заменим дефолтный index.html нашим файлом:

1. Создадим два файла docker-compose.yml и index.html с содержимым:
docker-compose.yml:
------------------
version: '3.6'
services:
 web:
  image: nginx:latest
  ports:
   - 80:80
  hostname: 'hostname_web'
  volumes:
    - ./index.html:/usr/share/nginx/html/index.html:ro

здесь ro означает - "только для чтения", это необязательная опция.

index.html:
----------
Hello, I am container running by docker-compose.

2. Запускаем:
docker-compose up
Можно указать ключ -d(docker-compose up -d), тогда контейнер запустится в бэкграунде

3. Проверяем:
Смотрим список запущенных контейнеров
docker-compose ps
       Name                Command          State         Ports       
---------------------------------------------------------------------
dockerfiles_web_1   nginx -g daemon off;   Up      0.0.0.0:80->80/tcp

и так:
docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
89898df6e019        nginx:latest        "nginx -g 'daemon of…"   33 seconds ago      Up 31 seconds       0.0.0.0:80->80/tcp   dockerfiles_web_1

Смотрим запущенные процессы в контейнере
docker-compose top web
dockerfiles_web_1
  UID      PID    PPID   C   STIME   TTY     TIME                        CMD                    
------------------------------------------------------------------------------------------------
root       5133   5114   0   16:46   ?     00:00:00   nginx: master process nginx -g daemon off;
systemd+   5209   5133   0   16:46   ?     00:00:00   nginx: worker process              

и так:
docker container top dockerfiles_web_1 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                5133                5114                0                   16:46               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            5209                5133                0                   16:46               ?                   00:00:00            nginx: worker process


Заходим в консоль контейнра:
docker-compose run web bash
root@hostname_web:/# 

Проверяем в браузере --> http://127.0.0.1/

4. Останавливаем и удаляем контейнер:
docker-compose down

В качестве второго примера запустим два контейнера drupal и postgres для него.
— drupal будет доступен по порт 8080 хостовой тачки.
— postgres зададим переменные окружения — POSTGRES_PASSWORD,POSTGRES_USER,POSTGRES_DB
— postgres с помощью volumes и переменных окружения передадим скрипт для создания базы данных для drupal
— ну а также с помощью volumes для postgres и drupal примантируем папки, которые будут использоваться для хранения данных (базы данных, файлы сайта), которые можно в дальнейшем бэкапить и в случае падения восстанавливать

Для нашего примера docker-compose.yml будет выглядить так:

version: '3.6'
services:
 store:
  image: drupal:latest
  ports:
   - 8080:80
  volumes:
   - store_modules:/var/www/html/modules
   - store_profiles:/var/www/html/profiles
   - store_sites:/var/www/html/sites
   - store_themes:/var/www/html/themes
  depends_on:
   - db
 db:
  image: postgres:latest
  environment:
   POSTGRES_PASSWORD: super_pass
   POSTGRES_USER: super_user
   POSTGRES_DB: super_db
  volumes:
   - ./init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh
   - db_postgresqldata:/var/lib/postgresql/data

volumes:
 store_modules:
 store_profiles:
 store_sites:
 store_themes:
 db_postgresqldata:

а файл init-user-db.sh для создания базы для drupal так:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER drupalusr WITH ENCRYPTED PASSWORD 'drupalpw';
    CREATE DATABASE drupaldb WITH ENCODING 'UTF8';
    GRANT ALL PRIVILEGES ON DATABASE drupaldb TO drupalusr;
    ALTER DATABASE "drupaldb" SET bytea_output = 'escape';
EOSQL

Подробности по поводу запуска этих контейнеров можно найти на соответствующих страницах образов на Docker Hub
Official Repository drupal
Official Repository postgres

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *