继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker Swarm 从入门到放弃

歪头儿在帝都
关注TA
已关注
手记 4
粉丝 6
获赞 8

image.png

准备工作

我本机是macOS,所以我直接安装了docker desktop,其中包含了docker-machine,不用单独安装。

image.png安装docker主机驱动

我在网上很多人提到了使用virtualbox,太重量级了,我安装了xhyve,更轻量级。


brew install docker-machine-driver-xhyve

下载boot2docker.iso

如果不安装的话第一次执行docker-machine create 速度会很慢,你懂得哦。所以在github上下载boot2docker.iso, 然后拷贝到对应目录下,我的主机目录(/Users/zhangfei/.docker/machine/cache),

创建docker主机

创建docker主机我们用到docker-machine 命令,这也是docker三剑客之一的命令。

查看主机


docker-machine ls

创建主机


# xhyve驱动

docker-machine create -d xhyve test1

# virtualbox驱动

docker-machine create -d virtualbox test1

image.png

进入主机


docker-machine ssh test1

退出主机


docker@test1:exit

创建swarm集群

创建三台docker主机


docker-machine create -d xhyve manager1 &&

docker-machine create -d xhyve worker-1 &&

docker-machine create -d xhyve worker-2

配置集群节点

执行以下命令,这里是在manager1主机上使用docker swarm创建一个管理节点,初始化集群的时候会自动把当前节点设置为管理员节点。


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节点,并加入集群,上面已经给出了提示命令。


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集群,包含一个管理节点和两个工作节点。

docker service部署单个集群服务

我们使用docker service命令来管理swarm集群中的服务,该命令只能在管理节点上执行, 这里我们使用nginx作为测试镜像,我这里会拉去nginx最新版本,拉取之前,我们先在3台docker主机上配置国内镜像地址,要不然拉取官方镜像的话会很慢。


#在三台主机上以此执行

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

服务部署好查看服务


#服务部署好查看服务

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服务。

image.png

从集群中移除服务


docker@manager1:~$ docker service rm nginx

docker stack部署多个集群服务

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 服务

image.png

nginx服务

image.pngGUI管理页面

当然,如果说要用于生产环境中,又或者是像通过更直观的方式观察容器或者服务的运行情况,我们肯定离不开可视化界面,这里推荐两个可视化工具**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

WX20200205-223240@2x.png

WX20200205-223314@2x.png

总结

在测试可视化工具时,我先使用visualizer,stack命令执行后Rurrent State一直是Preparing, 也就是说服务一直起不来,不知道什么情况,猜测可能是镜像问题,然后换了另一个portainer时就好了,证明确实是那个镜像有问题,这里感谢纯洁的微笑大哥和蟋蟀大哥的文章,学习了docker swarm相关。

参考

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP