Эта статья изначально была опубликована в личном блоге Flex.:Нажмите, чтобы прыгнуть
предисловие
До докера перевод проекта на тест был хлопотнее. Во-первых, создание тестовой среды займет много времени, а затем в процессе тестирования часто бывают случаи, когда говорят, что тест является ошибкой, а разработка — невоспроизводимой, что приводит к разрывам.
В этой статье описано, как развернуть приложение Java в Docker. В основном он описывает следующие части:
- докер развернуть mysql
- докер развернуть ActiveMQ
- Docker развертывает кластер elasticsearch
- докер развертывает Java-приложение
- Docker развертывает nginx как статический сервер и прокси-сервер
Структура проекта следующая:
В этой системе есть три основных модуля OMS, DAS и реестр Eureka. Среди них OMS и DAS используют очередь сообщений activemq для взаимодействия с большим объемом данных, а затем используют базу данных mysql для хранения основных бизнес-данных. Используйте elasticsearch для хранения очень больших объемов данных.
Традиционное развертывание программного обеспечения и развертывание докеров
Этот проект устанавливается в виде трех частей во время развертывания Windows — пакет среды ENV (защита mysql, es и т. д.), пакет продукта OMS, пакет продукта DAS. Итак, изначально моя идея заключалась в том, чтобы иметь все программное обеспечение, необходимое для пакета среды ENV, в одном контейнере, DAS в одном контейнере и OMS в одном контейнере. Потом в процессе практики чувствуется все больше и больше неправильности, конфигурация окружения усложняется, и появляется ощущение использования контейнера как виртуальной машины, а смысла упрощения нет.
остановил операцию и начал учиться пользоваться докером. Используя аналогию с арендой дома:
- Традиционный метод развертывания программного обеспечения эквивалентен аренде дома без мебели и отделки. Если мы хотим жить в, мы должны сначала купить всю необходимую мебель, а затем, если мы хотим жить комфортно, мы должны тратить время на отделку и отделку, чтобы дом выглядел лучше. Таким образом, будет сильная зависимость от этого конкретного дома, и будет трудно мигрировать в другой дом (подумайте о таком количестве мебели, техники, всякой всячины...). Если отказаться от всех и переехать в новый дом, цена окажется слишком высокой.
- Использование докера эквивалентно аренде полностью меблированного, хорошо оформленного дома. Нам нужно только принести свои личные вещи, чтобы начать пребывание. Также легко изменить дом, просто приносите свои вещи и меняйте его.
Рекомендуемая операция использования docker — помещение процесса в контейнер для достижения лучшей изоляции и упрощения управления. Давайте развернем наше приложение, используя технологию контейнеров. Он по-прежнему разделен на три части, но каждый процесс использует контейнер для запуска контейнера с нулевой конфигурацией.
настоящий бой
По умолчанию здесь будет установлен докер, и вы разберетесь с основными операциями. Если вы этого не знаете, сначала прочтите эти два:Установить,основное использование
Разверните пакет среды ENV
Инструменты хранения данных, такие как elastricsearch и mysql в пакете среды , должны соответствовать следующим двум требованиям:
- Сохраняйте данные, независимо от того, как создается или уничтожается контейнер, данные не могут быть потеряны.
- Необходимо использовать персонализированный файл конфигурации, и каждый запуск запускается в соответствии с файлом конфигурации.
развернуть mysql
Процесс развертывания mysql с помощью контейнера выглядит следующим образом:
- Сначала извлеките соответствующий образ mysql из docker.hub в соответствии с вашими потребностями.
docker pull mysql:5.7.24
- загрузочный образ
Поскольку для хранения данных используется mysql, данные не могут быть потеряны ни при каких обстоятельствах, поэтому данные существуют вне контейнера и отображаются внутри контейнера посредством операции сопоставления.Параметры следующие:
# 将宿主机的路径,映射到容器内部。这个路径既可以是文件夹,也可以是文件
-v hostPath:containerPath
Очевидно, через этот эвкалипт мы маппируем внешние папки данных и файлы конфигурации в контейнер. Последняя команда для запуска этого контейнера выглядит следующим образом:
# 假设在宿主机中数据存放路径为/opt/mysql/data,配置文件路径为:/opt/mysql/my.cnf
docker run --name=mysql -itd -p 3308:3306 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
Примечание. Если версия mysql 8.x, вам также необходимо отобразить каталог /var/lib/mysql-files в контейнере, иначе при запуске будет сообщено об ошибке.
Ниже описывается значение конкретных параметров:
- -it связан со стандартным вводом и выводом
- -d запустить в фоновом режиме
- -v карта файла
- -e установить переменные среды в контейнер
Вы можете спросить, почему отображение/etc/timezoneи/etc/timezone, это необходимо для того, чтобы время и часовой пояс контейнера соответствовали хосту. По умолчанию контейнер находится в стандартном времени UTC./etc/timezoneСделайте время контейнера, часовой пояс и хост согласованными. Но если вы не наносите на карту/etc/timezoneЧасовой пояс в java-приложении по-прежнему неправильный, хотя при использованииdate -RКоманда просмотра времени и часового пояса нормальная.
Развернуть elasticsearch, контейнер activeMQ
Как es, так и activeMQ зависят от среды выполнения Java, поэтому существует два метода развертывания:
- Непосредственно извлекает es, activeMQ соответствует образу и развертывает контейнер с помощью сопоставления путей для запуска.
- Запуск es и activeMQ в образе Java
Второй метод используется в качестве примера для иллюстрации.
Создайте образ Java
Вместо того, чтобы извлекать образ из Docker Hub, создайте собственный образ через dockerfile. Поскольку требуется только одна среда выполнения Java, просто добавьте среду выполнения jre в базовый образ Linux (здесь выберите Ubuntu). Производственный процесс выглядит следующим образом:
Сначала создайте папкуdockerFileTestХраните зависимости и файлы dockerfile.
Затем поместите загруженную и загруженную рабочую среду jre вdockerFileTest/jreПод содержанием.
Затем создайте файл Dockerfile в каталоге dockerFileTest со следующим содержимым:
#说明基础镜像,默认:latest
FROM ubuntu
#将当前路径下的jre文件夹复制到新镜像下的/opt/jre路径
COPY jre /opt/jre
#设置环境变量
ENV JAVA_HOME=/opt/jre CLASSPATH=/opt/jre/lib PATH=$PATH:/opt/jre/bin
Наконец, сгенерируйте новый образ с помощью команды ``jre:v1
Создайте контейнер elasticsearch
Загрузите es-файл, если он хранится в /root/es1, и создайте es-контейнер с помощью следующей команды:
docker run --name=es1 -itd -p 9200:9200 -p 9300:9300 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /root/es1:/opt/es -w /opt/es jre:v1 ./bin/elasticsearch -Des.insecure.allow.root=true
Смысл параметров следующий:
- -w containerPath Установить рабочий каталог контейнера в containerPath
Приведенная выше команда использует es1 в качестве имени контейнера, сопоставляет 9200 и 9300 с портом хоста и использует es1 в качестве имени контейнера../bin/'elasticearch -Des.insecure.allow.root=trueСоздайте контейнер es. Последний добавленный параметр позволяет запускать es в контейнере с правами root.
Создать кластер es
Сделайте копию предыдущего es1 с именем es2 в качестве узла 2. Чтобы два es-узла образовали es-кластер, необходимо обеспечить связь между узлами.Здесь мы используем--linkПараметры, позволяющие es2 подключаться к es1 для формирования кластера.--linkИспользование заключается в следующем:
--link containerName[:alias]
Команда запуска es2 выглядит следующим образом:
docker run --name=es2 -itd -p 9201:9200 -p 9301:9300 --link es1 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /root/es2:/opt/es -w /opt/es jre:v1 ./bin/elasticsearch -Des.insecure.allow.root=true
Затем вы можете получить доступ к es1 в es2 через имя контейнера es1 (на самом деле запись добавляется к хосту es2, указывающая es1 на IP-адрес es1, который является IP-адресом, назначенным виртуальной сетевой картой докера).
Но использование --link имеет некоторые ограничения, контейнер, подключенный через этот параметр, должен существовать. Следовательно, этот параметр можно использовать только в том случае, когда B зависит от A. Если A также зависит от B (то есть A и B должны иметь доступ друг к другу), в этом случае его нельзя реализовать через ссылку, и надо думать о причинах. . .
Развернуть ActiveMQ
Запуск ActiveMQ в контейнере немного отличается от запуска es. ActiveMQ запускается в фоновом режиме по умолчанию, и программа запуска завершится после завершения запуска, поэтому, если вы напрямую используете./bin/activemq start(Предполагая, что текущий каталог находится в ActiveMQ), запуск контейнера обнаружит, что контейнер перестает работать после успешного запуска ActiveMQ. Это происходит потому, что容器中启动的第一个进程结束后,容器就会被docker关闭掉. Таким образом, нам нужно только позволить первому процессу не заканчиваться, поэтому нам нужно написать сценарий запуска, чтобы запустить activemq и отслеживать статус выполнения.Как только процесс activemq зависнет, завершите сценарий запуска, иначе он продолжит работу. Код стартового скрипта выглядит следующим образом:
#!/bin/bash
#使用sh脚本启动activemq,然后定时判断服务是否被关闭,关闭后退出脚本,否则一致循环。
#为避免docker容器在active自带的启动脚本运行结束后就关闭容器了。
#获取启动pid
out=`./bin/activemq start`
echo "$out"
pid=`echo $out | grep -Eo "pid '[0-9]+'" | grep -Eo "[0-9]+"`
echo "当前mq进程pid为:${pid}"
if [ ${#pid} = 0 ]; then
echo "启动失败"
exit 0
fi
while true; do
num=`ps -e | grep -cwE "$pid"`
if [ $num = 0 ]; then
echo "进程异常关闭"
exit 0
fi
sleep 1
done
Затем используйте этот сценарий в качестве сценария запуска для запуска контейнера. Команда запуска выглядит следующим образом: (при условии, что каталог activemq — /opt/activemq, а путь сценария запуска — /opt/activemq/start.sh)
docker run --name=activemq -itd -p 8161:8161 -p 61616:61616 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /root/activemq:/opt/activemq -w /opt/activemq jre:v1 /bin/bash ./start.sh
Разверните пакет среды Java
По-прежнему используйте образ jar, созданный ранее, для запуска приложения Java. Вот пример развертывания пакета jar. Если вы развертываете пакет war, вам необходимо развернуть его на образе tomcat. Обратите особое внимание на настройки времени и часового пояса контейнера, иначе в java-программе невозможно получить правильное время и часовой пояс. Здесь время и часовой пояс контейнера такие же, как у хоста, путем сопоставления файлов локального времени и часового пояса хоста. Команда запуска выглядит следующим образом:
# 启动oms
docker run -itd --name=oms -p 8082:9090 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /root/oms.jar:/opt/oms.jar -w /opt --link es1 --link activemq --link oms-mysql --link eureka-server jre:v1 java -jar oms.jar
# 启动das
docker run -itd --name=das -p 8083:9099 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /root/das.jar:/opt/oms -w /opt --link es1 --link activemq --link oms-mysql --link eureka-server jre:v1 java -jar das.jar
В этой статье просто описано, как использовать一容器一进程способ развертывания java-приложений.
PS: Не рекомендуется использовать такую прямую ручную команду, рекомендуется использовать docker-compose
Эта статья изначально была опубликована в личном блоге Flex.:Нажмите, чтобы прыгнуть
Отсканируйте код и подпишитесь на общедоступную учетную запись WeChat: учебные заметки FleyX, получите больше галантерейных товаров