Docker compose
Теги: docker
Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker. В Compose вы используете файл YAML для настройки служб вашего приложения. Затем с помощью одной команды вы создаете и запускаете все службы из своей конфигурации. Чтобы узнать больше обо всех функциях Compose, см. Список функций.
Compose работает во всех средах: production, staging, development, testing а так-же CI workflows. Вы можете узнать больше о каждом случае в разделе Common Use Cases.
Использование Compose - это, по сути, трехэтапный процесс:
- определите среды вашего приложения с помощью
Dockerfile
, чтобы его можно было воспроизвести где угодно. - Определите службы, составляющие ваше приложение, в docker-compose.yml, чтобы их можно было запускать вместе в изолированной среде.
- Запустите
docker compose up
, и Docker compose comands запустит все ваше приложение.
Docker-compose.yml выглядит так:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Пример использования
Step 1: setup
Создать папку проекта
mkdir composetest
cd composetest
Создать файл приложения
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
Создать [requirements].txt
flask
redis
Step 2: Create a Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
Это дает:
- Build an image starting with the Python 3.7 image.
- Set the working directory to /code.
- Set environment variables used by the flask command.
- Install gcc and other dependencies
- Copy requirements.txt and install the Python dependencies.
- Add metadata to the image to describe that the container is listening on port 5000
- Copy the current directory . in the project to the workdir . in the image.
- Set the default command for the container to flask run.
Подробнее о [dockerfile-learn]
Step 3: Define services in a Compose file
docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
В данном случае определили два сервиса - web и [redis]
Web-сервис использует image, созданный из Dockerfile в текущем каталоге. Затем он связывает контейнер и хост-машину через открытый порт 5000. В этом примере службы используется порт по умолчанию для веб-сервера Flask, 5000.
Redis-сервис использует публичный [redis] image полученный из Docker Hub registry.
Step 4: Build and run your app with Compose
docker-compose up
Compose развернет имеджи и стартанет сервисы. Теперь можно посмотреть открытый порт локально: http://localhost:5000/ или http://127.0.0.1:5000
Можно посмотреть что запущено
docker image ls
И остановить приложение
docker-compose down
Step 5: Edit the Compose file to add a bind mount
Зададим привязку [docker-bind-mound] для web-сервиса
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
Новый ключ томов монтирует каталог проекта (текущий каталог) на хосте в /code внутрm контейнера, что позволяет вам изменять код на лету, без необходимости перестраивать образ. Ключ среды устанавливает переменную среды FLASK_ENV, которая сообщает flask run о запуске в режиме разработки и перезагрузке кода при изменении. Этот режим следует использовать только в разработке.
Step 6: Re-build and run the app with Compose
docker-compose up
Step 7: Update the application
По той причине, что папка приложения смонтирована в контейнер, мы можем править ее содержимое и видеть изменеения мгновенно.
Step 8: Experiment with some other commands
Detached mode - запуск сервисов в фоне
docker-compose up -d
Просмотр того, что в текущий момент запущено
docker-compose ps
Далее:
- Переменные в файлах compose
- environment файл
- использование профайлов для сервисов
- поддержка GPU
- шаринг настроек между проектами и файлами
- построение сетей в compose2
- как работать с compose на проде
- контроль запуска и остановки для compose
Еще один пример для compose - веб сервис и база данных
The following is the docker-compose.yml
for the application:
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
env_file: .env
depends_on:
- db
volumes:
- ./webapp:/opt/webapp
db:
image: postgres:latest
ports:
- "5432:5432"
redis:
image: redis:alpine
ports:
- "6379:6379"
The first section defines the web service. It opens port 5000, sets environment variables defined in .env, and mounts our local code directory as a volume.
services:
web:
build: .
ports:
- "5000:5000"
env_file: .env
depends_on:
- db
volumes:
- ./webapp:/opt/webapp
The next service is the [postgres] database, which opens port 5432 and uses the latest official Postgres image on Docker Hub.
db:
image: postgres:latest
ports:
- "5432:5432"
This section defines our [redis] service, which opens port 6379 and uses the official Redis image on Docker Hub.
redis:
image: redis:alpine
ports:
- "6379:6379"
Now that the local development environment is defined in docker-compose.yml
, you can spin up all three services with one command:
docker-compose up
The following command confirms that all three containers are running:
docker ps
CONTAINER ID IMAGE COMMAND
8e422ff92239 python_web "/bin/sh -c 'python a"
4ac9ecc8a2a3 python_db "/docker-entrypoint.s"
2cbc8febd074 redis:alpine "docker-entrypoint.sh"
Using Docker and defining your local development environment with Docker Compose provides you with a number of benefits:
- By running Redis and Postgres in a Docker container, you don’t have to install or maintain the software on your local machine
- Your entire local development environment can be checked into source control, making it easier for other developers to collaborate on a project
- You can spin up the entire local development environment with one command: docker-compose up
Docker-compose поддерживается на [heroku]
Читай еще про [docker-swarm-rocks]
Про то как отправлять стек образов в [digital-ocean-container-registry] чиатй тут [2021-08-27-daily-note]
В конце этой заметки про ошибку синтаксиса в некоторых командах для compose: [2021-09-07-daily-note]
Environment variables in Compose. Env files для compose v2. Можно так (будут доступны все переменные, при совпадении последняя ихз последнего энва в списке):
env_file:
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
Смотри еще: