Этот блог расскажет, как создать мультиконтейнерное приложение, развернутое на нескольких хостах с помощью 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
- Создайте машину, на которой будет размещена служба обнаружения:
0102030405060708091011
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
- Подключитесь к этой машине:
1
eval
$(docker-machine
env
consul-machine)
- Запустите службу Consul, используя следующий файл Compose:
1234567
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 .
010203040506070809101112131415161718192021222324docker-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
Запущенный контейнер можно проверить как:
123docker
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:
010203040506070809101112
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 master -
--swarm-discovery
определяет адрес службы обнаружения -
--cluster-advertise
реклама машины в сети -
--cluster-store
назначить распределенный бэкэнд хранилища k / v для кластера -
--virtualbox-disk-size
устанавливает--virtualbox-disk-size
диска для созданного компьютера равным 5 ГБ. Это необходимо для того, чтобы образ WildFly и Couchbase можно было загрузить на любой из узлов.
-
- Найдите некоторую информацию об этой машине:
12
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 ГБ.
- Подключитесь к мастеру с помощью команды:
1
eval
"$(docker-machine env --swarm swarm-master)"
- Найдите некоторую информацию о кластере:
010203040506070809101112131415
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
- Создайте новый компьютер, чтобы присоединиться к этому кластеру:
010203040506070809101112
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, чтобы присоединиться к этому кластеру:
010203040506070809101112
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
- Перечислите все созданные машины:
123456
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 и найдите некоторую информацию об этом:
12
eval
"$(docker-machine env --swarm swarm-master)"
docker info
Обратите внимание, что
--swarm
указан для подключения к кластеру Swarm. В противном случае команда будет подключаться только к машинеswarm-master
.Это показывает вывод как:
01020304050607080910111213141516171819202122232425docker 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. Это можно проверить, подключившись к мастеру и перечислив все контейнеры.
- Перечислите узлы в кластере с помощью следующей команды:
1234
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)"
команду eval "$(docker-machine env --swarm swarm-master)"
.
- Перечислите все сети, созданные Docker на данный момент:
0102030405060708091011
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:
010203040506070809101112131415
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 .
Эта прикладная среда может быть запущена как:
010203040506070809101112docker-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. Это можно проверить, перечислив сети еще раз:0102030405060708091011121314docker 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
автоматически подключаются к сетиdocker_gwbridge
. Эта сеть позволяет контейнерам иметь внешнее подключение за пределами своего кластера и создается на каждом рабочем узле. - Создана новая оверлейная сеть
wildflycouchbasejavaee7
. Подключитесь к различным узлам Swarm и убедитесь, что на них существует оверлейная сеть. Начнем с master:12345678eval
"$(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
:12345678eval
"$(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
:1234567eval
"$(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 работают:
1234
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
. Это может быть вызвано как:0102030405060708091011121314151617mvn
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
01020304050607080910111213141516mvn
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:
1
2
|
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 .
Последние инструкции в Docker для разработчиков Java .
Наслаждайтесь!
Ссылка: | Docker Machine, Swarm и Compose для мультиконтейнерных и многоузловых приложений с Couchbase и WildFly от нашего партнера по JCG Аруна Гупта из блога Miles to go 2.0… . |