docker-swarm

swarm集群

Docker Machine是一个工具,用来在虚拟主机(电脑上,云端)上安装Docker Engine,并使用 docker-machine命令来管理这些虚拟主机(Machine)
Docker Swarm则是多终端的Docker 连接工具

install swarm

1
2
3
docker pull swarm
# 查看swarm版本
docker run --rm swarm -v

Host_consul_ip的例子

基于 consel 服务发现后端来配置一个本地 Swarm 集群

1.1 配置每个节点主机

1
2
3
4
5
6
7
8
9
# 我用的是virtualbox,ubuntu16,安装好docker并修改好如下的内容,
# reboot之后clone,clone过后的虚拟机只需要修改一下ip就行
vim /lib/systemd/system/docker.service
ExecStart=xx 再这后面加上如下内容
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
sudo systemctl daemon-reload
sudo systemctl restart docker
ps -aux |grep docket
docker pull swarm

坑一

1
2
3
4
5
6
# docker daemon on node is running with
# -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
alias docker="docker -H tcp://0.0.0.0:2375 \
-H unix:///var/run/docker.sock"
type docker
unalias docker

坑二

1
2
3
4
5
6
docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
--daemon=true --pidfile="/var/run/docker_2375.pid" \
--graph="/var/lib/docker_2375"
docker -H tcp://0.0.0.0:2375 --daemon=true \
--pidfile="/var/run/docker_2375.pid" \
--graph="/var/lib/docker_2375"

坑三

1
2
3
4
5
6
7
vim /lib/systemd/system/docker.service
# 成功的
DOCKER_OPTS=-g /usr/bin/docker -H tcp://0.0.0.0:2375 \
-H unix:///var/run/docker.sock
# 这个是失败的
OPTIONS=-g /usr/bin/docker -H tcp://0.0.0.0:2375 \
-H unix:///var/run/docker.sock

1.2 启动集群

1.2.1.启动 Consel 服务后端(consul_ip or token,本机ip:109)至少一个群集管理器

1
2
3
4
5
6
7
8
# -h ==--name
docker run -d -p 8500:8500 --name=consul progrium/consul -server \
-bootstrap -ui-dir /ui
# 输出一个id:4b80d44e61d4e00510
# sudo docker restart id # 重新启动此容器
docker ps -a
# 在浏览器中打开
192.168.1.109:8500

1.2.2.启动管理节点主机(manager0_ip,ip为100的虚拟主机,一个群组工作者)

1
2
3
4
5
6
7
8
9
10
11
# docker run -d -p 4000:4000 swarm manage -H :4000 --replication \
# --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
# 如果有4000端口占用的情况
docker ps -a
docker rm -f -v containter_id
docker run -d -p 4000:4000 swarm manage -H :4000 --replication \
--advertise 192.168.1.100:4000 consul://192.168.1.109:8500
# 输出一个id:b7a3c10f294f4718bcd0a516f
# 用户也可以启动 从管理节点
# docker run -d swarm manage -H :4000 --replication --advertise \
# <manager1_ip>:4000 consul://<consul_ip>:8500

1.2.3.启动工作节点(node_ip,ip为101,102,103的虚拟主机)

1
2
3
4
5
6
7
8
# docker run -d swarm join --advertise=<node_ip>:2375 \
# consul://<consul_ip>:8500
docker run -d swarm join --advertise=192.168.1.101:2375 \
consul://192.168.1.109:8500
docker run -d swarm join --advertise=192.168.1.102:2375 \
consul://192.168.1.109:8500
docker run -d swarm join --advertise=192.168.1.103:2375 \
consul://192.168.1.109:8500

节点启动后,用户可以指定 Docker 服务地址为 :4000> 来测试各种 Docker 命令,可以看到整个 Swarm 集群就像一个虚拟的 Docker 主机一样正常工作.

1
2
3
sudo docker -H 192.168.1.100:4000 ps -a
sudo docker -H tcp://192.168.1.100:4000 info
sudo docker ps --no-trunc

由于 Swarm 实际上是通过 agent 调用了本地的 Docker daemon 来运行容器,当 Swarm 集群服务出现故障时,无法接受新的请求,但已经运行起来的容器将不会受到影响.

在集群上运行容器

1
sudo docker -H 192.168.1.100:2375 run -d --name web1 nginx

2. token的例子

dockerHub 的服务发现后端,需要各个节点能通过公网访问到 DockerHub 的服务接口

在任意一台安装了 Swarm 的机器上执行 swarm create 命令来在 DockerHub 服务上进行注册

