真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用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--0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:
This node joined a swarm as a worker.

《2》 work2

[root@work2 ~]#  docker swarm join --token SWMTKN--0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:
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.
zaud8bjpttqno3swqjilfzbo3 work1 Ready Active 18.09.
ihxnypgl1wamfv583xonl483f work2 Ready Active 18.09.

三:程序部署

程序还是采用上节课说到的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. redis:latest work2 Running Running seconds ago
c0zmb5j9zx6q web_web. huangxincheng520/webapp:latest manager Running Running minutes ago
lczqz66skupc web_web. huangxincheng520/webapp:latest work2 Running Running minutes ago
ota9lz0aws21 web_web. huangxincheng520/webapp:latest work1 Running Running minutes ago
2snnttrgoq43 web_web. huangxincheng520/webapp:latest manager Running Running minutes ago
5735udmor57z web_web. huangxincheng520/webapp:latest work1 Running Running minutes ago

通过命令可以看到,web确实是5个,manager上有两个,work1上有两个,work2上有一个,同时redis也是部署在work2上的,接下来我们随便通过一个ip地址

访问一下web是否可以访问的通。

  

现在这个横向扩容能力就非常强大了,只要机器足够,你都可以扩展到100个web,对吧,好了,本系列就说到这里,希望对你学习docker有帮助。

8天入门docker系列 —— 第八天 让程序跑在swarm集群上的更多相关文章

  1. MapReduce编程入门实例之WordCount:分别在Eclipse和Hadoop集群上运行

    上一篇博文如何在Eclipse下搭建Hadoop开发环境,今天给大家介绍一下如何分别分别在Eclipse和Hadoop集群上运行我们的MapReduce程序! 1. 在Eclipse环境下运行MapR ...

  2. 从零开始搭建Docker Swarm集群

    从零开始搭建Docker Swarm集群 检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7)vim /etc/sysconfig/docker2. 添加-H tcp:/ ...

  3. 故障公告:docker swarm集群“群龙无首”引发部分站点无法访问

    今天傍晚 17:38-18:18 左右,由于 docker swarm 集群出现 "The swarm does not have a leader" 问题,造成博问.闪存.园子. ...

  4. 云计算之路-阿里云上-容器难容:自建docker swarm集群遭遇无法解决的问题

    我们从今年6月开始在生产环境进行 docker 容器化部署,将已经迁移至 ASP.NET Core 的站点部署到 docker swarm 集群上.开始我们选用的阿里云容器服务,但是在使用过程中我们遭 ...

  5. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  6. 故障公告:docker swarm集群“群龙无首”造成部分站点无法访问

    今天傍晚 17:38-18:18 左右,由于 docker swarm 集群出现 "The swarm does not have a leader" 问题,造成博问.闪存.园子. ...

  7. 8天入门docker系列 —— 第七天 让你的container实现跨主机访问

    当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你借助 docker自带的overlay ...

  8. Docker系列之swarm集群搭建

    学习Docker很久了,今天分享一下Docker的swarm集群的搭建过程很简单 首先第一步是 每台机器上面都要安装docker 本人使用的是centos7操作系统,使用3太虚拟机,3太虚拟机必须网络 ...

  9. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...

随机推荐

  1. 【UVA - 11624】Fire!

    -->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...

  2. string类总结第一部分函数介绍

    在前面几章,看了整个String类的源码,给每个方法都行写了注释,但是太过凌乱,今天我就把String类的方法整理归纳,然后再讲一下String类比较难以理解的部分 特此声明:本文篇幅较大,涵盖知识点 ...

  3. Spring Boot2从入门到实战:统一异常处理

    都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...

  4. Java学习笔记——设计模式之九.建造者模式

     建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...

  5. java springboot调用第三方接口 借助hutoool工具类 爬坑

    楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...

  6. 并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue

    DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能 ...

  7. Windows和linux环境下按文件名和字符串搜索命令

    Windows 1.遍历C盘下所有txt 命令:for /r c:\ %i in (*.txt) do @echo %i 注释:for 循环的意思 /r 按照路径搜索 c:\ 路径 %i in   ( ...

  8. 看看大神 Paul Graham 对如何学习编程的回答

    前言 我翻阅自己之前写的博客文章,发现在 2015 年我刚开始学习编程的时候,翻译了一段 Paul Graham 关于"How can I learn to program?"的回 ...

  9. Centos7 防护墙 设置端口

    Centos7中的防火墙调整为firewalld,试一下systemctl stop firewalld关闭防火墙. 命令:systemctl stop firewalld 命令:systemctl ...

  10. 剑指offer第二版-2.实现单例模式

    面试题2:实现单例模式 题目要求: 设计一个类,只能生成该类的一个实例. /** * 单例模式 * 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象 * 应用举例:windows的 ...