====== Docker-compose ======
==== Установка Docker Compose ====
//Расчетное время чтения: 7 минут//
Вы можете запустить Compose в macOS, Windows и 64-битной Linux.
== Зависимости ==
Docker Compose использует Docker Engine для любой значимой работы, поэтому убедитесь, что Docker Engine установлен локально или удаленно, в зависимости от ваших настроек
== Установка ==
[[https://docs.docker.com/compose/install/|https://docs.docker.com/compose/install/]]
----
==== Программа hello-world ====
PS D:\docker> docker-compose up Pulling my-test (hello-world:)… latest: Pulling from library/hello-world 1b930d010525: Pull complete Creating docker_my-test_1 … done Attaching to docker_my-test_1 my-test_1 | my-test_1 | Hello from Docker! my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 | my-test_1 | To generate this message, Docker took the following steps: my-test_1 | 1. The Docker client contacted the Docker daemon. my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. my-test_1 | (amd64) my-test_1 | 3. The Docker daemon created a new container from that image which runs the my-test_1 | executable that produces the output you are currently reading. my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it my-test_1 | to your terminal. my-test_1 | my-test_1 | To try something more ambitious, you can run an Ubuntu container with: my-test_1 | $ docker run -it ubuntu bash my-test_1 | my-test_1 | Share images, automate workflows, and more with a free Docker ID: my-test_1 | [[https://hub.docker.com/|https://hub.docker.com/]] my-test_1 | my-test_1 | For more examples and ideas, visit: my-test_1 | [[https://docs.docker.com/get-started/|https://docs.docker.com/get-started/]] my-test_1 | docker_my-test_1 exited with code 0
Что делает Docker:
- Docker-клиент связался с Docker-демоном.
- Docker-демон извлек образ "hello-world" из Docker Hub.
- Из этого образа Docker-демон создал новый контейнер, который выполняет исполняемый файл, в результате чего получится результат выше
- Docker-демон направил этот результат Docker-клиенту, который отправил его на ваш терминал.
- Если процесс не закрывается самостоятельно, нажмите CTRL-C.
Этот простой тест демонстрирует одно из главных преимуществ Docker Compose — способность запускать и закрывать всю группу Docker-контейнеров одновременно.
== docker-compose.yml ==
my-test:
image: hello-world
----
==== docker-compose up -d (в фоновом режиме) ====
PS D:\docker> docker-compose up -d Starting docker_my-test_1 … done ..Ответ придет в фоновом режиме
----
==== docker-compose ps(показать свою группу Docker-контейнеров) ====
PS D:\docker> docker-compose ps
Name Command State Ports
——————————————- docker_my-test_1 /hello Exit 0 Например, это указывает на то, что контейнер helloworld_my-test_1 остановлен:
----
==== docker-compose stop (остановить все работающие Docker-контейнеры) ====
docker-compose stop
----
==== Пересобрать контейнер ====
Если вы изменяли настройки в контейнерах которые предварительно нужно собирать, то такие контейнеры нужно пересобрать, команда для пересборки проекта на лету (минуя ввод команд остановки, пересборки и запуска) - docker-compose up -d –force-recreate –build
----
==== Формирование docker-compose ====
version: '3.1'
services:
db:
build: ./db
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: 2619192
volumes:
- ./databases:/var/lib/mysql
adminer:
build: ./adminer
restart: always
ports:
- 6080:8080
$ docker-compose build Building db Step 1/1 : FROM mysql —> 81f094a7e4cc Successfully built 81f094a7e4cc Successfully tagged docker_db:latest Building adminer Step 1/1 : FROM adminer —> e2d2c89239b2 Successfully built e2d2c89239b2 Successfully tagged docker_adminer:latest
$ docker-compose up -d Recreating docker_db_1 … done Recreating docker_adminer_1 … done
----
==== Удалить сервис ====
$ docker-compose rm db Going to remove docker_db_1 Are you sure? [yN] y Removing docker_db_1 … done
====Описание комманд====
# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.
version: "3"
# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.
services:
# Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
# Это означает, что нам нужно два сервиса.
# Первый сервис (контейнер): сервер.
# Назвать его можно так, как нужно разработчику.
# Понятное название сервиса помогает определить его роль.
# Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.
server:
# Ключевое слово "build" позволяет задать
# путь к файлу Dockerfile, который нужно использовать для создания образа,
# который позволит запустить сервис.
# Здесь 'server/' соответствует пути к папке сервера,
# которая содержит соответствующий Dockerfile.
build: server/
# Команда, которую нужно запустить после создания образа.
# Следующая команда означает запуск "python ./server.py".
command: python ./server.py
# Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
# Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
# мы должны организовать перенаправление этого порта на порт компьютера.
# Сделать это нам поможет ключевое слово 'ports'.
# При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
# В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
# 1234 контейнера (так как именно на этот порт сервер
# ожидает поступления запросов).
ports:
- 1234:1234
# Второй сервис (контейнер): клиент.
# Этот сервис назван 'client'.
client:
# Здесь 'client/ соответствует пути к папке, которая содержит
# файл Dockerfile для клиентской части системы.
build: client/
# Команда, которую нужно запустить после создания образа.
# Следующая команда означает запуск "python ./client.py".
command: python ./client.py
# Ключевое слово 'network_mode' используется для описания типа сети.
# Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.
network_mode: host
# Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
# прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
# Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
depends_on:
- server