2.1 创建集群 id

Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token,用来标识要管理的集群

1
2
3
4
5
# ip_109本机执行
sudo docker ps -a
sudo docker run --rm swarm create
# 只需要运行一次就行了,它会一直保存着,虽然在本机docker ps -a也查看不到
token_id=ce2f14fa5ec481170d2bf62f40f832f7

2.2 配置集群节点

添加节点A(101)、B(102)到集群,在所有要加入集群的普通节点上面执行 swarm join 命令,表示把这台机器加入指定集群当中

1
2
3
4
5
6
7
8
9
# ip_109本机执行
sudo docker run --rm swarm join --addr=192.168.1.100:2375 \
token://$token_id
sudo docker run --rm swarm join --addr=192.168.1.101:2375 \
token://$token_id
sudo docker run --rm swarm join --addr=192.168.1.102:2375 \
token://$token_id
# 列出节点 只需要出现一条记录之后就ctrl+c
sudo docker run --rm swarm list token://$token_id

2.3配置管理节点

在任何一台主机A(A:192.168.1.100)B或者C上开启管理程序

1
2
3
4
5
6
7
8
9
10
# ip_100上执行
docker run -d -p 8888:2375 swarm manage token://$token_id
# 可以通过 docker ps 命令来查看启动的 swarm manager 服务容器
docker ps
# ip_109本机上 管理集群
sudo docker -H 192.168.1.100:8888 ps
# 在集群上运行容器
sudo docker -H 192.168.1.100:8888 run -d --name web1 nginx

几个命令就将多个单机版本的 Docker daemon 变成一个 cluster,还支持了 service 概念(多个容器实例副本的抽象)

3. docker-machine swarm -d virtualbox

docker daemon是root

python此用户才能在virtualbox中看到创建的dev等虚拟机,docker-machine是普通用户的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
docker run swarm -v
sid=$(sudo docker run swarm create)
echo $sid
docker ps -a #有上面两个但状态都是Exited
docker-machine create -d virtualbox --swarm --swarm-master \
--swarm-discovery token://$sid swarm-master
# The host-only adapter is corrupted. Let's stop the VM, fix the host-only adapter and restart the VM
# 但我没有去做操作,它自动去改了?
docker-machine ls
docker-machine create -d virtualbox --engine-label itype=frontend \
--swarm --swarm-discovery token://$sid swarm-node-01
docker-machine create -d virtualbox --engine-label itype=frontend \
--swarm --swarm-discovery token://$sid swarm-node-02
docker-machine create -d virtualbox --engine-label itype=frontend \
--swarm --swarm-discovery token://$sid swarm-node-03
docker-machine env swarm-master
docker-machine env --swarm swarm-master
eval "$(docker-machine env --swarm swarm-master)"
docker info
docker run swarm list token://$sid
dokcer ps -a
docker-machine ls
eval "$(docker-machine env swarm-master)"
docker ps -a
eval "$(docker-machine env --swarm swarm-master)"
docker-machine ls
docker ps
# 进入环境了,docker run
sudo docker run -itd --name engmgr ubuntu
sudo docker ps
# 居然不是下在本机的 成功 有没有可能是主机的docker是什么权限,环境中的也是啊
# swarm-node-02/engmgr 而我的是engmgr
for i in `seq 1 6`; do sudo docker run -itd -e \
constraint:itype!=frontend --name eng$i ubuntu; done
sudo docker ps
# swarm-node-02/eng1 等还是没有前缀名
# filter
sudo docker run -itd --name engmgr-c -e \
affinity:container==engmgr ubuntu
docker-machine kill $(docker-machine ls -q)
# 好像就回到了本机了
sudo docker images
# ubuntu的镜像也在下载过来了

注意:您会注意到命令不能与前缀sudo .这是因为它假设您正在使用的登录到服务器docker-machine ssh使用Docker窗机设置后命令

