В этом посте я расскажу о полном руководстве по использованию docker compose. Вы можете использовать его для создания многоконтейнерного приложения. Но что такое docker compose и почему его следует использовать?
Что такое Docker Compose?
Если вы не знаете, что такое докер, вы можете прочитать об этом здесь. Если у вас есть приложение, работающее в docker, и если это приложение использует несколько других служб, таких как база данных, веб-сервер, балансировщик нагрузки, то вы можете написать несколько файлов docker и запустить несколько контейнеров. Управление этими файлами может быть громоздким. И если вам нужно что-то изменить, возможно, вам придется изменить все файлы.
Docker compose решает эту проблему, позволяя вам записать файл YAML для определения нескольких контейнеров в одном файле. Вы пишете один файл dockerfile, создаете и запускаете этот файл для всех контейнеров.
Установка Docker Compose
Основываясь на определении из docker , docker compose – это инструмент для определения и запуска нескольких контейнеров Docker.
В зависимости от вашей среды вам придется воспользоваться инструкциями по установке docker compose. Вам также понадобится docker engine, прежде чем вы сможете установить docker compose. Я использую среду Windows, поэтому я покажу эти инструкции здесь.
- Запустите Powershell в режиме администратора
- Запустите эту команду – [Net.ServicePointManager]::SecurityProtocol = [Сеть. SecurityProtocolType]::Tls 12
- Затем выполните следующую команду – Invoke-WebRequest ” https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Windows-x86_64.exe “ -UseBasicParsing -outfile использовать базовый синтаксический анализ $Env:ProgramFiles\Docker\docker-compose.exe Это приведет к установке docker compose. Откройте новую командную строку и введите первую команду
docker-compose -версия
Это должно предоставить версию docker-compose, если ваша установка прошла без каких-либо проблем.
Настройка приложения Spring Boot с помощью Docker
Чтобы продемонстрировать мощь docker-compose, мы будем использовать простое приложение spring boot со списком дел. Я поделюсь этим приложением в репозитории GitHub вместе с файлом docker compose. Но это приложение включает в себя следующие приложения, которые мы будем использовать в docker compose:
- Применение пружинной загрузки
- Java версии 8
- MySQL для базы данных
- Скрытый ключ для аутентификации
- Postgres для базы данных
Поэтому я не буду показывать реализацию приложения Spring Boot. Если вы хотите загрузить это приложение, вы можете посетить репозиторий Github или вы можете прочитать мой предыдущий пост здесь .
Мы создадим dockerfile для этого приложения Spring Boot, и оно будет запускаться в собственном контейнере. Теперь это приложение подключается к Keycloak и базе данных MySQL для аутентификации. Keycloak будет использовать базу данных Postgres вместо использования той же базы данных MySQL.
Файл docker для приложения Spring Boot будет выглядеть следующим образом:
FROM openjdk:8-jdk-alpine VOLUME /tmp COPY ./build/libs/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
Этот файл dockerfile в основном загружает Open JDK 8. Он монтирует диск по адресу /tmp
. Он копирует jar-файл приложения как app.jar
. И, конечно же, он запустит приложение, запустив java -jar
.
Как написать файл Docker Compose
Теперь появляется файл docker-compose.yml
. Это будет выглядеть так, как показано ниже:
version: "3.8" services: web: build: . ports: - "8080:8080" depends_on: - db - keycloak environment: SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/todolist?autoReconnect=true&useSSL=false SPRING_DATASOURCE_USERNAME: betterjavacode SPRING_DATASOURCE_PASSWORD: betterjavacode KEYCLOAK_URI: http://keycloak:8180/auth REALM: SpringBootKeycloakApp networks: - common-network db: image: mysql:5.7 ports: - "3307:3306" restart: always environment: MYSQL_DATABASE: todolist MYSQL_USER: betterjavacode MYSQL_PASSWORD: betterjavacode MYSQL_ROOT_PASSWORD: root volumes: - db-data:/var/lib/mysql networks: - common-network postgres: image: postgres volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: password networks: - common-network keycloak: image: jboss/keycloak ports: - "8180:8180" command: ["-Djboss.socket.binding.port-offset=100"] environment: DB_VENDOR: POSTGRES DB_ADDR: postgres DB_DATABASE: keycloak DB_USER: keycloak DB_PASSWORD: password DB_SCHEMA: public KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: Pa55w0rd depends_on: - postgres networks: - common-network networks: common-network: driver: bridge volumes: db-data: driver: local postgres_data: driver: local
Первая строка в этом файле docker-compose – это версия вашего docker-compose.
сервисы
определяют различные типы сервисов, которые мы будем использовать для создания нашего контейнера docker. веб-служба использует образ, который создается из файла docker. В нашем случае мы создаем образ docker нашего приложения Spring Boot. Это приложение будет работать на порту 8080. Мы также должны убедиться, что передаем необходимые переменные среды. Как вы видите в файле, мы используем нашу базу данных в качестве базы данных и переменной SPRING_DATASOURCE_URL
показывает это. db – это имя нашей службы базы данных, к которой будет подключаться наше приложение.
Наша служба баз данных db
работает на хост-порту 3307, но использует порт 3306 (порт по умолчанию) в контейнере. Это связано с тем, что на моем хост-компьютере запущен MySQL с портом 3306, поэтому, чтобы избежать конфликта портов, я использую 3307.
У нас есть еще одна служба базы данных postgres
в нашем файле docker compose. Который использует порты по умолчанию 5432 и именно поэтому здесь не указан. Keycloak пользователя postgres как часть всего этого приложения. Если вы не укажете postgres, Keycloak по умолчанию будет использовать базу данных H2 в памяти. Проблема с базой данных в памяти заключается в том, что как только вы остановите свой контейнер, он потеряет все данные. Чтобы избежать этого, я использую реальную базу данных, которая сохранит нашу область и данные пользователей.
Другой сервис, который мы используем, – это keycloak
. Это наш IDP для аутентификации. Служба запущена на порту 8180. Для подключения он использует базу данных Postgres. Командная часть службы keycloak предписывает запустить службу на порту 8180 в контейнере вместо 8080 по умолчанию.
сети
сервис определяет, что все эти контейнеры являются частью одной и той же сети common-network
с драйвером типа bridge. Чтобы убедиться, что мы можем использовать базу данных, нам необходимо смонтировать дисковый том как для баз данных MySQL, так и для Postgres. Мы монтируем эти тома локально.
Запуск контейнеров
Теперь, чтобы запустить контейнеры с приложением, выполните следующую команду (убедитесь, что вы создали свое приложение)
докер-создание
Это позволит создать контейнеры Docker для всех наших сервисов и запустить их. Теперь, если мы получим доступ к нашему приложению по адресу http://localhost:8080
Если пользователь нажимает на Получите все задачи
, пользователь увидит экран входа в систему keycloak, как показано ниже:
Введите имя пользователя и пароль, и пользователь увидит задачи для вошедшего в систему пользователя.
Полезные команды
docker-compose up
– Эта команда создаст контейнеры docker и запустит их.
docker-compose up -d
– Это аналогичная команда, как указано выше, за исключением того, что она будет запускать все процессы в фоновом режиме.
docker-compose stop
– Остановка служб docker. Это сохранит предыдущее состояние контейнеров даже после того, как вы остановили контейнеры.
docker-начало создания
– Запустите службы docker
docker- создание журналов
– Показывать журналы из контейнеров docker
docker-создать ps
– Список контейнеров Docker
docker-compose выполнить
– Запустите одноразовую команду. Пример – docker-compose запустить web env
– Перечислите переменные среды веб-службы.
Преимущества Docker Compose
- Запустив большинство служб в docker, вам не нужно устанавливать эти службы в своей среде.
- Проще сотрудничать в среде разработки с другими разработчиками, проверяя исходный код в системе управления версиями с помощью docker-compose.
- Быстрая и простая настройка. Вы можете запускать свои сервисы на разных платформах.
Предварительное использование docker compose
Кое-что, о чем я не упоминал в этом посте, – это использование network
в качестве сервиса, который вы действительно можете расширить с помощью docker compose. Это также позволяет вам запускать балансировщик нагрузки (или обратный прокси-сервер, такой как nginx
) и управлять нагрузкой с нескольких хостов.
Вместо использования переменных среды вы также можете использовать .env
файл для переменных среды и загружать его при запуске контейнеров.
Вывод
В этом посте я показал, как вы можете использовать docker compose для запуска нескольких контейнеров с помощью одного файла docker compose. Это также позволяет вам легко управлять своей средой.
Рекомендации
- Docker Compose – компоновка докера
- Keycloak – Контейнеры для скрытия ключей
Оригинал: “https://dev.to/betterjavacode/the-complete-guide-to-use-docker-compose-2gh7”