Этот блог расскажет, как создать мультиконтейнерное приложение, развернутое на нескольких хостах с помощью 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-machineRunning pre-create checks...Creating machine...Waitingformachine to be running, this may take a few minutes...Machine is running, waitingforSSH to be available...Detecting operating system of created instance...Provisioning created instance...Copying certs to thelocalmachine 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-machineenvconsul-machine -   Подключитесь к этой машине:
1
eval$(docker-machineenvconsul-machine) -   Запустите службу Consul, используя следующий файл Compose:
1234567
myconsul:image: progrium/consulrestart: alwayshostname: consulports:- 8500:8500command:"-server -bootstrap"Этот файл Compose доступен по адресу https://github.com/arun-gupta/docker-images/blob/master/consul/docker-compose.yml .
010203040506070809101112131415161718192021222324docker-compose up -dPulling myconsul (progrium/consul:latest)...latest: Pulling from progrium/consul3b4d28ce80e4: Pull completee5ab901dcf2d: Pull complete30ad296c0ea0: Pull complete3dba40dec256: Pull completef2ef4387b95e: Pull complete53bc8dcc4791: Pull complete75ed0b50ba1d: Pull complete17c3a7ed5521: Pull complete8aca9e0ecf68: Pull complete4d1828359d36: Pull complete46ed7df7f742: Pull completeb5e8ce623ef8: Pull complete049dca6ef253: Pull completebdb608bc4555: Pull complete8b3d489cfb73: Pull completec74500bbce24: Pull complete9f3e605442f6: Pull completed9125e9e799b: Pull completeDigest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274Status: Downloaded newer imageforprogrium/consul:latestCreating consul_myconsul_1Запущенный контейнер можно проверить как:
123dockerpsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf05d8dd11e7f 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/udpconsul_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-masterRunning pre-create checks...Creating machine...Waitingformachine to be running, this may take a few minutes...Machine is running, waitingforSSH to be available...Detecting operating system of created instance...Provisioning created instance...Copying certs to thelocalmachine 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-machineenvswarm-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 infoContainers: 2Images: 1Role: primaryStrategy: spreadFilters: health, port, dependency, affinity, constraintNodes: 1swarm-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=aufsCPUs: 1Total Memory: 1.021 GiBName: 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-01Running pre-create checks...Creating machine...Waitingformachine to be running, this may take a few minutes...Machine is running, waitingforSSH to be available...Detecting operating system of created instance...Provisioning created instance...Copying certs to thelocalmachine 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-machineenvswarm-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-02Running pre-create checks...Creating machine...Waitingformachine to be running, this may take a few minutes...Machine is running, waitingforSSH to be available...Detecting operating system of created instance...Provisioning created instance...Copying certs to thelocalmachine 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-machineenvswarm-node-02 -   Перечислите все созданные машины:
123456
docker-machinelsNAME ACTIVE DRIVER STATE URL SWARMconsul-machine - virtualbox Running tcp://192.168.99.100:2376swarm-master * virtualbox Running tcp://192.168.99.101:2376 swarm-master (master)swarm-node-01 - virtualbox Running tcp://192.168.99.102:2376 swarm-masterswarm-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 infoContainers: 4Images: 3Role: primaryStrategy: spreadFilters: health, port, dependency, affinity, constraintNodes: 3swarm-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=aufsswarm-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=aufsswarm-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=aufsCPUs: 3Total Memory: 3.064 GiBName: d074fd97682eЕсть 3 узла — один мастер Swarm и 2 рабочих узла Swarm. Всего в этом кластере работает 4 контейнера — один агент Swarm на главном сервере и каждый узел, а на главном сервере работает дополнительный swarm-agent-master. Это можно проверить, подключившись к мастеру и перечислив все контейнеры.
 -   Перечислите узлы в кластере с помощью следующей команды:
1234
docker run swarm list consul://$(docker-machine ip consul-machine):8500192.168.99.102:2376192.168.99.103:2376192.168.99.104:2376 
Запустите среду приложения с помощью Docker Compose
  Убедитесь, что вы подключены к кластеру, eval "$(docker-machine env --swarm swarm-master)" команду eval "$(docker-machine env --swarm swarm-master)" . 
-   Перечислите все сети, созданные Docker на данный момент:
0102030405060708091011
docker networklsNETWORK ID NAME DRIVER33a619ddc5d2 swarm-node-02/bridgebridgee0b73c96ffec swarm-node-02/nonenullb315e67f0363 swarm-node-02/hosthost879d6167be47 swarm-master/bridgebridgef771ddc7d957 swarm-node-01/nonenulle042754df336 swarm-node-01/hosthostd2f3b512f9dc swarm-node-01/bridgebridge5b5bcf135d7b swarm-master/nonenullfffc34eae907 swarm-master/hosthostDocker автоматически создает три сети для каждого хоста:
Имя сети Цель bridgeСеть по умолчанию, к которой подключаются контейнеры. Это сеть docker0во всех установках Docker.noneСпецифичный для контейнера сетевой стек hostДобавляет контейнер на сетевой стек хостов. Конфигурация сети идентична хосту. Это объясняет всего девять сетей, по три на каждый узел, как показано в этом кластере Swarm.
 -   Используйте Compose file для запуска WildFly и Couchbase:
010203040506070809101112131415
mycouchbase:container_name:"db"image: couchbase/serverports:- 8091:8091- 8092:8092- 8093:8093- 11210:11210mywildfly:image: arungupta/wildfly-adminenvironment:- COUCHBASE_URI=dbports:- 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 -dCreating network"wildflycouchbasejavaee7"with driver"None"Pulling mywildfly (arungupta/wildfly-admin:latest)...swarm-node-02: Pulling arungupta/wildfly-admin:latest... : downloadedswarm-master: Pulling arungupta/wildfly-admin:latest... : downloadedswarm-node-01: Pulling arungupta/wildfly-admin:latest... : downloadedCreating wildflycouchbasejavaee7_mywildfly_1Pulling mycouchbase (couchbase/server:latest)...swarm-node-02: Pulling couchbase/server:latest... : downloadedswarm-master: Pulling couchbase/server:latest... : downloadedswarm-node-01: Pulling couchbase/server:latest... : downloadedCreating db--x-networkingсоздает оверлейную сеть для кластера Swarm. Это можно проверить, перечислив сети еще раз:0102030405060708091011121314docker networklsNETWORK ID NAME DRIVER5e93fc34b4d9 swarm-node-01/docker_gwbridgebridge1c041242f51d wildflycouchbasejavaee7 overlaycc8697c6ce13 swarm-master/docker_gwbridgebridgef771ddc7d957 swarm-node-01/nonenull879d6167be47 swarm-master/bridgebridge5b5bcf135d7b swarm-master/nonenullfffc34eae907 swarm-master/hosthoste042754df336 swarm-node-01/hosthostd2f3b512f9dc swarm-node-01/bridgebridge33a619ddc5d2 swarm-node-02/bridgebridgee0b73c96ffec swarm-node-02/nonenullb315e67f0363 swarm-node-02/hosthostТри новые сети созданы:
-   Контейнеры, подключенные к сети с несколькими 
docker_gwbridgeавтоматически подключаются к сетиdocker_gwbridge. Эта сеть позволяет контейнерам иметь внешнее подключение за пределами своего кластера и создается на каждом рабочем узле. -   Создана новая оверлейная сеть 
wildflycouchbasejavaee7. Подключитесь к различным узлам Swarm и убедитесь, что на них существует оверлейная сеть. Начнем с master:12345678eval"$(docker-machine env swarm-master)"docker networklsNETWORK ID NAME DRIVER1c041242f51d wildflycouchbasejavaee7 overlay879d6167be47 bridge bridge5b5bcf135d7b none nullfffc34eae907 host hostcc8697c6ce13 docker_gwbridge bridgeДалее с помощью
swarm-node-01:12345678eval"$(docker-machine env swarm-node-01)"docker networklsNETWORK ID NAME DRIVER1c041242f51d wildflycouchbasejavaee7 overlayd2f3b512f9dc bridge bridgef771ddc7d957 none nulle042754df336 host host5e93fc34b4d9 docker_gwbridge bridgeНаконец, с помощью
swarm-node-02:1234567eval"$(docker-machine env swarm-node-02)"docker networklsNETWORK ID NAME DRIVER1c041242f51d wildflycouchbasejavaee7 overlaye0b73c96ffec none nullb315e67f0363 host host33a619ddc5d2 bridge bridgeКак видно, оверлейная сеть
wildflycouchbasejavaee7существует на всех машинах. Это подтверждает, что оверлейная сеть, созданная для кластера Swarm, была добавлена к каждому хосту в кластере.docker_gwbridgeсуществует только на машинах, на которых запущены контейнеры приложений.Узнайте больше о Docker Networks .
 
 -   Служба Couchbase имеет пользовательское имя контейнера, определенное как 
 -   Убедитесь, что WildFly и Couchbase работают:
1234
dockerpsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES23a581295a2b 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/tcpswarm-master/db7a8a885b23f3 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/tcpswarm-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. Это может быть вызвано как:0102030405060708091011121314151617mvninstall-Pcouchbase -Ddocker.host=$(docker-machine ip swarm-master). . .* Server auth using Basic with user'Administrator'> POST/sampleBuckets/installHTTP/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
 
01020304050607080910111213141516mvninstall-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.FinalNov 29, 2015 12:11:14 AM org.xnio.nio.NioXnio <clinit>INFO: XNIO NIO Implementation Version 3.3.1.FinalNov 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… . | 
