Этот блог расскажет, как создать мультиконтейнерное приложение, развернутое на нескольких хостах с помощью Docker. Это будет достигнуто с помощью Docker Machine, Swarm и Compose.
Да, все три инструмента вместе делают этот блог намного интереснее!
Диаграмма объясняет ключевые компоненты:
- Docker Machine используется для предоставления нескольких хостов Docker
- Docker Swarm будет использоваться для создания кластера с несколькими хостами
- Каждый узел в кластере Docker Swarm зарегистрирован / обнаружен с помощью Consul
- Мультиконтейнерное приложение будет развернуто с помощью Docker Compose
- WildFly и Couchbase предоставляются на разных хостах
- Для связи WildFly и Couchbase используется многоузловая сеть Docker.
Кроме того, Maven используется для настройки Couchbase и развертывания приложения в WildFly.
Последние инструкции в Docker для разработчиков Java .
Никакой истории, только чистый код, давайте сделаем это!
Создание службы обнаружения с помощью Docker Machine
- Создайте машину, на которой будет размещена служба обнаружения:
docker-machine create -d=virtualbox consul-machine Running pre-create checks... Creating machine... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Provisioning created instance... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... To see how to connect Docker to this machine, run: docker-machine env consul-machine
- Подключитесь к этой машине:
eval $(docker-machine env consul-machine)
- Запустите службу Consul, используя следующий файл Compose:
myconsul: image: progrium/consul restart: always hostname: consul ports: - 8500:8500 command: "-server -bootstrap"
Этот файл Compose доступен по адресу https://github.com/arun-gupta/docker-images/blob/master/consul/docker-compose.yml .
docker-compose up -d Pulling myconsul (progrium/consul:latest)... latest: Pulling from progrium/consul 3b4d28ce80e4: Pull complete e5ab901dcf2d: Pull complete 30ad296c0ea0: Pull complete 3dba40dec256: Pull complete f2ef4387b95e: Pull complete 53bc8dcc4791: Pull complete 75ed0b50ba1d: Pull complete 17c3a7ed5521: Pull complete 8aca9e0ecf68: Pull complete 4d1828359d36: Pull complete 46ed7df7f742: Pull complete b5e8ce623ef8: Pull complete 049dca6ef253: Pull complete bdb608bc4555: Pull complete 8b3d489cfb73: Pull complete c74500bbce24: Pull complete 9f3e605442f6: Pull complete d9125e9e799b: Pull complete Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274 Status: Downloaded newer image for progrium/consul:latest Creating consul_myconsul_1
Запущенный контейнер можно проверить как:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f05d8dd11e7f progrium/consul "/bin/start -server -" 30 seconds ago Up 29 seconds 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 0.0.0.0:8500->8500/tcp, 8301-8302/udp consul_myconsul_1
Создание Docker Swarm Cluster с использованием Docker Machine
Swarm полностью интегрирован с Machine, и поэтому это самый простой способ начать работу.
- Создайте Swarm Master и укажите на службу обнаружения Consul:
docker-machine create -d virtualbox --virtualbox-disk-size "5000" --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-master Running pre-create checks... Creating machine... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Provisioning created instance... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Configuring swarm... To see how to connect Docker to this machine, run: docker-machine env swarm-master
Несколько вариантов, чтобы посмотреть здесь:
--swarm
настраивает машину с помощью Swarm--swarm-master
настраивает созданную Машину, чтобы быть хозяином Swarm--swarm-discovery
определяет адрес службы обнаружения--cluster-advertise
рекламировать машину в сети--cluster-store
назначить распределенный бэкэнд хранилища K / V для кластера--virtualbox-disk-size
устанавливает размер диска для созданного компьютера на 5 ГБ. Это необходимо для того, чтобы образ WildFly и Couchbase можно было загрузить на любой из узлов.
- Найдите некоторую информацию об этой машине:
docker-machine inspect --format='{{json .Driver}}' swarm-master {"Boot2DockerImportVM":"","Boot2DockerURL":"","CPU":1,"DiskSize":5000,"HostOnlyCIDR":"192.168.99.1/24","HostOnlyNicType":"82540EM","HostOnlyPromiscMode":"deny","IPAddress":"192.168.99.102","MachineName":"swarm-master","Memory":1024,"NoShare":false,"SSHPort":51972,"SSHUser":"docker","StorePath":"/Users/arungupta/.docker/machine","SwarmDiscovery":"consul://192.168.99.100:8500","SwarmHost":"tcp://0.0.0.0:3376","SwarmMaster":true,"VBoxManager":{}}
Обратите внимание, что размер диска составляет 5 ГБ.
- Подключитесь к мастеру с помощью команды:
eval "$(docker-machine env --swarm swarm-master)"
- Найдите некоторую информацию о кластере:
docker info Containers: 2 Images: 1 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 1 swarm-master: 192.168.99.102:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs CPUs: 1 Total Memory: 1.021 GiB Name: d074fd97682e
- Создайте новый компьютер, чтобы присоединиться к этому кластеру:
docker-machine create -d virtualbox --virtualbox-disk-size "5000" --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-01 Running pre-create checks... Creating machine... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Provisioning created instance... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Configuring swarm... To see how to connect Docker to this machine, run: docker-machine env swarm-node-01
--swarm-master
В этой команде указывается номер уведомления . Это гарантирует, что созданные Машины являются рабочими узлами. - Создайте второй узел Swarm, чтобы присоединиться к этому кластеру:
docker-machine create -d virtualbox --virtualbox-disk-size "5000" --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-02 Running pre-create checks... Creating machine... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Provisioning created instance... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Configuring swarm... To see how to connect Docker to this machine, run: docker-machine env swarm-node-02
- Перечислите все созданные машины:
docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM consul-machine - virtualbox Running tcp://192.168.99.100:2376 swarm-master * virtualbox Running tcp://192.168.99.101:2376 swarm-master (master) swarm-node-01 - virtualbox Running tcp://192.168.99.102:2376 swarm-master swarm-node-02 - virtualbox Running tcp://192.168.99.103:2376 swarm-master
Машины, которые являются частью кластера, имеют имя кластера в столбце SWARM, в противном случае пустым. Например,
consul-machine
это отдельная машина, где все остальные машины являются частьюswarm-master
кластера. Мастер Роя также идентифицирован (мастер) в столбце Рой. - Подключитесь к кластеру Swarm и найдите некоторую информацию об этом:
eval "$(docker-machine env --swarm swarm-master)" docker info
Примечание
--swarm
: указывается для подключения к кластеру Swarm. В противном случае команда будет подключаться только кswarm-master
компьютеру. Это показывает вывод в виде:docker info Containers: 4 Images: 3 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 3 swarm-master: 192.168.99.102:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs swarm-node-01: 192.168.99.103:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs swarm-node-02: 192.168.99.104:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs CPUs: 3 Total Memory: 3.064 GiB Name: d074fd97682e
Есть 3 узла — один мастер Swarm и 2 рабочих узла Swarm . Всего в этом кластере работает 4 контейнера — один агент Swarm на главном и каждый узел, а на главном работает дополнительный Swarm-agent-master. Это можно проверить, подключившись к мастеру и перечислив все контейнеры.
- Перечислите узлы в кластере с помощью следующей команды:
docker run swarm list consul://$(docker-machine ip consul-machine):8500 192.168.99.102:2376 192.168.99.103:2376 192.168.99.104:2376
Запустите среду приложения с помощью Docker Compose
Убедитесь, что вы подключены к кластеру, дав команду eval "$(docker-machine env --swarm swarm-master)"
.
- Перечислите все сети, созданные Docker на данный момент:
docker network ls NETWORK ID NAME DRIVER 33a619ddc5d2 swarm-node-02/bridge bridge e0b73c96ffec swarm-node-02/none null b315e67f0363 swarm-node-02/host host 879d6167be47 swarm-master/bridge bridge f771ddc7d957 swarm-node-01/none null e042754df336 swarm-node-01/host host d2f3b512f9dc swarm-node-01/bridge bridge 5b5bcf135d7b swarm-master/none null fffc34eae907 swarm-master/host host
Docker автоматически создает три сети для каждого хоста: Имя сети Назначение
bridge
Сеть по умолчанию, к которой подключаются контейнеры. Этоdocker0
сеть во всех установках Docker.none
Сетевой стек дляhost
конкретного контейнера Добавляет контейнер в сетевой стек хостов. Конфигурация сети идентична хосту. Это объясняет всего девять сетей, по три на каждый узел, как показано в этом кластере Swarm. - Используйте Compose file для запуска WildFly и Couchbase:
mycouchbase: container_name: "db" image: couchbase/server ports: - 8091:8091 - 8092:8092 - 8093:8093 - 11210:11210 mywildfly: image: arungupta/wildfly-admin environment: - COUCHBASE_URI=db ports: - 8080:8080 - 9990:9990
В этом файле Compose:
- Сервис Couchbase имеет пользовательское имя контейнера, определяемое как
container_name
. Это имя используется при создании новой переменной средыCOUCHBASE_URI
при запуске WildFly. arungupta/wildfly-admin
Изображение используется, поскольку оно связывает управление WildFly со всеми сетевыми интерфейсами, и, кроме того, также предоставляет порт 9990. Это позволяет использовать плагин WildFly Maven для развертывания приложения. Источник этого файла находится по адресу https://github.com/arun- gupta / docker-images / blob / master / wildfly-couchbase-javaee7 / docker-compose.yml .
Эта прикладная среда может быть запущена как:
docker-compose --x-networking up -d Creating network "wildflycouchbasejavaee7" with driver "None" Pulling mywildfly (arungupta/wildfly-admin:latest)... swarm-node-02: Pulling arungupta/wildfly-admin:latest... : downloaded swarm-master: Pulling arungupta/wildfly-admin:latest... : downloaded swarm-node-01: Pulling arungupta/wildfly-admin:latest... : downloaded Creating wildflycouchbasejavaee7_mywildfly_1 Pulling mycouchbase (couchbase/server:latest)... swarm-node-02: Pulling couchbase/server:latest... : downloaded swarm-master: Pulling couchbase/server:latest... : downloaded swarm-node-01: Pulling couchbase/server:latest... : downloaded Creating db
--x-networking
создает оверлейную сеть для кластера Swarm. Это можно проверить, перечислив сети еще раз:docker network ls NETWORK ID NAME DRIVER 5e93fc34b4d9 swarm-node-01/docker_gwbridge bridge 1c041242f51d wildflycouchbasejavaee7 overlay cc8697c6ce13 swarm-master/docker_gwbridge bridge f771ddc7d957 swarm-node-01/none null 879d6167be47 swarm-master/bridge bridge 5b5bcf135d7b swarm-master/none null fffc34eae907 swarm-master/host host e042754df336 swarm-node-01/host host d2f3b512f9dc swarm-node-01/bridge bridge 33a619ddc5d2 swarm-node-02/bridge bridge e0b73c96ffec swarm-node-02/none null b315e67f0363 swarm-node-02/host host
Три новые сети созданы:
- Контейнеры, подключенные к сети с несколькими узлами, автоматически подключаются к
docker_gwbridge
сети. Эта сеть позволяет контейнерам иметь внешнее подключение за пределами своего кластера и создается на каждом рабочем узле. - Новая оверлейная сеть
wildflycouchbasejavaee7
создана. Подключитесь к разным узлам Swarm и убедитесь, что на них существует оверлейная сеть. Начнем с мастера:eval "$(docker-machine env swarm-master)" docker network ls NETWORK ID NAME DRIVER 1c041242f51d wildflycouchbasejavaee7 overlay 879d6167be47 bridge bridge 5b5bcf135d7b none null fffc34eae907 host host cc8697c6ce13 docker_gwbridge bridge
Далее с помощью
swarm-node-01
:eval "$(docker-machine env swarm-node-01)" docker network ls NETWORK ID NAME DRIVER 1c041242f51d wildflycouchbasejavaee7 overlay d2f3b512f9dc bridge bridge f771ddc7d957 none null e042754df336 host host 5e93fc34b4d9 docker_gwbridge bridge
Наконец, с
swarm-node-02
:eval "$(docker-machine env swarm-node-02)" docker network ls NETWORK ID NAME DRIVER 1c041242f51d wildflycouchbasejavaee7 overlay e0b73c96ffec none null b315e67f0363 host host 33a619ddc5d2 bridge bridge
Как видно,
wildflycouchbasejavaee7
оверлейная сеть существует на всех машинах. Это подтверждает, что оверлейная сеть, созданная для кластера Swarm, была добавлена к каждому хосту в кластере.docker_gwbridge
существует только на машинах, на которых запущены контейнеры приложений. Подробнее о Docker Networks .
- Сервис Couchbase имеет пользовательское имя контейнера, определяемое как
- Убедитесь, что WildFly и Couchbase работают:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 23a581295a2b couchbase/server "/entrypoint.sh couch" 9 seconds ago Up 8 seconds 192.168.99.102:8091-8093->8091-8093/tcp, 11207/tcp, 11211/tcp, 192.168.99.102:11210->11210/tcp, 18091-18092/tcp swarm-master/db 7a8a885b23f3 arungupta/wildfly-admin "/opt/jboss/wildfly/b" 9 seconds ago Up 8 seconds 192.168.99.103:8080->8080/tcp, 192.168.99.103:9990->9990/tcp swarm-node-01/wildflycouchbasejavaee7_mywildfly_1
Настроить приложение и базу данных
- Клон https://github.com/arun-gupta/couchbase-javaee.git . Это рабочее пространство содержит простое приложение Java EE, которое развернуто в WildFly и предоставляет REST API поверх
travel-sample
корзины в Couchbase. - Сервер Couchbase может быть настроен с использованием REST API . Приложение содержит профиль Maven, который позволяет настроить сервер Couchbase с
travel-sample
ведром. Это может быть вызвано как:mvn install -Pcouchbase -Ddocker.host=$(docker-machine ip swarm-master) . . . * Server auth using Basic with user 'Administrator' > POST /sampleBuckets/install HTTP/1.1 > Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA== . . . } [data not shown] * upload completely sent off: 17 out of 17 bytes < HTTP/1.1 202 Accepted * Server Couchbase Server is not blacklisted < Server: Couchbase Server . . .
- Разверните приложение в WildFly, указав три параметра:
- IP-адрес хоста, на котором работает WildFly
- Имя пользователя в административной сфере WildFly
- Пароль пользователя, указанного в административной сфере WildFly
mvn install -Pwildfly -Dwildfly.hostname=$(docker-machine ip swarm-node-01) -Dwildfly.username=admin -Dwildfly.password=Admin#007 . . . Nov 29, 2015 12:11:14 AM org.xnio.Xnio <clinit> INFO: XNIO version 3.3.1.Final Nov 29, 2015 12:11:14 AM org.xnio.nio.NioXnio <clinit> INFO: XNIO NIO Implementation Version 3.3.1.Final Nov 29, 2015 12:11:15 AM org.jboss.remoting3.EndpointImpl <clinit> INFO: JBoss Remoting version 4.0.9.Final [INFO] Authenticating against security realm: ManagementRealm [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ . . .
Доступ к приложению
Теперь, когда WildFly и сервер Couchbase запущены, давайте перейдем к приложению. Вам необходимо указать IP-адрес компьютера, на котором работает WildFly:
curl http://$(docker-machine ip swarm-node-01):8080/couchbase-javaee/resources/airline
[{"travel-sample":{"id":10123,"iata":"TQ","icao":"TXW","name":"Texas Wings","callsign":"TXW","type":"airline","country":"United States"}}, {"travel-sample":{"id":10642,"iata":null,"icao":"JRB","name":"Jc royal.britannica","callsign":null,"type":"airline","country":"United Kingdom"}}, {"travel-sample":{"id":112,"iata":"5W","icao":"AEU","name":"Astraeus","callsign":"FLYSTAR","type":"airline","country":"United Kingdom"}}, {"travel-sample":{"id":1355,"iata":"BA","icao":"BAW","name":"British Airways","callsign":"SPEEDBIRD","type":"airline","country":"United Kingdom"}}, {"travel-sample":{"id":10765,"iata":"K5","icao":"SQH","name":"SeaPort Airlines","callsign":"SASQUATCH","type":"airline","country":"United States"}}, {"travel-sample":{"id":13633,"iata":"WQ","icao":"PQW","name":"PanAm World Airways","callsign":null,"type":"airline","country":"United States"}}, {"travel-sample":{"id":139,"iata":"SB","icao":"ACI","name":"Air Caledonie International","callsign":"AIRCALIN","type":"airline","country":"France"}}, {"travel-sample":{"id":13391,"iata":"-+","icao":"--+","name":"U.S. Air","callsign":null,"type":"airline","country":"United States"}}, {"travel-sample":{"id":1191,"iata":"UU","icao":"REU","name":"Air Austral","callsign":"REUNION","type":"airline","country":"France"}}, {"travel-sample":{"id":1316,"iata":"FL","icao":"TRS","name":"AirTran Airways","callsign":"CITRUS","type":"airline","country":"United States"}}]
Полный набор REST API для этого приложения задокументирован по адресу github.com/arun-gupta/couchbase-javaee .