震惊 | 只需3分钟!极速部署个人Docker云平台

1 Docker Swarm极速部署(5分钟极速部署)

一、介绍系统环境

1)服务器环境
节点名称 IP 操作系统 内核版本
master 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node0x x.x.x.x CentOs7 4.16.1-1.el7.elrepo.x86_64
node0x x.x.x.x CentOs7 4.16.1-1.el7.elrepo.x86_64
node0x x.x.x.x CentOs7 4.16.1-1.el7.elrepo.x86_64

注意:部署这些编排工具的时候服务器数量不定,1台服务器也行,所以读者可以自由增减服务器。

2)前提条件
  • Docker版本1.18+
  • 集群节点之间保证TCP 2377TCP/UDP 7946UDP 4789端口通信

注意Docker版本最好大于1.12,因为1.12版本之后Docker Swarm才正式归入Docker内置命令内,另外,需要保证各个节点之间的可连通性,如果是外网集群的话,注意要设置iptable来限定某些IP对于某些端口的可访问性。

二、集群部署

1)master节点创建Swarm集群(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
[root@master ~]# docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join --token SWMTKN-1-3fzyAz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 

注意:真的是一键部署集群!!!,上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址manager联系。命令的输出包含了其它节点如何加入集群的命令。

使用docker info或者 docker node ls查看集群中的相关信息

docker info
 
.......
Swarm: active
 NodeID: kfi2r4dw6895z5yvhlbyzfck6
 Is Manager: true
 ClusterID: y2zgs373cg0y6559t675yexcj
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
.......
2)添加节点到swarm集群中

需要在所有节点执行,worker节点只需一条命令就可以加入集群

docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377

master上查看集群节点的状态


到此Swarm集群就创建好了,我们现在有一个多节点的Swarm集群,我们来测试一下常用的命令吧~~~

3)docker node 命令
[root@master ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:


Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


# demote
   将管理节点降级为普通节点
# inspect
    查看节点的详细信息
# ls
   列出节点
# promote
   将普通节点升级为管理节点
# ps
   查看运行的任务
# rm
   从swarm集群中删除节点
# update
   改变集群节点状态
[root@master ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")


# 主要使用availability string

# active
    节点状态正常
# pause
    节点挂起、暂停
# drain
    排除节点,比如将master节点排除,不分配任务,只作为管理节点
    

node update命令

三、在Swarm中部署服务

集群部署好了,我们接下来该测试一下我们的集群基本使用是否正常,下面我们开始我们的测试。

1)创建Hello服务,查看服务信息
[root@master ~]# docker service create --replicas 1 --name hello busybox
[root@master ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
kosznwn4ombx        hello               replicated          0/1                 busybox:latest

REPLICAS中能看出这个 hello服务并没有启动起来,0/1表示 1计划启动的副本数,0实际启动的数量。所以启动失败 

2)添加参数

hello服务busybox只是一个基础镜像,并没有一个持续运行的任务,所以manager会不断重启hello这个服务,所以有好多shutdown的记录。但是我们可以为其添加一个任务使其持续运行。
注意:为什么没有任务Docker容器就会终止呢?这个问题我们之后再回答

[root@master ~]# docker service update --args "ping www.baidu.com" hello
hello
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
 
 
# update:更新状态
 
# --args:增加参数

再次查看hello服务状态:


过滤不正常的hello服务状态:

[root@master ~]# docker service ps -f "desired-state=running" hello
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
yxyivio4mzlg        hello.1             busybox:latest      master              Running             Running 4 minutes ago 
 
 
# -f "desired-state=running" : 状态为runngin的服务
3)为服务扩容(缩融)scale

刚才设置的replicas=1,可以增加副本数量

[root@master ~]# docker service scale hello=4
 
hello scaled to 4
overall progress: 4 out of 4 tasks
1/4: running  
2/4: running  
3/4: running  
4/4: running  
verify: Service converged
 
 
# scale : 指定服务的数量
image
4)工作节点排除managermanager只作为管理节点

上图中manager也运行了一个服务,将manager排除在外,在正式的生产环境中我们都建议这么做,因为在容器编排当中,区分WorkerMaster节点的主要原因是因为Worker 只负责完成任务,启动服务,而Master则负责任务的调配,一旦Master节点也运行服务,导致Master节点负载过重,则会使集群发生崩溃,所以工作节点排除manager是很有必要的。

[root@manager ~]# docker node update --availability drain manager
 
# node update : 更改节点状态
 
# --availability : 三种状态
     
   active: 正常
   pause:挂起
   drain:排除

排除manager后,其上面运行的服务会转移到其他节点

image

四、滚动更新服务

例如升级服务的镜像版本

[root@manager ~]# docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6
 
 
# 启动3个副本集的redis
 
# update-delay 10s :每个容器依次更新,间隔10s

滚动更新:

docker service update --image redis:3.0.7 redis

更新完成后新版本和历史记录都能查看


image

查看配置信息:


image

五、服务更新和回滚策略

1)设置策略
[root@manager ~]# docker service create \
--name my-web \
--replicas 10 \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio 0.2 \
nginx:1.12.1
 
 
# --update-parallelism 2  : 每次允许两个服务一起更新
 
#--update-failure-action continue : 更新失败后的动作是继续
 
# --rollback-parallelism 2  :  回滚时允许两个一起
 
# --rollback-monitor 20s  :回滚监控时间20s
 
