====== 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