当前位置:   article > 正文

Docker-三剑客之machine、compose、swam集群、visualizer监控、stack部署集群、Portainer可视化_docker swarm compose stack

docker swarm compose stack

介绍

DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。

为了把容器化技术的优点发挥到极致,docker公司先后推出了三大技术:docker-machine,docker-compose,docker-swarm,可以说是几乎实现了容器化技术中所有可能需要的底层技术手段。

doceker-machine是在解决docker运行环境的问题
docker-compose是在解决容器编排的问题
docker-swarm是解决多主机多个容器的部署调度的问题

一.docker-machine

Docker Machine是一个简化安装Docker环境的工具,主要作用是创建和管理docker主机。一般公司云服务器毕竟少,个人觉得Docker Machine在实际使用中用处不大。直接在云服务器上安装即可。

1.machine安装

我们需要docker-machine-Linux-x86_64-0.16.1安装包:

链接: docker-machine 提取码: 6itu

因为是二进制文件,所以需要增加执行权限

[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.1 /usr/local/bin/docker-machine
[root@server1 ~]# chmod  +x /usr/local/bin/docker-machine
  • 1
  • 2

请添加图片描述

在真机上,我们需要下载get-docker脚本到http发布目录下

cd /var/www/html
wget https://get.docker.com/
mv index.html get-docker.sh
  • 1
  • 2
  • 3

请添加图片描述

请添加图片描述
我们需要修改一下get-docker.sh文件

yum_repo="http://172.25.0.250/docker-ce.repo"
has_rootless_extras="0"
  • 1
  • 2

请添加图片描述

请添加图片描述

我们需要准备一台虚拟机server3
将server1,server3做免密i处理:

[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server3:
[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.3 server3

  • 1
  • 2
  • 3
  • 4

请添加图片描述

请添加图片描述
这个时候我们到server3上查看存ps ax
可以看到在server3上以及开始执行动作了!
如下图正在执行安装docker-ce
请添加图片描述

在server1上查看docker-machine的进程
能够看到运行在server3上!
请添加图片描述

我们可以在隐藏目录docker下看到在server3下生成的文件:

cd .docker/
cd machine/machines/server3
ls
  • 1
  • 2
  • 3

请添加图片描述
接着给server2也安装docker
先做免密,再执行脚本进行安装!

ssh-keygen
ssh-copy-id server2
docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.2 server2

  • 1
  • 2
  • 3
  • 4

请添加图片描述

再一次列出所有docker-machine的操作进程
server2,3都在运行了!

docker-machine ls
  • 1

请添加图片描述

2.使用docker-machine

完成之后,我们可以使用docker-machine来控制server2,3
我们可以停掉,重启,查看状态server2

docker-machine stop server2
docker-machine restart server2
docker-machine status server2
docker-machine config server2
  • 1
  • 2
  • 3
  • 4

请添加图片描述

docker-machine env server3
  • 1

显示访问server3所需的环境变量,最后一行就是控制server3的方式
请添加图片描述

当控制server2,3之后docker images看到的是被控制的容器的镜像!
但是有个问题在于显示的不明显,不确定自己是在哪个容器里?

eval $(docker-machine env server3)
docker ps
docker images
eval $(docker-machine env server2)
docker images
env
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述

请添加图片描述

我们来优化它!
将下面几个组件放置这个目录下
链接: .bash文件 提取码: gi5f

[root@server1 ~]#  cd /etc/bash_completion.d
mget *.bash
  • 1
  • 2

请添加图片描述

请添加图片描述
修改环境变量使得,切换到其他的容器之后,可以有效果!

[root@server1 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

  • 1
  • 2
  • 3

请添加图片描述

退出当前shell,重新登陆即可生效
请添加图片描述
我们可以看到如下图,很明显的效果,很清楚的直到当前在哪个容器中!

[root@server1 ~]# docker-machine env server3
[root@server1 ~]# eval $(docker-machine env server2)
  • 1
  • 2

请添加图片描述

二.Docker-compose

这个和下面要介绍的docker-swarm用处较大,compose是服务编排,即事先安排好服务的启动,依赖,创建服务的数量等等。
主要作用在于服务的安排和部署上。dcoker-compose技术,就是通过一个.yml配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里。便利了复杂的多服务的部署。
请添加图片描述

因为我们需要直接使用docker-compose指令来操作,所以需要在系统的/usr/local/bin目录下有compose的二进制文件!
因为用户在命令行输入命令后,系统会在环境变量$PATH内找命令。

cd /usr/local/bin
ls
docker-compose 在这即可!
  • 1
  • 2
  • 3

请添加图片描述

1.docker-compose配置

家目录下创建项目目录,编写主配置文件,docker-compose在up的时候会自动读取

mkdir compose
cd compose
vim docker-compose.yml
  • 1
  • 2
  • 3

请添加图片描述

内容如下:

version: "3.8"
services:
  web1:
    image: nginx
    networks:

   - webnet
     lumes:
        - ./web1:/usr/share/nginx/html #挂载数据卷为nginx默认发布文件

  web2:
    image: nginx
    networks:

   - webnet
     lumes:
        - ./web2:/usr/share/nginx/html #挂载数据卷为nginx默认发布文件

  haproxy:
    image: haproxy
    networks:
      - webnet
    volumes:
      - ./haproxy:/usr/local/etc/haproxy #数据卷为haproxy需要修改的主配置文件
    ports:
      - "80:80" #端口映射本机的80端口映射容器内的80端口
  
  networks: 
    webnet: #网络连接方式为webnet
  • 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

我们需要在当前路径下有web1,web2,haproxy目录

cd compose
mkdir web1
mkdir web2
echo web1 >web1/index.html 
echo web2 > web2/index.html 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述

2.修改haproxy配置文件

我们需要haproxy的配置文件在haproxy目录下

cd compose
mkdir haproxy
get haproxy.cfg
vim haproxy.cfg
  • 1
  • 2
  • 3
  • 4

请添加图片描述

内容修改如下图:
请添加图片描述

请添加图片描述
若是没有配置文件的直接复制下面这段:


global
        maxconn         65535
        stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0
        uid             200
        gid             200
        daemon

defaults
        mode            http
        log             global
        option          httplog
        option          dontlognull
        monitor-uri     /monitoruri
        maxconn         8000
        timeout client  30s
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  5s
        stats uri       /admin/stats



# The public 'www' address in the DMZ
frontend public
        bind            *:80 name clear #监听所有ip的80端口
        #bind            192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem

        #use_backend     static if { hdr_beg(host) -i img }
        #use_backend     static if { path_beg /img /css   }
        default_backend dynamic

# The static backend backend for 'Host: img', /img and /css.
backend dynamic
        balance         roundrobin
        server          a web1:80 check inter 1000
        server          b web2:80 check inter 1000
  • 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

启动服务,-d打入后台

docker-compose up -d
  • 1

请添加图片描述

我们查看docker-compose状态还是结束状态
开启它!
再次查看状态是up!!

docker-compose ps
docker-compose start
docker-compose ps
  • 1
  • 2
  • 3

请添加图片描述

请添加图片描述

测试:
在网页或者在虚拟机上都可以!
只要是先负载均衡即可!
请添加图片描述

请添加图片描述
当我们停止web1的服务后,发现负载均衡只剩web2了,但没有报错这说明有健康监测功能!

docker ps
docker stop compose_web1_1
docker ps
  • 1
  • 2
  • 3

请添加图片描述

请添加图片描述
我们访问网页也可以看到web1掉先变红了!
172.25.0.1/admin/stats
请添加图片描述

此时我们只需要将compose服务重启一下,负载均衡即可恢复,很方便!

cd compose
docker-compose start
curl 172.25.0.1
  • 1
  • 2
  • 3

请添加图片描述

请添加图片描述

我们当然在网页也可以看到web,web2都变绿了!恢复运作了!
请添加图片描述

三.docker swarm

swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。

相比起zookeeper等集群管理框架来说,swarm显得十分轻量,作为一个工具,它把节点的加入、管理、发现等复杂的操作都浓缩为几句简单的命令,并且具有自动发现节点和调度的算法,还支持自定制。虽然swarm技术现在还不是非常成熟,但其威力已经可见一般。
请添加图片描述
docker swarm的优缺点
请添加图片描述

开始初始化:

[root@server1 harbor]# docker swarm init
  • 1

初始化之后,会生成加一个加入集群的指令!

请添加图片描述
我们将这个指令在其他节点执行就可以加入到集群中!

在server2,3都做:
请添加图片描述

请添加图片描述
然后在server1上可以看到加入集群的节点:

docker node ls
  • 1

请添加图片描述

完成之后,我们需要准备一台虚拟机server4
将集群的leader迁移到server2上,而server1负责管理容器的仓库!

快速拉起server4的docker容器
将server3的配置文件传给server4上直接下载docker
请添加图片描述

请添加图片描述

将server2或者server1上的解决桥接的文件传给server3,4

cd /etc/sysctl.d
scp docker.conf server3:/etc/sysctl.d
scp docker.conf server4:/etc/sysctl.d

  • 1
  • 2
  • 3
  • 4

请添加图片描述

记得重启一下,不然不生效

sysctl --system
  • 1

请添加图片描述

docker info
查看,警告没有了!
请添加图片描述
将server4的docker开启服务,并设置开机自启!

systemctl start docker
systemctl enable docker
  • 1
  • 2

请添加图片描述

将server2提升为集群的leader

docker node promote server2
docker node ls
# 可以看到server2变为了rechale
docker node demote server1
  • 1
  • 2
  • 3
  • 4

请添加图片描述
来到server2可以看到已经成为了leader,可以看到其他的集群节点!

docker node ls
  • 1

请添加图片描述

将server1离开swarm集群

docker swarm leave
  • 1

请添加图片描述

在server2上删除server1的集群节点

docker node rm server1
docker node ls
  • 1
  • 2

请添加图片描述

此时,我们将server4也加入集群节点中:
和刚才的leader变化了记得指定的leader为172.25.0.2!!!
请添加图片描述
在server2上查看到集群节点中server4已经加入进来了!

docker node ls
  • 1

请添加图片描述
我们将server1上前面做的compose全部停掉,并将harbor仓库打开!
打开,停止compose服务的时候,一定要在指定的目录下,不然会出错!

cd 
cd compose
docker-compose down
cd ../harbor
docker-compose up -d
  • 1
  • 2
  • 3
  • 4
  • 5

请添加图片描述

请添加图片描述
紧接着web端访问harbor仓库,输入账户密码登陆,和之前的使用一致!
请添加图片描述

将server2的容器仓库指定文件发给server3,4

cd /etc/docker
scp daemon.json server3:/etc/docker/
scp daemon.json server4:/etc/docker/

  • 1
  • 2
  • 3
  • 4

请添加图片描述
重启docker服务
systemctl reload docker
请添加图片描述

再将证书发给server3,4

cd /etc/docker
scp -r certs.d/ server3:/etc/docker/
scp -r certs.d/ server4:/etc/docker/

  • 1
  • 2
  • 3
  • 4

请添加图片描述
将仓库的本地解析做好:
请添加图片描述
上传镜像myapp到容器仓库
server1:

docker load -i myapp.tar

docker  tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
docker  tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2

docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

请添加图片描述

请添加图片描述

请添加图片描述

在web端可以看到上传的镜像:
请添加图片描述

在server2 上:
创建集群服务,名为webservice 端口映射80:80 开启三个节点 镜像为myapp:v1

docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1

  • 1
  • 2

请添加图片描述
在server4上可以看到镜像已经运行起来了:


docker  ps
  • 1
  • 2

请添加图片描述

在server2上查看集群和集群节点服务

docker service ps webservice
  • 1

请添加图片描述
测试访问:curl 172.25.0.2/hostname.html 可以看到访问的主机节点负载均衡
可以看到,因为刚才 开启三个节点,所以负载均衡每三次是一个循环!
请添加图片描述
将集群节点扩容:集群数量变为6个

docker service scale webservice=6
  • 1

请添加图片描述
可以看到每个虚拟机运行两个节点

docker service ps webservice
  • 1

请添加图片描述
测试:访问server2,3,4哪个IP都可以看到!
六台worker主机均负载均衡,采用算法为默认的rr轮询
请添加图片描述

四.添加监控visualizer

容器仓库主机server1:
将visualizer镜像压入harbor仓库

docker load -i visualizer.tar
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest 

docker push reg.westos.org/library/visualizer:latest
  • 1
  • 2
  • 3
  • 4

请添加图片描述

请添加图片描述

1.创建监控:

docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==managere \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
visualizer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述
网页访问监控visualizer,映射端口到主机的8080
firefox:172.25.0.2:8080
请添加图片描述集群数量变为20个

docker service scale webservice=20
  • 1

请添加图片描述
这个时候看监控,可以看到数量开始增多,变为20个
请添加图片描述

2.实现业务滚动更新

将myapp:v1 更新为myapp:v2

[root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s  webservice

  • 1
  • 2

请添加图片描述
我们可以看到监控显示:已经开始从v1>>v2
自己做实验可以观察一下动态变化的过程!
请添加图片描述

接着我们删掉刚才创建的容器和监控!

docker service rm webservice
docker service rm viz
  • 1
  • 2

请添加图片描述
查看监控已经清零

请添加图片描述

五.docker stack部署集群

基于 Docker Swarm 之上来完成应用的部署,面向大规模场景下的多服务部署和管理。

1.docker stack与docker-compose的区别

Docker stack不支持“build”指令,它是需要镜像是预先已经构建好的, 所以docker-compose更适合于开发场景;
Docker Compose是一个Python项目,使用Docker API规范来操作容器。
Docker Stack功能包含在Docker引擎中,是swarm mode的一部分。
Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。
  • 1
  • 2
  • 3
  • 4
  • 5

manager主机server2操作:

2.编写脚本yml文件

vim docker-compose.yml
  • 1
version: "3.8"
services:
  web:
    image: myapp:v1
    ports:
      - "80:80" #端口映射,主机80映射容器80
    networks:
      - webnet #网络接口为webnet
    deploy:
      replicas: 6 #拉起容器的数量
      update_config:
        parallelism: 2 # 每次更新的数量
        delay: 5s  #更新时间间隔
      restart_policy:
        condition: on-failure

  visualizer:
    image: visualizer:latest
    ports:
      - "8080:8080" #监控端口为主机映射8080到容器的8080
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  webnet:
  • 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

请添加图片描述

请添加图片描述

3.执行脚本

 docker stack deploy -c docker-compose.yml mycluster

  • 1
  • 2

请添加图片描述
查看stack进程:六个节点已经成功拉起!

docker stack ps mycluster
  • 1

请添加图片描述

请添加图片描述

当改变脚本中节点数量
60个!重新执行脚本
可以看到监控直接拉起了60个进程!

replicas: 60  

docker stack deploy -c docker-compose.yml mycluster
  • 1
  • 2
  • 3

请添加图片描述

请添加图片描述

请添加图片描述

4.脚本实现更新

当我们再次修改脚本将镜像改为v2时候,就会实现滚动更新
请添加图片描述

执行脚本


docker stack deploy -c docker-compose.yml mycluster

  • 1
  • 2
  • 3

请添加图片描述

查看监控,发现开始逐渐变化为v2
请添加图片描述
swarm集群在创建成功时会自动添加虚拟网卡

docker network ls
  • 1

请添加图片描述

六.Portainer可视化

在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的命令行并不是每一个运维或开发人员都熟记的,而且操作起来会比较麻烦。所以需要添加为swarm集群管理添加图形化管理界面。

链接: portainer 目录 提取码: zzct

部署Portainer

在server1上加载镜像并上传到仓库!

docker load -i portainer-agent.tar
docker load -i portainer.tar
  • 1
  • 2

请添加图片描述

在web端harbor仓库创建新的项目
一定要选 公开!
请添加图片描述

docker tag portainer/portainer:latest reg.westos.org/portainer/portainer:latest
docker tag portainer/agent:latest reg.westos.org/portainer/agent:latest
docker push reg.westos.org/portainer/portainer:latest 
 docker push reg.westos.org/portainer/agent:latest

  • 1
  • 2
  • 3
  • 4
  • 5

请添加图片描述

请添加图片描述

可以看到上传成功!
请添加图片描述

在server2上执行脚本

docker stack deploy -c portainer-agent-stack.yml portainer
docker service ls
  • 1
  • 2

请添加图片描述

请添加图片描述
网页访问图形管理界面,映射端口为9000
172.25.0.2:9000
请添加图片描述

设置两次密码,需要比较复杂的密码不然会报错!
请添加图片描述

进来后,可以看到我们创建的容器
请添加图片描述
在这图形化界面可以直接修改集群数量变为6个,然后点对勾
请添加图片描述

然后展开看到只剩6个其他的都挂了
请添加图片描述
接着我们把自己的仓库名添加进去

请添加图片描述

请添加图片描述

然后添加service,选择刚才创建的仓库名
请添加图片描述

记得输入端口映射
请添加图片描述
点击创建!

请添加图片描述
然后可以看见镜像创建成功,但是状态是pending,等待一会就会变为running
请添加图片描述
因为刚才设置端口映射为8000
所以访问8000端口:
172.25.0.2:8000
请添加图片描述
实验完毕!

关闭并离开集群:

manager主机server2:

docker swarm leave  --force
  • 1

worker主机:

docker swarm leave 
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/74300
推荐阅读
相关标签
  

闽ICP备14008679号