1. 程式人生 > >Docker入門系列(四):讓你的服務跨越多臺機器

Docker入門系列(四):讓你的服務跨越多臺機器

準備工作

  • 安裝docker,版本最低1.13
  • 確保在上一節建立的friendlyhello已經發布到registry
  • 確保friendlyhello可以被pull,並能正常使用
  • 複製第三部分的docker-compose.yml

介紹

第三節中,我們使用了第二節寫的應用,並定義了它在線上的執行方式,然後啟動了5個例項。

在這一節中,我們將這個應用部署到多機叢集中,正式步入swarm模式,多機、多容器的應用。

理解 Swarm clusters

Swarm是什麼?Swarm就是一組執行docker的機器,並聯合成為一個叢集。當啟動Swarm叢集之後,docker命令會通過Swarm manager

執行在整個叢集之上。Swarm叢集的機器可以是物理機,也可以是虛擬機器,當加入Swarm叢集之後,被稱為nodes

Swarm managers有兩種不同的方式執行container:第一種emptiest node,儘量使用少的機器部署容器;第二種global,確保每一臺機器上都會執行一個容器的例項。可以在docker-compose.yml中指定執行的模式。

Swarm managers是叢集的核心控制節點,它負責執行命令,授權新機器加入叢集。Worker節點只負責提供資源。

到目前為止,你已經學會在單機使用docker容器。docker可以很方便的切換為 swarm mode,切換的命令是docker swarm init

,一旦切換為 swarm mode後,當前的機器角色就變為Swarm managers。

設定你的swarm叢集

建立cluster

在本機上使用VM建立叢集,我使用的Mac作業系統,接下來演示在Mac上建立swarm叢集。

使用docker-machine建立多個虛擬機器

docker-machine create –driver virtualbox myvm1
docker-machine create –driver virtualbox myvm2

使用docker-machine ls列出所有的虛擬機器

$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS

myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.09.0-ce

myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.09.0-ce

接下來,開始初始化swarm,將myvm1設定為manager,並向叢集中加入節點。

$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2376"
Swarm initialized: current node (gxhg37symzvlve65jgg9ya984) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-07zo0vcw3uch6r47b3b8rpcqcqz00sa9679s3jil660cimyb72-8t8nfbynnphl2zw8str5efm47 192.168.99.100:2376

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

新增worker節點

$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-07zo0vcw3uch6r47b3b8rpcqcqz00sa9679

s3jil660cimyb72-8t8nfbynnphl2zw8str5efm47 192.168.99.100:2377"`

2377 vs 2376

注意docker swarm initdocker swarm join執行的埠號是2377,或者不指定埠,使用預設埠。docker-machine ls返回的埠是2376,這個埠是docker deamon的埠。

swarm manager上執行docker node ls檢查叢集執行情況

$ docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
gxhg37symzvlve65jgg9ya984 *   myvm1               Ready               Active              Leader
qcbxu2hop7nf13ktzxfg36ein     myvm2               Ready               Active           

如果看到以上輸出資訊,恭喜你,你已經啟動成功。

使用docker swarm leave推出swarm叢集

$ docker-machine ssh myvm2 "docker swarm leave"
Node left the swarm.

部署service到swarm cluster

當此最複雜的部分已經學習完,接下來重複在第三節的操縱,把service部署到叢集中。記住,只有swarm manager也就是myvm1可以執行docker命令。每一次連上swarm manager都需要執行docker-machine ssh比較麻煩,我們一個使用另外一種替代方案。使用docker-machine env <machine>配置當前shell連線到在虛擬機器上的Docker daemon

$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/zhangbing/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell: 
# eval $(docker-machine env myvm1)

執行eval $(docker-machine env myvm1)配置當前的shell連線myvm1

eval $(docker-machine env myvm1)

執行docker-machine ls驗證myvm1生效。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v17.09.0-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.09.0-ce   

可以看到myvm1是active。

接下來,通過swarm manager將服務部署到叢集上,

$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web

檢查服務的啟動情況

$ docker stack ps getstartedlab
ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE              ERROR               PORTS
j18ii2ij6daf        getstartedlab_web.1   username/repo:tag   myvm2               Running             Preparing 30 seconds ago                       
oss51cyvy2n0        getstartedlab_web.2   username/repo:tag   myvm2               Running             Preparing 30 seconds ago                       
rfvqjkhwxtif        getstartedlab_web.3   username/repo:tag   myvm1               Running             Preparing 30 seconds ago                       
y0xapfhxopum        getstartedlab_web.4   username/repo:tag   myvm2               Running             Preparing 30 seconds ago                       
8a4q8rq4jcxs        getstartedlab_web.5   username/repo:tag   myvm1               Running             Preparing 30 seconds ago     

清理工作

停止service的命令

docker stack rm getstartedlab

停止swarm manager

docker swarm leave –force

Ok,你已經在生產環境上操作swarm進行服務的上線,擴容,下線的整個過程。

清理宿主機的shell環境

eval $(docker-machine env -u)