Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker 使用 Swarm 可以很方便的在多个主机上创建容器集群,并且容器之间可以跨主机网络通信。
Swarm 的集群分为 Manager 节点和 Worker 节点。
Swarm 中使用 Service 来创建/管理使用相同镜像的多个容器,多个容器同时对外提供服务,多个容器之间负载均衡。每个 Service 有一个浮动IP(VIP),各个容器还有自己的物理IP。创建基于 Swarm 的 Overlay 网络,将 Service 挂载到此网络上。然后 Service 中的各个容器便可以通过 Service 名称和 IP 地址实现网络互通。
下面使用了三个机器来组建一个Swarm集群
bd0 192.168.0.109
bd1 192.168.0.192
bd2 192.168.0.193
Docker 开启远程管理
默认情况下,Docker守护进程会生成一个 /var/run/docker.sock 文件来进行本地进程通信,而不会监听任何端口,所以默认情况下 Docker 只能在本地使用命令行操作。 如果要在其它机器上远程操作 Docker 主机,就需要让 Docker 监听一个端口,这样才能实现远程通信。
在我的 CentOS 7X 上,首先修改 Docker 配置文件 /etc/sysconfig/docker 中的 OPTIONS 参数,添加
-H unix:///var/run/docker.sock -H 0.0.0.0:5555
修改后参数类似
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -H unix:///var/run/docker.sock -H 0.0.0.0:5555'
然后重新启动 Docker 服务
$ sudo systemctl restart docker.service
测试一下
sudo docker -H <HOST>:5555 images
创建 Swarm 集群
获取 Swarm 镜像
分别在三个节点上下载swarm镜像
$ sudo docker pull swarm
初始化Swarm集群
首先在 bd0 节点上初始化 Swarm 集群
$ sudo docker swarm init Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (192.168.0.109 on eth0 and 192.168.122.1 on virbr0) - specify one with --advertise-addr
第一次创建失败了,原因是我的机器有两块网卡,Swarm不知道要用那块网卡组建集群,所以需要使用 --advertise-addr 来指定使用那块网卡。
$ sudo docker swarm init --advertise-addr 192.168.0.109 Swarm initialized: current node (1egy2ark49q6xokudps5wykhn) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl 192.168.0.109:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
然后分别在 bd1 和 bd2 节点上运行下面命令将机器加入集群
$ sudo docker swarm join --token SWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl 192.168.0.109:2377
This node joined a swarm as a worker.
下面查看一下集群节点信息
$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 11ochjq4o1s2m6w4u8jxb37w6 bd1 Ready Active 1egy2ark49q6xokudps5wykhn * bd0 Ready Active Leader b4e2ywnhhd6fhgfxtr1qh4gew bd2 Ready Active
创建集群跨主机网络
首先查看一下集群网络
$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE 36679de6466b bridge bridge local 72e853673d8b docker_gwbridge bridge local b45cef05e017 host host local 1zzlk9hpwyqy ingress overlay swarm
添加一个Swarm网络
$ sudo docker network create --driver overlay myswarm a04evrfrr4cvnbvrummzvg0mn
创建后,查看一下集群网络
$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE 36679de6466b bridge bridge local 72e853673d8b docker_gwbridge bridge local b45cef05e017 host host local 1zzlk9hpwyqy ingress overlay swarm a04evrfrr4cv myswarm overlay swarm
部署服务
这里使用 nginx 服务来演示一下怎样创建一个服务集群。
下载nginx镜像
$ sudo docker pull nginx
创建服务
$ sudo docker service create --replicas 2 --name mynginx -p 8000:80 --network=myswarm nginx 5xrm96xveqw5gq63srts1rbhw
这里创建了需要两个 nginx 实例的 nginx 服务。同时,为了能被外网地址访问,我们做了一下端口映射,映射到物理主机的8000端口。
查看服务
$ sudo docker service ls ID NAME REPLICAS IMAGE COMMAND 5xrm96xveqw5 mynginx 2/2 nginx $ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 23 seconds ago divhrq89xhxka8bvb8r9zqqhz mynginx.2 nginx bd2 Running Running 20 seconds ago $ sudo docker service inspect mynginx ... "VirtualIPs": [ { "NetworkID": "1zzlk9hpwyqyocloxy9j9vct7", "Addr": "10.255.0.6/16" }, { "NetworkID": "a04evrfrr4cvnbvrummzvg0mn", "Addr": "10.0.0.2/24" } ] ...
在bd0上查看
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e480d427fd51 nginx:latest "nginx -g 'daemon off" 41 seconds ago Up 40 seconds 80/tcp mynginx.1.1crmc5ecsjoci8xavxzbnbks3
在bd2上查看
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c12d4f9eb457 nginx:latest "nginx -g 'daemon off" 56 seconds ago Up 52 seconds 80/tcp mynginx.2.divhrq89xhxka8bvb8r9zqqhz
服务已经创建并启动了,下面我们在浏览器访问 http://bd0:8000 来验证一下 nginx 服务的状态。
服务的Failover
首先我们查看一下当前服务的状态
$ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 23 seconds ago divhrq89xhxka8bvb8r9zqqhz mynginx.2 nginx bd2 Running Running 20 seconds ago
然后在 bd2 上将其上的服务停止
$ sudo docker kill mynginx.2.divhrq89xhxka8bvb8r9zqqhz mynginx.2.divhrq89xhxka8bvb8r9zqqhz
再次观察服务状态,如下:
$ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 6 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Running Running 4 seconds ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed 5 seconds ago "task: non-zero exit (137)"
可以看到在 bd1 上又起了一个实例用来接替原来在 bd2 上的实例。
服务的扩容/缩容
增加服务实例
$ sudo docker service scale mynginx=3 mynginx scaled to 3 $ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 7 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Running Running about a minute ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed about a minute ago "task: non-zero exit (137)" 985tln0aprsvjthjpve0n6qmz mynginx.3 nginx bd2 Running Preparing 3 seconds ago
减少服务实例
$ sudo docker service scale mynginx=2 mynginx scaled to 2 $ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 7 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Shutdown Shutdown less than a second ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed about a minute ago "task: non-zero exit (137)" 985tln0aprsvjthjpve0n6qmz mynginx.3 nginx bd2 Running Running 5 seconds ago
删除服务
$ sudo docker service rm mynginx
总结
以上所述是小编给大家介绍的Docker使用Swarm组建集群的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]