真正的落地部署都是希望程序跑在集群下, 而不是单机版下测测玩玩, 所以这篇就来聊一下怎么使用 docker swarm 进行部署, 因为是 swarm 是 docker 自带的,
所以部署起来还是非常简单的.
一: 前置条件
准备三台 CentOS 机器:
- 192.168.23.154 manager
- 192.168.23.155 work1
- 192.168.23.156 work2
二: 构建集群
1. manger 节点上使用 docker swarm init 即可创建只有一个 master 节点的集群.
- [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 集群.
《1》 work1
- [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.YAML 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 有帮助.
来源: https://www.cnblogs.com/huangxincheng/p/11295062.html