Статьи

Docker Machine, Swarm и Compose для приложений с несколькими контейнерами и несколькими хостами с Couchbase и WildFly

Этот блог расскажет, как создать мультиконтейнерное приложение, развернутое на нескольких хостах с помощью Docker. Это будет достигнуто с помощью Docker Machine, Swarm и Compose.

Да, все три инструмента вместе делают этот блог намного интереснее!

докер-рой машинно-Compose-1024x763

Диаграмма объясняет ключевые компоненты:

  • Docker Machine используется для предоставления нескольких хостов Docker
  • Docker Swarm будет использоваться для создания кластера с несколькими хостами
  • Каждый узел в кластере Docker Swarm зарегистрирован / обнаружен с помощью Consul
  • Мультиконтейнерное приложение будет развернуто с помощью Docker Compose
  • WildFly и Couchbase предоставляются на разных хостах
  • Для связи WildFly и Couchbase используется многоузловая сеть Docker.

Кроме того, Maven используется для настройки Couchbase и развертывания приложения в WildFly.

Никакой истории, только чистый код, давайте сделаем это!

Создание службы обнаружения с помощью Docker Machine

  1. Создайте машину, на которой будет размещена служба обнаружения:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    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
  2. Подключитесь к этой машине:
    1
    eval $(docker-machine env consul-machine)
  3. Запустите службу Consul, используя следующий файл Compose:
    1
    2
    3
    4
    5
    6
    7
    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 .

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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

    Запущенный контейнер можно проверить как:

    1
    2
    3
    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, и поэтому это самый простой способ начать работу.

  1. Создайте Swarm Master и укажите на службу обнаружения Consul:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    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

    Несколько вариантов, чтобы посмотреть здесь:

    1. --swarm настраивает машину с помощью Swarm
    2. --swarm-master настраивает созданную Машину, чтобы быть Swarm master
    3. --swarm-discovery определяет адрес службы обнаружения
    4. --cluster-advertise реклама машины в сети
    5. --cluster-store назначить распределенный бэкэнд хранилища k / v для кластера
    6. --virtualbox-disk-size устанавливает --virtualbox-disk-size диска для созданного компьютера равным 5 ГБ. Это необходимо для того, чтобы образ WildFly и Couchbase можно было загрузить на любой из узлов.
  2. Найдите некоторую информацию об этой машине:
    1
    2
    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 ГБ.

  3. Подключитесь к мастеру с помощью команды:
    1
    eval "$(docker-machine env --swarm swarm-master)"
  4. Найдите некоторую информацию о кластере:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    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
  5. Создайте новый компьютер, чтобы присоединиться к этому кластеру:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    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 не указан в этой команде. Это гарантирует, что созданные Машины являются рабочими узлами.

  6. Создайте второй узел Swarm, чтобы присоединиться к этому кластеру:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    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
  7. Перечислите все созданные машины:
    1
    2
    3
    4
    5
    6
    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 . Мастер Роя также идентифицирован (мастер) в столбце Рой.

  8. Подключитесь к кластеру Swarm и найдите некоторую информацию об этом:
    1
    2
    eval "$(docker-machine env --swarm swarm-master)"
    docker info

    Обратите внимание, что --swarm указан для подключения к кластеру Swarm. В противном случае команда будет подключаться только к машине swarm-master .

    Это показывает вывод как:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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. Это можно проверить, подключившись к мастеру и перечислив все контейнеры.

  9. Перечислите узлы в кластере с помощью следующей команды:
    1
    2
    3
    4
    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)" .

  1. Перечислите все сети, созданные Docker на данный момент:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    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.

  2. Используйте Compose file для запуска WildFly и Couchbase:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    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:

    1. Служба Couchbase имеет пользовательское имя контейнера, определенное как container_name . Это имя используется при создании новой переменной среды COUCHBASE_URI при запуске WildFly.
    2. arungupta/wildfly-admin используется, поскольку оно связывает управление WildFly со всеми сетевыми интерфейсами, а также предоставляет порт 9990. Это позволяет использовать плагин WildFly Maven для развертывания приложения. Источник этого файла находится по адресу https: // github. .com / arun-gupta / docker-images / blob / master / wildfly-couchbase-javaee7 / docker-compose.yml .

    Эта прикладная среда может быть запущена как:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    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. Это можно проверить, перечислив сети еще раз:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    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

    Три новые сети созданы:

    1. Контейнеры, подключенные к сети с несколькими docker_gwbridge автоматически подключаются к сети docker_gwbridge . Эта сеть позволяет контейнерам иметь внешнее подключение за пределами своего кластера и создается на каждом рабочем узле.
    2. Создана новая оверлейная сеть wildflycouchbasejavaee7 . Подключитесь к различным узлам Swarm и убедитесь, что на них существует оверлейная сеть. Начнем с master:
      1
      2
      3
      4
      5
      6
      7
      8
      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 :

      1
      2
      3
      4
      5
      6
      7
      8
      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 :

      1
      2
      3
      4
      5
      6
      7
      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 .

  3. Убедитесь, что WildFly и Couchbase работают:
    1
    2
    3
    4
    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

Настроить приложение и базу данных

  1. Клон https://github.com/arun-gupta/couchbase-javaee.git . Это рабочее пространство содержит простое приложение Java EE, которое развернуто в WildFly и предоставляет REST API через travel-sample в Couchbase.
  2. Сервер Couchbase может быть настроен с использованием REST API . Приложение содержит профиль Maven, который позволяет настроить сервер Couchbase с travel-sample . Это может быть вызвано как:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    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
      
    . . .
  3. Разверните приложение в WildFly, указав три параметра:

    1. IP-адрес хоста, на котором работает WildFly
    2. Имя пользователя в административной сфере WildFly
    3. Пароль пользователя, указанного в административной сфере WildFly
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    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:

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"}}]