Перейти к содержанию

Создание многоконтейнерных приложений с помощью Docker Compose

Опубликовано
  • Админы

Во всех инструментах которые я использую на серверах, я предпочитаю использовать docker-compose.

Да, при большом количестве запускаемых контейнеров это будет не удобно (хотя для этих целей есть kubernetes), но мои личные проекты не такие большие.

Глава 1: Введение в Docker Compose

Docker Compose - это инструмент для определения и запуска многоконтейнерных Docker-приложений. Он позволяет определить контейнеры, сети и тома в файле docker-compose.yml, а затем запустить их одной командой.

Docker Compose позволяет:

  • - Определить несколько контейнеров в одном файле
  • - Определить зависимости между контейнерами
  • - Определить сети и тома для контейнеров
  • - Запустить все контейнеры одной командой
  • - Легко масштабировать приложение

Глава 2: Установка Docker Compose

Перед тем, как начать использовать Docker Compose, необходимо установить его на вашу машину. Docker Compose поставляется в составе Docker Desktop для Windows и Mac. Для установки на Linux, следуйте инструкциям на официальном сайте Docker или по статьям на нашем форуме.

Глава 3: Определение контейнеров в файле docker-compose.yml

Создайте файл docker-compose.yml в корневой директории вашего проекта. В этом файле вы определяете контейнеры, сети, тома и другие параметры для вашего приложения.

Пример определения двух контейнеров: базы данных MySQL и веб-сервера NGINX.

Цитата

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db

В этом примере мы определяем два сервиса: db и web. Сервис db использует официальный образ MySQL версии 5.7 и устанавливает переменную окружения MYSQL_ROOT_PASSWORD. Сервис web использует официальный образ NGINX и пробрасывает порт 80. Также мы определяем зависимость web от db, т.е. контейнер db будет запущен перед контейнером web.

# Глава 4: Запуск контейнеров с помощью Docker Compose

После того, как вы определили контейнеры в docker-compose.yml, вы можете запустить их одной командой:

docker-compose up

Но при нажатии ctrl + c - контейнеры будут остановлены.


Эта команда запустит все контейнеры, определенные в файле docker-compose.yml. Если вы хотите запустить контейнеры в фоновом режиме, используйте флаг -d:

docker-compose up -d


Чтобы остановить контейнеры, используйте команду:

docker-compose down

Глава 5: Работа с сетями и томами

Docker Compose позволяет легко работать с сетями и томами для ваших контейнеров. В этой главе мы рассмотрим, как настроить сети и тома в Docker Compose и как использовать их для эффективной работы с данными и взаимодействия между контейнерами.

Создание и управление сетями в Docker

Создание сети

В Docker для создания новой сети используется команда docker network create. Например, допустим, вы хотите создать сеть с именем my_network. Выполните следующую команду:

docker network create my_network

Просмотр списка сетей

Чтобы просмотреть список всех сетей в Docker, выполните команду docker network ls.

docker network ls


Просмотр информации о сети

Чтобы просмотреть информацию о конкретной сети в Docker, выполните команду docker network inspect с именем сети. Например:

docker network inspect my_network


Подключение контейнера к сети

Чтобы подключить контейнер к сети, используйте параметр --network при запуске контейнера. Например:

docker run --network my_network my_image


Удаление сети

Чтобы удалить сеть, используйте команду docker network rm. Например:

docker network rm my_networ

Чтобы удалить все неиспользуемые сети:

docker network prune


Использование сетей в Docker Compose

Создание сети

Для создания сети в Docker Compose необходимо определить ее в файле docker-compose.yml. Например:

Цитата

 

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
    networks:
      - app_net
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app_net

networks:
  app_net:

 


В этом примере мы создаем сеть app_net и определяем, что контейнеры db и web должны использовать эту сеть.

Подключение контейнера к сети

Чтобы подключить контейнер к сети в Docker Compose, используйте параметр networks в определении сервиса. Например:

Цитата

 

version: "3.9"
services:
  my_service:
    image: my_image
    networks:
      - app_net

networks:
  app_net:

 


В этом примере мы определяем, что сервис my_service должен использовать сеть app_net.

Использование инструментов для работы с сетями

Docker Compose

Docker Compose позволяет легко создавать и управлять сетями для ваших контейнеров. Мы уже рассмотрели, как создавать сети в Docker Compose и как подключать контейнеры к этим сетям.

Docker Swarm

Docker Swarm - это инструмент для создания и управления кластером Docker. Он также позволяет создавать и управлять сетями для ваших контейнеров. Чтобы создать новую сеть в Docker Swarm, выполните команду docker network create с опцией --driver. Например:

docker network create --driver overlay my_network


Weave Net

