8天入門docker系列 —— 第八天 讓程序跑在swarm集羣上

 

  真正的落地部署都是但願程序跑在集羣下,而不是單機版下測測玩玩,因此這篇就來聊一下怎麼使用docker swarm進行部署,由於是swarm是docker自帶的,node

因此部署起來仍是很是簡單的。python

 

一:前置條件web

  準備三臺centos機器: redis

      192.168.23.154   manager
      192.168.23.155   work1
      192.168.23.156    work2

 

二:構建集羣docker

1.  manger節點上使用 docker swarm init 便可建立只有一個master節點的集羣。centos

[root@manager ~]# docker swarm init
Swarm initialized: current node (h303fwvspazsv74h6jcj0urz3) is now a manager.

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

    docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377

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

 

2. 將上面紅色字體copy到work1和work2 這兩個node節點便可,這樣就能夠構建3個節點的swarm集羣。app

 

《1》 work1webapp

[root@work1 ~]#  docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377
This node joined a swarm as a worker.

 

《2》 work2分佈式

[root@work2 ~]#  docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377
This node joined a swarm as a worker.

 

       最後到manager節點查看一下三臺機器的分佈狀況。學習

[root@manager ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
h303fwvspazsv74h6jcj0urz3 *   manager             Ready               Active              Leader              18.09.6
zaud8bjpttqno3swqjilfzbo3     work1               Ready               Active                                  18.09.6
ihxnypgl1wamfv583xonl483f     work2               Ready               Active                                  18.09.6

 

 

 三:程序部署

        程序仍是採用上節課說到的python+redis,如今有了三個節點,我但願web程序能夠有5個鏡像,redis由於是db服務,因此儘可能安排在某一個節點寄存,這是由於

若是redis作成了多個,db文件沒很差同步處理了,固然你能夠採用相似的clusterfs來實現多機器間的db同步,這裏就不麻煩了,接下來我來畫一張部署圖。

這裏要注意的一點就是,集羣中的manager節點不只能夠做爲調度節點,同時也能夠兼職work節點的功能,直白一點就是能夠在manager上跑容器。

 

1. pythonweb 推送到遠程

    前面博文中我只在本地作了一個build,其實在swarm部署中是建議所有作成鏡像,而後推送到本身的docker registry中,這樣各個work節點只須要從遠程拉取

鏡像便可,不須要帶着一些源碼文件處處跑。

[root@manager data]# docker build -t webapp .
Sending build context to Docker daemon  6.144kB
Step 1/6 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
f5d23c7fed46: Pull complete 
cdc362a1b8d3: Pull complete 
d43d1ec67d25: Pull complete 
0269ba15cf1b: Pull complete 
Digest: sha256:4149310fdae239c7b09aa5fa04263e86b89d11da9bfb1116b4f74782358bfea8
[root@manager data]# docker tag webapp:latest huangxincheng520/webapp:latest
[root@manager data]# docker push huangxincheng520/webapp:latest
The push refers to repository [docker.io/huangxincheng520/webapp]
48e326095e39: Layer already exists 
2be3ac14ba61: Pushed 
fb23e9b75b52: Layer already exists 
c04915bf1261: Layer already exists 
32d47307f796: Layer already exists 
c86aa07d5fdb: Pushed 
d8a33133e477: Pushed 
latest: digest: sha256:2c79581255988e78efa97ec9b5c43d742ce8b9535b00660f8e7061f2a0d1d30d size: 1788

 

2. docker-compose

version: "3"
services:
  web:
    image: huangxincheng520/webapp
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "myvol:/data"
    deploy:
      placement:
        constraints: [node.hostname == work2]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:
volumes:
  myvol:

 

    若是你們瞭解單機版docker-compose的寫法,那分佈式版也就不難,主要在於deploy節點的使用。

 

《1》  replicas: 5     從這個能夠看到,當前我但願web部署成5份,到底怎麼分配由swarm集羣本身決定,我只須要知道結果就能夠了。

《2》 constraints: [node.hostname == work2]      能夠看到,我已經要求swarm將redis部署在hostname=work2的節點上。

 

3.   docker stack deploy

        都準備好了,接下來就能夠跑一下。

[root@manager data]# docker stack deploy -c ./docker-compose.yml web
Creating network web_webnet
Creating service web_web
Creating service web_redis

 

      而後經過 docker stack ps web 看一下stack 的各服務下的全部container的部署狀況。

[root@manager data]# docker stack ps web
ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE            ERROR                              PORTS
qym36md95ni6        web_redis.1         redis:latest                     work2               Running             Running 33 seconds ago                                      
c0zmb5j9zx6q        web_web.1           huangxincheng520/webapp:latest   manager             Running             Running 3 minutes ago                                       
lczqz66skupc        web_web.2           huangxincheng520/webapp:latest   work2               Running             Running 3 minutes ago                                       
ota9lz0aws21        web_web.3           huangxincheng520/webapp:latest   work1               Running             Running 3 minutes ago                                       
2snnttrgoq43        web_web.4           huangxincheng520/webapp:latest   manager             Running             Running 3 minutes ago                                       
5735udmor57z        web_web.5           huangxincheng520/webapp:latest   work1               Running             Running 3 minutes ago 

   

    經過命令能夠看到,web確實是5個,manager上有兩個,work1上有兩個,work2上有一個,同時redis也是部署在work2上的,接下來咱們隨便經過一個ip地址

訪問一下web是否能夠訪問的通。

 

  

       如今這個橫向擴容能力就很是強大了,只要機器足夠,你均可以擴展到100個web,對吧,好了,本系列就說到這裏,但願對你學習docker有幫助。

相關文章
相關標籤/搜索