Рубрики
Без рубрики

Полное руководство по использованию Docker Compose

В этом посте я расскажу о полном руководстве по использованию docker compose. Вы можете использовать его для создания мульти… Помеченный docker, springboot, java.

В этом посте я расскажу о полном руководстве по использованию 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:

  1. Применение пружинной загрузки
  2. Java версии 8
  3. MySQL для базы данных
  4. Скрытый ключ для аутентификации
  5. 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. Это также позволяет вам легко управлять своей средой.

Рекомендации

  1. Docker Compose – компоновка докера
  2. Keycloak – Контейнеры для скрытия ключей

Оригинал: “https://dev.to/betterjavacode/the-complete-guide-to-use-docker-compose-2gh7”