Weave Net - это инструмент для создания виртуальных сетей в Docker. Он позволяет создавать сети, которые могут пересекать границы хостов, и обеспечивает высокую производительность и безопасность. Чтобы использовать Weave Net, вам необходимо установить его и запустить на всех хостах, где будут выполняться ваши контейнеры.

Calico

Calico - это инструмент для создания сетей в Kubernetes. Он позволяет создавать сети для кластеров Kubernetes и обеспечивает высокую производительность и безопасность. Для создания сетей в Kubernetes вам необходимо настроить Calico в кластере.

Flannel

Flannel - это инструмент для создания виртуальных сетей в Kubernetes. Он позволяет создавать сети, которые могут пересекать границы хостов, и обеспечивает высокую производительность и безопасность. Для использования Flannel в Kubernetes вам необходимо установить его и настроить его в кластере.

 

Работа с томами

Docker Compose также позволяет легко работать с томами для ваших контейнеров. Для создания тома в Docker Compose необходимо определить его в файле docker-compose.yml.

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

Цитата

 

version: "3.9"
services:
  app:
    image: your-app-image:latest
    volumes:
      - app_logs:/var/log/app

volumes:
  app_logs:

 


В этом примере мы определяем сервис app, который использует образ вашего приложения. Мы также определяем том app_logs в разделе volumes.

Обратите внимание на параметр volumes в определении сервиса app. Мы указываем, что контейнер app должен использовать том app_logs для хранения лог-файлов. Это позволяет сохранять лог-файлы между запусками контейнеров и использовать их для анализа и отладки.

Глава 6: Масштабирование приложения

Docker Compose позволяет легко масштабировать ваше приложение и управлять им. В этой главе мы рассмотрим, как масштабировать контейнеры с помощью Docker Compose и как использовать инструменты мониторинга и логирования для отслеживания состояния вашего приложения.

Масштабирование контейнеров

Docker Compose позволяет масштабировать контейнеры с помощью флага `--scale`. Например, допустим, у вас есть приложение, состоящее из трех контейнеров: базы данных, веб-сервера и приложения. Если вы хотите запустить два экземпляра веб-сервера, вы можете использовать команду:

docker-compose up --scale web=2

 

Эта команда запустит два экземпляра контейнера `web`.

Использование инструментов мониторинга и логирования

Docker Compose также позволяет использовать инструменты мониторинга и логирования, такие как Prometheus и ELK stack, для отслеживания состояния ваших контейнеров и приложения.

Пример использования Prometheus

Prometheus - это система мониторинга и оповещения, которая позволяет отслеживать состояние ваших контейнеров и приложений. Для использования Prometheus в Docker Compose необходимо добавить соответствующий сервис в файл `docker-compose.yml`.

Цитата

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

 

В этом примере мы добавили сервис `prometheus` в наш файл `docker-compose.yml`. Мы монтируем файл конфигурации `prometheus.yml` в контейнер `prometheus` и пробрасываем порт 9090 для доступа к веб-интерфейсу Prometheus.

Пример файла `prometheus.yml`:

Цитата

 

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['prometheus:9090']
  - job_name: 'web'
    scrape_interval: 5s
    static_configs:
      - targets: ['web:80']
  - job_name: 'db'
    scrape_interval: 5s
    static_configs:
      - targets: ['db:3306']

 


 

В этом примере мы определяем три job для мониторинга сервисов `prometheus`, `web` и `db`. Мы указываем, что мониторинг будет осуществляться каждые 5 секунд и указываем адреса контейнеров, которые мы хотим мониторить.

Пример использования ELK stack

ELK stack - это набор инструментов для сбора, обработки и анализа логов. Для использования ELK stack в Docker Compose необходимо добавить соответствующие сервисы в файл `docker-compose.yml`.

Цитата

 

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - LOGSTASH_HOST=logstash
  web:

    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
  logstash:
    image: logstash:latest
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - "5044:5044"

 


В этом примере мы добавили сервисы web, db и logstash в наш файл docker-compose.yml. Мы также определяем настройки логирования для контейнера web: мы используем драйвер json-file и ограничиваем размер лог-файлов до 10 мегабайт с максимальным количеством файлов 3.

Мы также монтируем файл конфигурации logstash.conf в контейнер logstash и пробрасываем порт 5044 для приема логов.

Пример файла logstash.conf:

Цитата

input {
  beats {
    port => 5044
  }
}
filter {
  if [source] =~ /web/ {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "weblogs-%{+YYYY.MM.dd}"
  }
}


В этом примере мы определяем входную точку для логов, используя протокол Beats на порту 5044. Мы также определяем фильтр для обработки логов веб-сервера с помощью регулярного выражения Grok. Наконец, мы отправляем логи в Elasticsearch для дальнейшего анализа и хранения.

 

Глава 7: Создание многоконтейнерных приложений

