Статьи

Многоконтейнерные приложения, использующие Docker Compose и Swarm

Docker Compose для Orchestrate Containers  показывает, как запустить два связанных Docker-контейнера с помощью Docker Compose . Кластеризация с использованием Docker Swarm  показывает, как настроить кластер Docker Swarm.

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

Обновленная версия Docker Compose и Docker Swarm выпущена с Docker 1.7.0 .

Docker 1.7.0 CLI

Получите последнюю версию CLI Docker:

curl https://get.docker.com/builds/Darwin/x86_64/docker-latest > /usr/local/bin/docker

и проверьте версию как:

docker -v
Docker version 1.7.0, build 0baf609

Docker Machine 0.3.0

Получите последнюю версию Docker Machine как:

curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine

и проверьте версию как:

docker-machine -v
docker-machine version 0.3.0 (0a251fe)

Docker Compose 1.3.0

Получите последнюю версию Docker Compose как:

curl -L https://github.com/docker/compose/releases/download/1.3.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

и проверьте версию как:

docker-compose -v
docker-compose version: 1.3.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

Docker Swarm 0.3.0

Swarm запускается как Docker-контейнер и может быть загружен как:

docker pull swarm

Вы можете узнать о Docker Swarm на docs.docker.com/swarm или о кластеризации с помощью Docker Swarm .

Создать Docker Swarm Cluster

Ключевые компоненты Docker Swarm показаны ниже:

и объяснил в кластеризации с помощью Docker Swarm .

  1. Самый простой способ начать работу с Swarm — использовать официальный образ Docker:
    docker run swarm create

    Эта команда возвращает токен обнаружения, называемый в этом документе <TOKEN>, и является уникальным идентификатором кластера. Он будет использоваться при создании мастера и узлов позже. Этот идентификатор кластера возвращается размещенной службой обнаружения в Docker Hub. Он показывает вывод как:

    docker run swarm create
    Unable to find image 'swarm:latest' locally
    latest: Pulling from swarm
    55b38848634f: Pull complete
    fd7bc7d11a30: Pull complete
    db039e91413f: Pull complete
    1e5a49ab6458: Pull complete
    5d9ce3cdadc7: Pull complete
    1f26e949f933: Pull complete
    e08948058bed: Already exists
    swarm:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
    Digest: sha256:0e417fe3f7f2c7683599b94852e4308d1f426c82917223fccf4c1c4a4eddb8ef
    Status: Downloaded newer image for swarm:latest
    1d528bf0568099a452fef5c029f39b85

    Последняя строка — <TOKEN>. Обязательно запишите этот идентификатор кластера сейчас, так как нет возможности перечислить его позже. Это должно быть исправлено с # 661 .

  2. Swarm полностью интегрирован с Docker Machine, и это самый простой способ начать работу. Давайте создадим Swarm Master следующим образом:
    docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://&lt;TOKEN&gt; swarm-master

    Замените <TOKEN>на идентификатор кластера, полученный на предыдущем шаге. --swarmнастраивает машину с помощью Swarm, --swarm-masterнастраивает созданную машину как мастер Swarm. Создание мастера Swarm связывается с размещенным сервисом в Docker Hub и сообщает, что мастер создан в кластере.

  3. Подключитесь к этому вновь созданному мастеру и найдите дополнительную информацию о нем:
    eval "$(docker-machine env swarm-master)"
    docker info

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

    &gt; docker info
    Containers: 2
    Images: 7
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: extfs
     Dirs: 11
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Logging Driver: json-file
    Kernel Version: 4.0.5-boot2docker
    Operating System: Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015
    CPUs: 1
    Total Memory: 996.2 MiB
    Name: swarm-master
    ID: DLFR:OQ3E:B5P6:HFFD:VKLI:IOLU:URNG:HML5:UHJF:6JCL:ITFH:DS6J
    Debug mode (server): true
    File Descriptors: 22
    Goroutines: 36
    System Time: 2015-07-11T00:16:34.29965306Z
    EventsListeners: 1
    Init SHA1:
    Init Path: /usr/local/bin/docker
    Docker Root Dir: /mnt/sda1/var/lib/docker
    Username: arungupta
    Registry: https://index.docker.io/v1/
    Labels:
     provider=virtualbox
  4. Создать узел Swarm
    docker-machine create -d virtualbox --swarm --swarm-discovery token://&lt;TOKEN&gt; swarm-node-01

    Замените <TOKEN>его идентификатором кластера, полученным на предыдущем шаге. Создание узла связывается с размещенным сервисом в Docker Hub и присоединяется к ранее созданному кластеру. Это определяется --swarm-discovery token://...и указывается идентификатор кластера, полученный ранее.

  5. Чтобы сделать его реальным кластером, давайте создадим второй узел:
    docker-machine create -d virtualbox --swarm --swarm-discovery token://&lt;TOKEN&gt; swarm-node-02

    Замените <TOKEN>на идентификатор кластера, полученный на предыдущем шаге.

  6. Перечислите все узлы, созданные на данный момент:
    docker-machine ls

    Это показывает вывод, похожий на приведенный ниже:

    docker-machine ls
    NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
    lab                      virtualbox   Running   tcp://192.168.99.101:2376
    summit2015               virtualbox   Running   tcp://192.168.99.100:2376
    swarm-master    *        virtualbox   Running   tcp://192.168.99.102:2376   swarm-master (master)
    swarm-node-01            virtualbox   Running   tcp://192.168.99.103:2376   swarm-master
    swarm-node-02            virtualbox   Running   tcp://192.168.99.104:2376   swarm-master

    Машины, которые являются частью кластера, имеют имя кластера в столбце SWARM, в противном случае пустым. Например, «lab» и «summit2015» являются автономными машинами, где, как и все другие машины, являются частью кластера «swarm-master». Мастер Роя также идентифицирован (мастер) в столбце Рой.

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

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

    &gt; docker info
    Containers: 4
    Images: 3
    Role: primary
    Strategy: spread
    Filters: affinity, health, constraint, port, dependency
    Nodes: 3
     swarm-master: 192.168.99.102:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 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.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 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.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015, provider=virtualbox, storagedriver=aufs
    CPUs: 3
    Total Memory: 3.065 GiB

    Есть 3 узла — один мастер Swarm и 2 узла Swarm. Всего в этом кластере работает 4 контейнера — один агент Swarm на главном и каждый узел, а на главном работает дополнительный Swarm-agent-master.

  8. Перечислите узлы в кластере с помощью следующей команды:
    docker run swarm list token://&lt;TOKEN&gt;

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

    &gt; docker run swarm list token://1d528bf0568099a452fef5c029f39b85
    192.168.99.103:2376
    192.168.99.104:2376
    192.168.99.102:2376