4. docker-machine swarm -d digital

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
DOTOKEN=DOTOKEN_ID
# 生成节点
for i in 1 2 3; do docker-machine create --driver digitalocean \
--digitalocean-image ubuntu-16-04-x64 \
--digitalocean-access-token $DOTOKEN node-$i; done
# 该开的端口,也都开了
# 命令成功完成后,您可以通过访问您的DigitalOcean仪表板或输入以下命令来验证是否已创建所有计算机:
#更新docker-machine之后执行,就如此简单的创建了主机,在控制面板就可以看到新创建出来的实例了:
docker-machine ls
eval "$(docker-machine env node-1)"
# 使节点成为集群成员,选择其中一个节点并将其作为Docker Swarm(Node-1)管理器
docker-machine ssh node-1
docker swarm init --advertise-addr 45.55.87.176
# 会输出如下信息
# docker swarm join --token SWMTKN-1-xx 45.55.87.176:2377
# 并将其余部分配置为Docker Swarm工作线程.
docker-machine ssh node-2
docker swarm join --token SWMTKN-1-xx 45.55.87.176:2377
docker-machine ssh node-3
docker swarm join --token SWMTKN-1-xx 45.55.87.176:2377
# Docker Swarm管理命令必须在管理器节点上执行
docker-machine ssh node-1
docker node ls
docker node --help
# 您可以随时从群集中添加或删除节点. 此外,工作节点可以升级为管理器,并且管理器可以转换为工作器
docker info
# 在Docker Swarm中运行服务 docker node命令一样, docker service命令只能在管理器节点上执行
docker service create -p 80:80 --name webserver nginx
# 要查看集群上运行的服务,请键入:
docker service ls # 可以输入node-1IP到浏览器中,可以看到Nginx的默认页面.
# 您可以通过使用docker service ps后跟服务名称来确定服务正在运行的节点
docker service ps webserver
docker-machine stop node-1 node-2 node-3
docker swarm --help

大坑:

-driver virtualbox

docker-machine version 0.12.0 是没有问题的

但 amazonec2 和 digitalocean ,都要是0.12.1版本才行,不然在创建时,会报如下错

Error creating machine: Error running provisioning: ssh command error:
Unable to query docker version: Cannot connect to the docker engine endpoint

5. docker-machine 在AWS创建Docker主机(会创建一个新的实例,会有收费)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# http://usyiyi.cn/documents/docker/machine/examples/aws.html
# 开放22,2376,2377,80 Docker machine的安全组
docker-machine create --driver amazonec2 \
--amazonec2-access-key you_access_key \
--amazonec2-secret-key you_secret_key \
--amazonec2-region=us-west-2 aws-01
# /home/python/.docker/machine/machines/aws-01
docker-machine ssh aws-01 # 虽然有下面的各种坑,但还是能进去,一直报错所以一直没有执行此命令
docker swarm init --advertise-addr 54.244.58.2
# 不像digitalocean 一样顺利,还得vim /lib/systemd/system/docker.service 然后重启,再执行就和digitalocean一样了
docker swarm join --token SWMTKN-1-xx 54.244.58.2:2377
docker-machine create --driver amazonec2 \
--amazonec2-access-key you_access_key \
--amazonec2-secret-key you_secret_key \
--amazonec2-region=us-west-2 aws02
docker-machine ssh aws02
sudo docker swarm join --token SWMTKN-1-xx 54.244.58.2:2377
docker-machine ssh aws-01
docker service create -p 80:80 --name webserver nginx
docker service ls
docker service ps webserver
# Docker Swarm的另一个功能是缩放服务的能力,即启动服务的其他实例.假设我们想将我们之前启动的webserver服务扩展为五个实例
docker service scale webserver=5 #output: webserver scaled to 5
docker service ps webserver # 可以看到这5个服务在都分布在哪些节点上

坑一:

创建实例时,先要在EC2控制面板创建一对密钥对,在创建实例时,选择此密钥对,并保存好,当你创建好实例之后,要连接实例时需要此.pem文件,才能连接上,不然就悲剧了.

坑二:

IAM:不是你的用户名和密码(root) ,失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker-machine create --driver amazonec2 \
--amazonec2-access-key username \
--amazonec2-secret-key password \
--amazonec2-vpc-id vpc-a24484c4 aws-sandbox
# 你也可以创建其它的用户来管理aws,失败
docker-machine create --driver amazonec2 \
--amazonec2-access-key AKIAIDGRV7O6MZ2DOYDA \
--amazonec2-secret-key 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 \
--amazonec2-vpc-id vpc-978f4cf1 aws-sandbox
# 但只能是root用户才能访问成功
docker-machine create --driver amazonec2 \
--amazonec2-access-key you_access_key \
--amazonec2-secret-key you_secret_key \
--amazonec2-vpc-id vpc-a24484c4 \
--amazonec2-zone=b aws-sandbox
# unable to find a subnet in the zone: us-east-1b to issue
ssh -i "femn.pem" ubuntu@ec2-34-212-39-188.us-west-2.compute.amazonaws.com
sudo apt install awscli
aws configure

坑三: 配置aws CLI ,IAM上面已得知了,Default region name:必须是这个实例的实际地址

一定要选自己的地区 us-west-2

Share Comments