在Docker Swarm集群中運行Java EE應用

jopen 9年前發布 | 21K 次閱讀 Docker

Docker Swarm是Docker的原生集群。它允許你使用全套的Docker工具來創建和訪問一批Docker主機。Docker Swarm提供標準的Docker API,任何可以與Docker后臺通信的工具都能夠使用Swarm將其擴展到多個主機上。

9.1 Docker Swarm關鍵組件
在Docker Swarm集群中運行Java EE應用

Swarm Manager:Docker Swarm有一個管理者,是一臺預先準備的Docker主機,作為所有管理工作的唯一入口。它策劃和調度整個集群的容器。當前僅允許集群中有一個管理者的 實例。這是一個高可用架構的單點故障,在未來的Swarm版本中將會允許其他的管理者,參見 #598

Swarm Nodes:容器被部署在節點上。每一個Swarm節點能夠被管理者訪問,每一個節點必須監聽相同的TCP端口。每一個節點運行一個Docker Swarm代理,用來注冊使用的Docker后臺,監控和更新后端發現的節點狀態。容器運行在一個節點上。

Scheduler Strategy:不同的調度策略(緊密,寬松(默認),隨機)用來選擇運行容器的最佳節點。默認的策略是的運行容器的節點數最少。通過不同類型的過濾器,比如限制條件和相似性,用來考慮一個合適的調度算法。

Node Discovery Service:Swarm默認使用本機的發現服務,以Docker Hub為基礎,通過令牌來發現集群中的節點。但是etcd,consul,和ZooKeeper也能夠作為服務發現。這是特別有用的如果不能訪問因特網, 或者你在一個封閉網絡內運行。一個新的服務發現后臺能夠這樣被創建,主機服務發現在防火墻內部是有用的,就像 #660 討論的。

Standard Docker API:Docker Swarm提供了標準的Docker API,因此任何能夠和單一Docker主機通信的工具將能無縫擴展到多個主機。這就意味著如果你在shell腳本中使用Docker CLI來配置多個Docker主機,同樣的CLI將會和Swarm集群通信,然后Docker Swarm將會作為代理在集群中運行。