Развертывание приложения Java EE в Docker Swarm Cluster с помощью Docker Compose

Docker Compose для Orchestrate Containers  объясняет, как приложения с несколькими контейнерами могут быть легко запущены с помощью Docker Compose.

  1. Используйте docker-compose.ymlфайл, описанный в этом блоге,  чтобы запустить контейнеры как:
    docker-compose up -d
    Creating wildflymysqljavaee7_mysqldb_1...
    Creating wildflymysqljavaee7_mywildfly_1...

    В docker-compose.ymlфайл выглядит следующим образом :

    mysqldb:
      image: mysql:latest
      environment:
        MYSQL_DATABASE: sample
        MYSQL_USER: mysql
        MYSQL_PASSWORD: mysql
        MYSQL_ROOT_PASSWORD: supersecret
    mywildfly:
      image: arungupta/wildfly-mysql-javaee7
      links:
        - mysqldb:db
      ports:
        - 8080:8080
  2. Проверьте контейнеры, работающие в кластере, как:
    eval "$(docker-machine env --swarm swarm-master)"
    docker info

    чтобы увидеть результат как:

    docker info
    Containers: 7
    Images: 5
    Role: primary
    Strategy: spread
    Filters: affinity, health, constraint, port, dependency
    Nodes: 3
     swarm-master: 192.168.99.102:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015, provider=virtualbox, storagedriver=aufs
     swarm-node-01: 192.168.99.103:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015, provider=virtualbox, storagedriver=aufs
     swarm-node-02: 192.168.99.104:2376
      └ Containers: 3
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.022 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.0.5-boot2docker, operatingsystem=Boot2Docker 1.7.0 (TCL 6.3); master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015, provider=virtualbox, storagedriver=aufs
    CPUs: 3
    Total Memory: 3.065 GiB
  3. «Swarm-node-02» запускает три контейнера, поэтому давайте посмотрим на список работающих контейнеров:
    eval "$(docker-machine env swarm-node-02)"

    и увидеть список запущенных контейнеров как:

    docker ps -a
    CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS                    NAMES
    b1e7d9bd2c09        arungupta/wildfly-mysql-javaee7   "/opt/jboss/wildfly/   38 seconds ago      Up 37 seconds       0.0.0.0:8080-&gt;8080/tcp   wildflymysqljavaee7_mywildfly_1
    ac9c967e4b1d        mysql:latest                      "/entrypoint.sh mysq   38 seconds ago      Up 38 seconds       3306/tcp                 wildflymysqljavaee7_mysqldb_1
    45b015bc79f4        swarm:latest                      "/swarm join --addr    20 minutes ago      Up 20 minutes       2375/tcp                 swarm-agent
  4. Приложение может быть снова доступно с помощью:
    curl http://$(docker-machine ip swarm-node-02):8080/employees/resources/employees

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

    &lt;?<span class="pl-ent">xml</span><span class="pl-e"> version</span>=<span class="pl-s"><span class="pl-pds">"</span>1.0<span class="pl-pds">"</span></span><span class="pl-e"> encoding</span>=<span class="pl-s"><span class="pl-pds">"</span>UTF-8<span class="pl-pds">"</span></span><span class="pl-e"> standalone</span>=<span class="pl-s"><span class="pl-pds">"</span>yes<span class="pl-pds">"</span></span>?&gt;&lt;<span class="pl-ent">collection</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;1&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Penny&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;2&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Sheldon&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;3&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Amy&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;4&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Leonard&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;5&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Bernadette&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;6&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Raj&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;7&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Howard&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">employee</span>&gt;&lt;<span class="pl-ent">id</span>&gt;8&lt;/<span class="pl-ent">id</span>&gt;&lt;<span class="pl-ent">name</span>&gt;Priya&lt;/<span class="pl-ent">name</span>&gt;&lt;/<span class="pl-ent">employee</span>&gt;&lt;/<span class="pl-ent">collection</span>&gt;

Последние инструкции для этой настройки всегда доступны по адресу:  github.com/javaee-samples/docker-java/blob/master/chapters/docker-swarm.adoc .