8天入门docker系列 —— 第八天 让程序跑在swarm集群上
真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用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.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有帮助。
相关文章
- 深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」
- 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(下)
- 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
- 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」
- 🍃【Spring专题】「开发指南」手把手教你将@Schedule任务调度升级为分布式调度@DistributeSchedule
- Zookeeper的服务器的log4j升级为log4j2的升级方案(忽略配置化兼容问题)
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析
- 🏆【Alibaba中间件技术系列】「Nacos技术专题」服务注册与发现相关的原理分析
- 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(中)
- 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(上)
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」Broker服务端自动创建topic的原理分析和问题要点指南
- 【SpringCloud技术专题】「Gateway网关系列」(3)微服务网关服务的Gateway全流程开发实践指南(2.2.X)
- 【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)
- 🍃【Spring专题】「技术原理」为大家介绍一下Spring中的Ant路径匹配工具组件AntPathMatcher
- 【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理
- 【Spring专场】「AOP容器」不看源码就带你认识核心流程以及运作原理
- 【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理
- ☕【权限设计系列】「认证授权专题」微服务架构的登陆认证问题
- 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析
- 🍃【Spring专题】「原理系列」SpringMVC的运行工作原理(补充修订)