swarm集群
Docker Machine是一个工具,用来在虚拟主机(电脑上,云端)上安装Docker Engine,并使用 docker-machine命令来管理这些虚拟主机(Machine)
Docker Swarm则是多终端的Docker 连接工具
install swarm
1 2 3
| docker pull swarm docker run --rm swarm -v
|
Host_consul_ip的例子
基于 consel 服务发现后端来配置一个本地 Swarm 集群
1.1 配置每个节点主机
1 2 3 4 5 6 7 8 9
| 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
| 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
| docker run -d -p 8500:8500 --name=consul progrium/consul -server \ -bootstrap -ui-dir /ui 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 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
|
1.2.3.启动工作节点(node_ip,ip为101,102,103的虚拟主机)
1 2 3 4 5 6 7 8
| 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
|
dockerHub 的服务发现后端,需要各个节点能通过公网访问到 DockerHub 的服务接口
在任意一台安装了 Swarm 的机器上执行 swarm create 命令来在 DockerHub 服务上进行注册
2.1 创建集群 id
Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token,用来标识要管理的集群
1 2 3 4 5
| sudo docker ps -a sudo docker run --rm swarm create token_id=ce2f14fa5ec481170d2bf62f40f832f7
|
2.2 配置集群节点
添加节点A(101)、B(102)到集群,在所有要加入集群的普通节点上面执行 swarm join 命令,表示把这台机器加入指定集群当中
1 2 3 4 5 6 7 8 9
| 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 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
| docker run -d -p 8888:2375 swarm manage token://$token_id docker ps 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 docker-machine create -d virtualbox --swarm --swarm-master \ --swarm-discovery token://$sid swarm-master 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 sudo docker run -itd --name engmgr ubuntu sudo docker ps for i in `seq 1 6`; do sudo docker run -itd -e \ constraint:itype!=frontend --name eng$i ubuntu; done sudo docker ps sudo docker run -itd --name engmgr-c -e \ affinity:container==engmgr ubuntu docker-machine kill $(docker-machine ls -q) sudo docker images
|
注意:您会注意到命令不能与前缀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 docker-machine ls eval "$(docker-machine env node-1)" docker-machine ssh node-1 docker swarm init --advertise-addr 45.55.87.176 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-machine ssh node-1 docker node ls docker node --help docker info docker service create -p 80:80 --name webserver nginx docker service ls 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
| docker-machine create --driver amazonec2 \ --amazonec2-access-key you_access_key \ --amazonec2-secret-key you_secret_key \ --amazonec2-region=us-west-2 aws-01 docker-machine ssh aws-01 docker swarm init --advertise-addr 54.244.58.2 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 service scale webserver=5 docker service ps webserver
|
坑一:
创建实例时,先要在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 docker-machine create --driver amazonec2 \ --amazonec2-access-key AKIAIDGRV7O6MZ2DOYDA \ --amazonec2-secret-key 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 \ --amazonec2-vpc-id vpc-978f4cf1 aws-sandbox 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 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