# --rollback-max-failure-ratio 0.2 : 回滚失败率20%

如果执行后查看状态不是设置的,可以在update一下,将服务状态设置为自己想要的

docker service update --rollback-monitor 20s  my-web
 
docker service update --rollback-max-failure-ratio 0.2 my-web
 
# 有两个地方设置数值没有成功,手动设置

查看状态:


image
2)服务更新
[root@manager ~]# docker service update --image nginx:1.13.5 my-web

和上述策略一致,两两更新



更新完成:


3)手动回滚(策略是失败会回滚,现在没有失败)

刚才nginx版本已经是1.13.5了,现在将其还原到1.12.1

[root@manager ~]# docker service update --rollback my-web

手动回滚成功

2 docker swarm集群可视化管理

一、工具介绍

我们既然搭建好了我们的容器编排集群,那我们总不能日常的时候也在命令行进行操作,所以我们需要使用到一些可视化的工具,Docker图形化管理提供了很多工具,有PortainerDocker UIShipyard等等,本文主要介绍Portainer

Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

二、创建容器

1)下载官方镜像
[root@ linuxidc /]# docker pull portainer/portainer
Using default tag: latest
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
ba5495c717cb: Pull complete
Digest: sha256:8146a5aae1135a0ccee424488c6867b438be21d1e915903a858d12e8382b817b
Status: Downloaded newer image for portainer/portainer:latest
2)单机运行

如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker镜像、容器等数据。

创建数据卷:

[root@linuxidc ~]# docker volume create portainer_data
portainer_data

注意:很多人会有疑问,为什么要创建数据卷?这个我们也在之后进行回答,这里埋下一坑。

运行容器:

[root@linuxidc ~]# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
439cc8a6d44a84f5967534c50d3accc43fbeb578258a52c2683afeb230dd6e04

参数说明:
-d:容器在后台运行;
-p 9000:9000 :宿主机9000端口映射容器中的9000端口
-v /var/run/docker.sock:/var/run/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中;
-v portainer_data:/data :把宿主机portainer_data数据卷挂载到容器/data目录;

查看容器进程:

[root@linuxidc ~]# docker ps -l
CONTAINER ID        IMAGE                COMMAND            CREATED            STATUS              PORTS                    NAMES
439cc8a6d44a        portainer/portainer  "/portainer"        13 seconds ago      Up 13 seconds      0.0.0.0:9000->9000/tcp  amazing_clarke

访问服务:
访问方式:http://IP:9000 ,首次登录需要注册用户,给用户admin设置密码,如下图:


单机版本选择“Local",点击Connect即可连接到本地docker,如下图:

注意:从上图可以看出,有提示需要挂载本地/var/run/docker.socker与容器内的/var/run/docker.socker连接。因此,在启动时必须指定该挂载文件。

3)集群运行

更多的情况下,我们会有一个docker集群,可能有几台机器,也可能有几十台机器,因此,进行集群管理就十分重要了,Portainer也支持集群管理,Portainer可以和Swarm一起来进行集群管理操作。首先要搭建了一个Swarm,本文不着重介绍Swarm集群的安装。

启动集群参考官方文档:https://portainer.io/install.html

$ docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=//opt/portainer,dst=/data \
portainer/portainer \
-H unix:///var/run/docker.sock

启动Portainer之后,首页还是给admin用户设置密码(这里和单机启动一样)。


我们进入之后可以看到这个一个界面。
image


我们可以看到我们现在的集群的节点配置情况
image
我们可以看到我们集群中各节点的容器分布情况

3 Docker Swarm+阿里云镜像仓库实战

我们现在已经做好了集群以及集群的可视化管理,我们可以将自己的服务打包到DockerHub仓库进行发布,但有时候我们希望有个自己的私人仓库,能够不对外暴露的话,怎么办呢?我们这里介绍一种方式,基于Docker Swarm+阿里云镜像仓库的服务部署方式。

一、自建阿里云镜像仓库

根据链接进入到镜像仓库



新建镜像仓库


image

我们选择从命令行推镜像

新建好“test”镜像仓库,看看具体的仓库情况


二、自建镜像推到远程仓库

我们拉下来一个镜像,记住镜像的 ID


我们先在本地登录仓库,便于之后的操作
image

将本地的镜像打上TAG,推到远程仓库

我们切换到远程仓库,test镜像仓库已经有了该镜像,说明我们推送成功了。

三、Docker Swarm拉取镜像启动服务

1)Portainer添加私有库
image
2)Portainer拉取远程仓库启动一个容器

启动容器


测试容器是否正常运行
image
根据Postman的信息,服务正常运行,说明我们这个思路是正确的~

4 总结

单就目前的云市场来说,Kubernates已经占据80%的市场份额,Docker Swarm已逐渐被淘汰,像阿里云将会在不久之后终止对Swarm的云编排的支持。虽然是这样的请况,但是对于我们个人开发者来说,也许我们的服务器配置很低,但我们又想用云平台来部署自己的服务,那我们大可以选择Docker Swarm,简单又不需要极高的配置,还能让我们尝试云服务带给我们的便捷性,何乐而不为呢?


号主介绍

前两年在二线大厂工作,目前在创业公司搬砖。

接触方向是爬虫云原生架构方面,

丰富的反爬攻克经验以及云原生二次开发经验。

其他诸如数据分析黑客增长也有所涉猎。

做过百余人的商业分享以及多次开办培训课程。

目前也是**CSDN博客专家 **

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349