我本机是macOS,因此我直接安装了docker desktop,其中包含了docker-machine,不用单独安装。html
我在网上不少人提到了使用virtualbox,过重量级了,我安装了xhyve,更轻量级。node
brew install docker-machine-driver-xhyve
复制代码
若是不安装的话第一次执行docker-machine create 速度会很慢,你懂得哦。因此在github上下载boot2docker.iso, 而后拷贝到对应目录下,个人主机目录(/Users/zhangfei/.docker/machine/cache),nginx
建立docker主机咱们用到docker-machine 命令,这也是docker三剑客之一的命令。git
docker-machine ls
复制代码
# xhyve驱动
docker-machine create -d xhyve test1
# virtualbox驱动
docker-machine create -d virtualbox test1
复制代码
docker-machine ssh test1
复制代码
docker@test1:exit
复制代码
docker-machine create -d xhyve manager1 &&
docker-machine create -d xhyve worker-1 &&
docker-machine create -d xhyve worker-2
复制代码
执行如下命令,这里是在manager1主机上使用docker swarm建立一个管理节点,初始化集群的时候会自动把当前节点设置为管理员节点。github
bogon:~ zhangfei$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.64.2"
Swarm initialized: current node (5lyi9tkwqyugnk9626f5jhamy) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
复制代码
接着在worer1和worker2节点上建立worker节点,并加入集群,上面已经给出了提示命令。docker
bogon:~ zhangfei$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$
复制代码
docker@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5lyi9tkwqyugnk9626f5jhamy * manager1 Ready Active Leader 19.03.5
r01xh6k73cj24yqrmtau3bsqf worker1 Ready Active 19.03.5
5hkzm4ogghgbt6bale2bo7lf5 worker2 Ready Active 19.03.5
docker@manager1:~$
复制代码
OK,到这里咱们就建立一个最小的Swarm集群,包含一个管理节点和两个工做节点。json
咱们使用docker service命令来管理swarm集群中的服务,该命令只能在管理节点上执行, 这里咱们使用nginx做为测试镜像,我这里会拉去nginx最新版本,拉取以前,咱们先在3台docker主机上配置国内镜像地址,要否则拉取官方镜像的话会很慢。bash
#在三台主机上以此执行
docker@manager1:~$ sudo touch /etc/docker/daemon.json &&
> sudo chmod 777 /etc/docker/daemon.json &&
> sudo echo '{ "registry-mirrors": ["http://hub-mirror.c.163.com"]}' > /etc/docker/daemon.json
复制代码
#修改完镜像地址后重启三台docker主机
docker-machine restart manager1 &&
docker-machine restart worker1 &&
docker-machine restart worker2
复制代码
#docker service 拉取nginx镜像
docker@manager1:~$ docker service create --replicas 3 -p 8088:80 --name nginx nginx:latest
复制代码
#也可使用scale命令手动扩展服务个数
docker@manager1:~$ docker service scale 3
复制代码
服务部署好查看服务app
#服务部署好查看服务
docker@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ja2xjj0dn08m nginx replicated 3/3 nginx:latest *:8088->80/tcp
复制代码
docker@manager1:~$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
py9f7w78a95c nginx.1 nginx:latest manager1 Running Running 12 minutes ago
ghv07io2w1hv nginx.2 nginx:latest worker1 Running Running 12 minutes ago
y00d8c0xadil nginx.3 nginx:latest worker2 Running Running 12 minutes ago
复制代码
三个服务部署好之后,可使用三台机器任一ip查看nginx服务。asp.net
从集群中移除服务
docker@manager1:~$ docker service rm nginx
复制代码
docker service只能部署单个服务,部署多个服务的话则须要用到docker stack, 这里一样要使用到docker-compose.yml配置文件,docker-compose是在单机环境提供多容器编排工具,结合docker stack则实现了多主机容器编排服务。 先来建立docker-compose.yml文件,建立两个服务,一个是asp.net core的测试镜像,另外一个是nginx,这里须要在管理节点建立yml文件。
version: "3"
services:
aspnetcore:
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
ports:
- 8088:80
deploy:
mode: replicated
replicas: 3
nginx:
image: nginx:latest
ports:
- 8087:80
deploy:
mode: replicated
replicas: 3
复制代码
如上所述,总共部署了两个服务,而后执行docker stack deploy命令。
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
Creating network deploy-test_default
Creating service deploy-test_aspnetcore
Creating service deploy-test_nginx
复制代码
查看服务
docker@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
8au30q7tblq0 deploy-test_aspnetcore replicated 3/3 mcr.microsoft.com/dotnet/core/samples:aspnetapp *:8088->80/tcp
367gpz567iiv deploy-test_nginx replicated 3/3 nginx:latest *:8087->80/tcp
复制代码
查看到服务名称,而后能够根据服务名称查看服务运行情况
docker@manager1:~$ docker service ps deploy-test_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ov75hjkdux6i deploy-test_nginx.1 nginx:latest worker1 Running Running 27 seconds ago
bcq2zw5p33cb deploy-test_nginx.2 nginx:latest worker2 Running Running 27 seconds ago
cfhbisbab3op deploy-test_nginx.3 nginx:latest manager1 Running Running 27 seconds ago
复制代码
到这一步,咱们能够打开三台主机的任意一台,看下8088端口和8087端口的服务。 asp.net core 服务
固然,若是说要用于生产环境中,又或者是像经过更直观的方式观察容器或者服务的运行状况,咱们确定离不开可视化界面,这里推荐两个可视化工具**visualizer,portainer, **我更新本地的docker-compose.yml,把portainer更新进去,portainer相比visualizer,功能更强大些,可支持在管理界面上操做服务。 可视化工具只须要安装在管理节点上便可。
version: "3"
services:
aspnetcore:
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
ports:
- 8088:80
deploy:
mode: replicated
replicas: 3
nginx:
image: nginx:latest
ports:
- 8087:80
deploy:
mode: replicated
replicas: 3
portainer:
image: portainer/portainer:latest
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
复制代码
#先暂停stack
docker@manager1:~$ docker stack down deploy-test
Removing service deploy-test_aspnetcore
Removing service deploy-test_nginx
Removing network deploy-test_default
复制代码
#启动stack
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
复制代码
在测试可视化工具时,我先使用visualizer,stack命令执行后Rurrent State一直是Preparing, 也就是说服务一直起不来,不知道什么状况,猜想多是镜像问题,而后换了另外一个portainer时就行了,证实确实是那个镜像有问题,这里感谢纯洁的微笑大哥和蟋蟀大哥的文章,学习了docker swarm相关。
github.com/machine-dri… www.cnblogs.com/guge-94/p/1… blog.csdn.net/Enjolras_fu… www.cnblogs.com/xishuai/p/d…