Docker入門系列(四):讓你的服務跨越多臺機器
準備工作
- 安裝docker,版本最低1.13
- 確保在上一節建立的friendlyhello已經發布到registry
- 確保friendlyhello可以被pull,並能正常使用
- 複製第三部分的
docker-compose.yml
介紹
在第三節中,我們使用了第二節寫的應用,並定義了它在線上的執行方式,然後啟動了5個例項。
在這一節中,我們將這個應用部署到多機叢集中,正式步入swarm模式,多機、多容器的應用。
理解 Swarm clusters
Swarm是什麼?Swarm就是一組執行docker的機器,並聯合成為一個叢集。當啟動Swarm叢集之後,docker命令會通過Swarm manager
Swarm managers有兩種不同的方式執行container:第一種emptiest node,儘量使用少的機器部署容器;第二種global,確保每一臺機器上都會執行一個容器的例項。可以在docker-compose.yml
中指定執行的模式。
Swarm managers是叢集的核心控制節點,它負責執行命令,授權新機器加入叢集。Worker節點只負責提供資源。
到目前為止,你已經學會在單機使用docker容器。docker可以很方便的切換為 swarm mode,切換的命令是docker swarm init
設定你的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 init
和docker 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)