9.2. 創建一個Docker Swarm集群

  1. 創建Swarm最簡單的方式是,使用正式的Docker鏡像:

    From Internet

    docker run --rm swarm create

    From Instructor

    docker run --rm classroom.example.com:5000/swarm create


    這個命令返回一個發現令牌,文檔中使用TOKEN來標記它,它是一個唯一的集群ID。它將在隨后的創建master和節點的時候使用。集群ID由Docker Hub的發現服務返回。

    它顯示如下輸出:
    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。

    注意:確保記錄下這個集群ID,因為之后不會再顯示。這個問題將在 #661中被修復。
    Swarm完全集成在Docker Machine中,所以最簡單的方式是像下面這樣:

    From Internet

    docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://<token> swarm-master

    From Instructor

    docker-machine create -d virtualbox --virtualbox-boot2docker-url=http://classroom.example.com:8082/downloads/boot2docker.iso --engine-insecure-registry=classroom.example.com:5000 --swarm --swarm-master --swarm-discovery token://<token> swarm-master


    使用前面步驟中的TOKEN替換對應的內容。

    --swarm在machine中配置swarm,--swarm-mster配置創建的machine作為Swarm master。Swarm master和Docker Hub上的服務進行通信,通知它一個master在集群中被創建了。
    1. 連接剛剛創建的master,獲取相關信息: {{{
      eval "$(docker-machine env swarm-master)"
      docker info
      }}}

    注意:如果你使用Windows,使用docker-machine env swarm-master命令,復制輸出內容到編輯器中,用SET替換所有的EXPORT,去掉所有的引號和重復的/ 。
    輸出內容如下:
    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

    1. 創建Swarm節點: {{{
      #From Internet
      docker-machine create -d virtualbox --swarm --swarm-discovery token://<TOKEN> swarm-node-01

    From Instructor

    docker-machine create -d virtualbox --virtualbox-boot2docker-url= http://classroom.example.com:8 ... r.iso --engine-insecure-registry=classroom.example.com:5000 --swarm --swarm-discovery token://<TOKEN> swarm-node-01
    }}}

    使用早先的集群ID替換TOKEN。

    節點會和Docker Hub上的服務通信,并加入之前創建的集群。通過--swarm-discovery token://...的方式來指定。讓我們來創建第二個節點:

    From Internet

    docker-machine create -d virtualbox --swarm --swarm-discovery token://<TOKEN> swarm-node-02

    From Instructor

    docker-machine create -d virtualbox --virtualbox-boot2docker-url=http://classroom.example.com:8082/downloads/boot2docker.iso --engine-insecure-registry=classroom.example.com:5000 --swarm --swarm-discovery token://<TOKEN> swarm-node-02


    使用早先的集群ID替換TOKEN。
    1. 顯示創建的所有節點 {{{
      docker-machine ls
      }}}

    顯示的輸出如下:
    docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM
    lab virtualbox Running tcp://192.168.99.101: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

    存在集群中的machine會出現一個集群名字在SWARM列下,否則是一個空白。例如“lab”和“summit2015”是獨立的 machine,而其他的所有machine是“swarm-master”集群的一部分。Swarm master同樣在SWARM列中定義為(master)。
    1. 連接Swarm集群,查看相關信息: {{{
      eval "$(docker-machine env --swarm swarm-master)"
      docker info
      }}}

    輸出如下顯示:
    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 master,2個Swarm節點。總共有4個容器運行在集群中,1個Swarm代理運行在master和節點上,以及一個swarm-agent-master運行在master上。
    1. 顯示集群中的所有節點: {{{
      docker run swarm list token://<TOKEN>
      }}}

    輸出顯示如下:
    docker run swarm list token://1d528bf0568099a452fef5c029f39b85 192.168.99.103:2376
    192.168.99.104:2376
    192.168.99.102:2376

    9.3. 部署Java EE應用到Docker Swarm集群

    現在有了一個完整的集群,我們需要部署Java EE應用到集群中。

    Swarm檢查節點中發布的部署,唯一要做的是,我們需要按照在 部署Java EE7應用(容器鏈接方式)中說過的一樣來部署應用。
    1. 啟動MySQL服務器: {{{
      #From Internet
      docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -p 3306:3306 -d mysql

    From Instructor

    docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -p 3306:3306 -d classroom.example.com:5000/mysql
    }}}

    -e定義數據庫啟動時的環境變量,來允許我們通過這個用戶和密碼訪問數據庫。
    1. 啟動WildFly并部署Java EE7 應用: {{{
      #From Internet
      docker run -d --name mywildfly --link mysqldb:db -p 8080:8080 arungupta/wildfly-mysql-javaee7

    From Instructor

    docker run -d --name mywildfly --link mysqldb:db -p 8080:8080 classroom.example.com:5000/wildfly-mysql-javaee7
    }}}

    這里使用之前說過的 Docker容器鏈接
    1. 檢查集群狀態:> 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

    “swarm-node-02”運行了3個容器,讓我們看看運行的容器內容:

    eval &quot;$(docker-machine env swarm-node-02)&quot; docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    35325d730c97 arungupta/wildfly-mysql-javaee7 &quot;/opt/jboss/wildfly/ 57 seconds ago Up 56 seconds 0.0.0.0:32768->8080/tcp rafael_mywildfly_1
    dd3525575b12 mysql &quot;/entrypoint.sh mysq 57 seconds ago Up 56 seconds 3306/tcp rafael_mysqldb_1
    e9f655cbcb4b swarm:latest &quot;/swarm join --adver 27 minutes ago Up 27 minutes 2375/tcp swarm-agent

    1.訪問應用:
    curl http://$(docker-machine ip swarm-node-02):8080/employees/resources/employees


    查看輸出內容:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>


    9.4. 使用Docker Compose部署Java EE應用到Docker Swarm集群中

    使用Docker Compose管理多個容器 解釋了多個容器經驗怎樣通過Docker Compose來簡單的啟動。
    1. 連接“swarm-node-02”:
      eval "$(docker-machine env swarm-node-02)"
    2. 停止MySQL和WildFly容器:
      docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f
      docker ps -a | grep mysql | awk '{print $1}' | xargs docker rm -f
    3. 使用docker-compose.yml文件來啟動容器
      docker-compose up -d
      Creating wildflymysqljavaee7_mysqldb_1...
      Creating wildflymysqljavaee7_mywildfly_1...
    4. 檢查集群中運行的容器:
      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
    1. 再次連接“swarm-node-02”: {{{
      eval "$(docker-machine env swarm-node-02)"
      }}}

    查看當前運行的容器列表:
    docker ps -a
    CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS                     NAMES
    35325d730c97        arungupta/wildfly-mysql-javaee7   "/opt/jboss/wildfly/   57 seconds ago      Up 56 seconds       0.0.0.0:32768->8080/tcp   rafael_mywildfly_1
    dd3525575b12        mysql                   "/entrypoint.sh mysq   57 seconds ago      Up 56 seconds       3306/tcp                  rafael_mysqldb_1
    e9f655cbcb4b        swarm:latest                      "/swarm join --adver   27 minutes ago      Up 27 minutes       2375/tcp                  swarm-agent

    1. 檢查日志 {{{
      docker-compose logs
      }}}

    使用 https://github.com/javaee-samp ... es/55 增加容器可視化。

    原文鏈接: 9. Java EE Application on Docker Swarm Cluster
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!