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

Создание многоконтейнерных приложений с помощью 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 в вашем проекте.

Ссылка на комментарий
Поделиться на другие сайты

  • Админы

Все основные команды для использования в 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 # удаление неиспользуемых данных и очистка диска
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Вы принимаете наши Условия использования, Политика конфиденциальности, Правила. А также использование Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.

Яндекс.Метрика