Docker Compose - это инструмент для создания и управления многоконтейнерными приложениями. В этой главе мы рассмотрим, как создать многоконтейнерное приложение с помощью Docker Compose и как настроить взаимодействие между контейнерами.

Создание многоконтейнерного приложения

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

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

Цитата

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db
  app:
    image: your-app-image:latest
    depends_on:
      - db
    environment:
      - DB_HOST=db


В этом примере мы определяем три сервиса: db, web и app.

  • Сервис db использует образ MySQL версии 5.7 и задает переменную окружения MYSQL_ROOT_PASSWORD.
  • Сервис web использует образ Nginx и пробрасывает порт 80 для доступа к веб-серверу.
  • Сервис app использует ваш образ приложения и задает переменную окружения DB_HOST, указывающую, что приложение зависит от контейнера базы данных.

Настройка взаимодействия между контейнерами

Для настройки взаимодействия между контейнерами вы можете использовать параметр depends_on в файле docker-compose.yml. Например, допустим, ваше приложение должно использовать базу данных MySQL. В этом случае вы можете определить зависимость приложения от контейнера базы данных следующим образом:

Цитата

version: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
  app:
    image: your-app-image:latest
    depends_on:
      - db
    environment:
      - DB_HOST=db


В этом примере мы определяем, что сервис app зависит от сервиса db. Мы также задаем переменную окружения DB_HOST, чтобы приложение могло обращаться к контейнеру базы данных.

Вы также можете использовать параметр links, чтобы связать контейнеры между собой. Например, допустим, ваше приложение должно использовать веб-сервер Nginx. В этом случае вы можете определить зависимость приложения от контейнера веб-сервера следующим образом:

Цитата

version: "3.9"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: your-app-image:latest
    links:
      - web
    environment:
      - WEB_HOST=web


В этом примере мы определяем, что сервис app зависит от сервиса web. Мы также задаем переменную окружения WEB_HOST,

 

Заключение

Docker Compose - это мощный инструмент для создания и управления многоконтейнерными приложениями. В этой статье мы рассмотрели, как масштабировать контейнеры с помощью Docker Compose и как использовать инструменты мониторинга и логирования для отслеживания состояния вашего приложения. Надеюсь, эта статья помогла вам лучше понять, как использовать Docker Compose в вашем проекте.

Featured Replies

Опубликовано
  • Автор
  • Админы

Все основные команды для использования в Docker:

 

 

# справочная информация
docker --help # список доступных команд
docker <command> --help # информация по команде
 
docker --version # версия Docker
docker info # общая информация о системе
 
# работа с образами
docker search debian # поиск образов по ключевому слову debian
 
docker pull ubuntu # скачивание последней версии (тег по умолчанию latest) официального образа ubuntu (издатель не указывается) из репозитория по умолчанию docker.io/library
docker pull prom/prometheus # скачивание последней версии (latest) образа prometheus от издателя prom из репозитория docker.io/prom
docker pull docker.io/library/ubuntu:18.04 # скачивание из репозитория docker.io официального образа ubuntu с тегом 18.04
 
docker images # просмотр локальных образов
 
docker rmi <image_name>:<tag> # удаление образа. Вместо <image_name>:<tag> можно указать <image_id>. Для удаления образа все контейнеры на его основе должны быть как минимум остановлены
docker rmi $(docker images -aq) # удаление всех образов
 
# работа с контейнерами
docker run hello-world # Hello, world! в мире контейнеров
docker run -it ubuntu bash # запуск контейнера ubuntu и выполнение команды bash в интерактивном режиме
docker run --name docker-getting-started --publish 8080:80 docker/getting-started # запуск контейнера gettind-started с отображением (маппингом) порта 8080 хоста на порт 80 внутрь контейнера
docker run --detach --name mongodb docker.io/library/mongo:4.4.10 # запуск контейнера mongodb с именем mongodb в фоновом режиме. Данные будут удалены при удалении контейнера!
 
docker ps # просмотр запущенных контейнеров
docker ps -a # просмотр всех контейнеров (в том числе остановленных)
docker stats --no-stream # просмотр статистики
 
docker start alpine # создание контейнера из образа alpine
 
docker start <container_name> # запуск созданного контейнера. Вместо <container_name> можно указать <container_id>
docker start $(docker ps -a -q) # запуск всех созданных контейнеров
 
docker stop <container_name> # остановка контейнера. Вместо <container_name> можно указать <container_id>
docker stop $(docker ps -a -q) # остановка всех контейнеров
 
docker rm <container_name> # удаление контейнера. Вместо <container_name> можно указать <container_id>
docker rm $(docker ps -a -q) # удаление всех контейнеров
 
# система
docker system info # общая информация о системе (соответствует docker info)
docker system df # занятое место на диске
docker system prune -af # удаление неиспользуемых данных и очистка диска

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу
Яндекс.Метрика

Account

Navigation

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.