47

Docker Swarm 从入门到放弃

 4 years ago
source link: http://www.cnblogs.com/sword-successful/p/12267163.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

yQRZRrJ.png!web

准备工作

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

EnEnMjZ.png!web 安装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

yyEzu2e.png!web

进入主机

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

3MFFj2B.png!web

从集群中移除服务

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

JFbIvqv.png!web

nginx服务

Y3mueya.png!web GUI管理页面

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

参考


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK