Docker入门之Docker Swarm
一 Docker Swarm简介
Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。
Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。
Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具
Docker Swarm 优点
任何规模都有高性能表现
灵活的容器调度
服务的持续可用性
和 Docker API 及整合支持的兼容性
Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
docker swarm 相关概念
节点分为管理 (manager) 节点和工作 (worker) 节点
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
二 Docker Swarm实践
1 创建 Swarm 集群
初始化集群: docker swarm init
[root@server1 ~]# docker swarm init
根据提示在其他docker节点上执行命令:
[root@server2 ~]# docker swarm join --token SWMTKN-1-5ipfg3qp4zqy5stlm19lq5w5xi8g9rwaqzcq31uc7gu8e5udjy-ekevu055fxp4kf700sjscaem4 172.25.7.1:2377
This node joined a swarm as a worker.
[root@server3 ~]# docker swarm join --token SWMTKN-1-5ipfg3qp4zqy5stlm19lq5w5xi8g9rwaqzcq31uc7gu8e5udjy-ekevu055fxp4kf700sjscaem4 172.25.7.1:2377
This node joined a swarm as a worker.
[root@server4 ~]# docker swarm join --token SWMTKN-1-5ipfg3qp4zqy5stlm19lq5w5xi8g9rwaqzcq31uc7gu8e5udjy-ekevu055fxp4kf700sjscaem4 172.25.7.2:2377
This node joined a swarm as a worker.
把server2升为manager,把server1降级
[root@server1 ~]# docker node promote server2
Node server2 promoted to a manager in the swarm.[root@server1 ~]# docker node demote server1
Manager server1 demoted in the swarm.
把配置文件docker.conf传到其他节点
[root@server1 sysctl.d]# scp docker.conf server2:/etc/sysctl.d/
docker.conf 100% 80 114.6KB/s 00:00
[root@server1 sysctl.d]# scp docker.conf server3:/etc/sysctl.d/
docker.conf 100% 80 114.2KB/s 00:00
[root@server1 sysctl.d]# scp docker.conf server4:/etc/sysctl.d/
The authenticity of host 'server4 (172.25.7.4)' can't be established.
ECDSA key fingerprint is SHA256:W+53+laKT65G9xA9YPq/6F3WxJ9khpZTk5RKUjU9f04.
ECDSA key fingerprint is MD5:51:7b:a6:bf:ca:d0:6b:b8:76:69:5f:0d:90:5d:e0:92.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server4,172.25.7.4' (ECDSA) to the list of known hosts.
root@server4's password:
docker.conf 100% 80 129.9KB/s 00:00
把证书传到其他节点
[root@server1 docker]# scp -r certs.d/ server2:/etc/docker/
ca.crt 100% 2106 1.7MB/s 00:00
[root@server1 docker]# scp -r certs.d/ server3:/etc/docker/
ca.crt 100% 2106 3.5MB/s 00:00
[root@server1 docker]# scp -r certs.d/ server4:/etc/docker/
root@server4's password:
ca.crt 100% 2106 3.9MB/s 00:00
把daemon.json传到其他节点
[root@server2 docker]# scp daemon.json server3:/etc/docker/
The authenticity of host 'server3 (172.25.7.3)' can't be established.
ECDSA key fingerprint is SHA256:W+53+laKT65G9xA9YPq/6F3WxJ9khpZTk5RKUjU9f04.
ECDSA key fingerprint is MD5:51:7b:a6:bf:ca:d0:6b:b8:76:69:5f:0d:90:5d:e0:92.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server3,172.25.7.3' (ECDSA) to the list of known hosts.
root@server3's password:
daemon.json 100% 53 69.6KB/s 00:00
[root@server2 docker]# scp daemon.json server4:/etc/docker/
The authenticity of host 'server4 (172.25.7.4)' can't be established.
ECDSA key fingerprint is SHA256:W+53+laKT65G9xA9YPq/6F3WxJ9khpZTk5RKUjU9f04.
ECDSA key fingerprint is MD5:51:7b:a6:bf:ca:d0:6b:b8:76:69:5f:0d:90:5d:e0:92.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server4,172.25.7.4' (ECDSA) to the list of known hosts.
root@server4's password:
daemon.json 100% 53 60.8KB/s 00:00
在节点上重启docker服务
[root@server3 ~]# systemctl reload docker.service
[root@server3 ~]# docker info
Client:Debug Mode: falseServer:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 19.03.15Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: activeNodeID: 366yvf2bx3ljl262en2mtuj8tIs Manager: falseNode Address: 172.25.7.3Manager Addresses:172.25.7.2:2377Runtimes: runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8erunc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdecinit version: fec3683Security Options:seccompProfile: defaultKernel Version: 3.10.0-957.el7.x86_64Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)OSType: linuxArchitecture: x86_64CPUs: 2Total Memory: 1.795GiBName: server3ID: ASV6:HVBW:BU37:YREC:UQLN:GWD2:MG33:773D:HKEH:TCUF:NC6C:RP3QDocker Root Dir: /var/lib/dockerDebug Mode: falseRegistry: https://index.docker.io/v1/Labels:provider=genericExperimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors:https://reg.westos.org/Live Restore Enabled: false[root@server4 ~]# systemctl reload docker.service
[root@server4 ~]# docker info
Client:Debug Mode: falseServer:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 19.03.15Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: activeNodeID: xqy5moauh3gi8fascts2jv611Is Manager: falseNode Address: 172.25.7.4Manager Addresses:172.25.7.2:2377Runtimes: runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8erunc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdecinit version: fec3683Security Options:seccompProfile: defaultKernel Version: 3.10.0-957.el7.x86_64Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)OSType: linuxArchitecture: x86_64CPUs: 2Total Memory: 814MiBName: server4ID: XBGD:W7PE:4V6W:J6BA:54S4:BOKG:J2JZ:7NGC:VNUP:KKXZ:RINM:MHSGDocker Root Dir: /var/lib/dockerDebug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors:https://reg.westos.org/Live Restore Enabled: false
查看swarm集群节点:
[root@server2 docker]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zadbhah8zz4eov6wi5c8h01xs * server2 Ready Active Leader 19.03.15
366yvf2bx3ljl262en2mtuj8t server3 Ready Active 19.03.15
xqy5moauh3gi8fascts2jv611 server4 Ready Active 19.03.15
弹性伸缩:
[root@server2 docker]# docker service scale webservice=6
webservice scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
启动server1上的镜像仓库
[root@server1 harbor]# docker-compose start
Starting log ... done
Starting registry ... done
Starting registryctl ... done
Starting postgresql ... done
Starting portal ... done
Starting redis ... done
Starting core ... done
Starting jobservice ... done
Starting proxy ... done
测试当初步部署完成后会自动实行负载均衡
在server2上
部署swarm监控:(各节点提前导入dockersamples/visualizer镜像)
docker service create --name=viz --publish=8080:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
创建集群服务:
[root@server2 ~]# docker service create --name webservice --publish 80:80 --replicas 60 myapp:v1
pp2imsewghn0jqtwhmjcdcw5c
overall progress: 60 out of 60 tasks
verify: Service converged
滚动更新
[root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 5 --update-delay 10s webservice
webservice
overall progress: 10 out of 60 tasks
service update paused: update paused due to failure or early termination of task ntk4gzk4b4edidwls0n3fu4q3
[root@server2 ~]#
删除创建的服务
[root@server2 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zn2xhwl5adfr viz replicated 1/1 dockersamples/visualizer:latest *:8080->8080/tcp
pp2imsewghn0 webservice replicated 60/60 myapp:v2 *:80->80/tcp
[root@server2 ~]# docker service rm viz
viz
[root@server2 ~]# docker service rm webservice
webservice
编写docker-compose.yml文件
[root@server2 ~]# cat docker-compose.yml
version: "3.8"
services:web:image: myapp:v2ports:- "80:80"networks:- webnetdeploy:replicas: 60update_config:parallelism: 20delay: 5srestart_policy:condition: on-failurevisualizer:image: visualizer:latestports:- "8080:8080"stop_grace_period: 1m30svolumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints:- "node.role==manager"networks:webnet:
执行docker-compose.yml文件
[root@server2 ~]# docker stack deploy -c docker-compose.yml mycluster
Creating network mycluster_default
Creating network mycluster_webnet
Creating service mycluster_visualizer
Creating service mycluster_web
设置图形化界面
在server1上
导入镜像
[root@server1 ~]# cd portainer/
[root@server1 portainer]# ls
portainer-agent-stack.yml portainer-agent.tar portainer.tar
[root@server1 portainer]# docker load -i portainer.tar
dd4969f97241: Loading layer 278kB/278kB
e7260fd2a5f2: Loading layer 73.85MB/73.85MB
Loaded image: portainer/portainer:latest
[root@server1 portainer]# docker load -i portainer-agent.tar
1f0ac9aec537: Loading layer 2.048kB/2.048kB
0cf0d1d03535: Loading layer 12.15MB/12.15MB
Loaded image: portainer/agent:latest
上传镜像到私人仓库
[root@server1 portainer]# docker tag portainer/agent:latest reg.westos.org/portainer/agent:latest
[root@server1 portainer]# docker tag portainer/portainer:latest reg.westos.org/portainer/portainer:latest
[root@server1 portainer]# docker push reg.westos.org/portainer/portainer:latest
The push refers to repository [reg.westos.org/portainer/portainer]
e7260fd2a5f2: Pushed
dd4969f97241: Pushed
latest: digest: sha256:5702df0ee639d9e003eee626d905e7d4d7ee1a2c7d40a7ec961e3996924f0285 size: 739
[root@server1 portainer]# docker push reg.westos.org/portainer/agent:latest
The push refers to repository [reg.westos.org/portainer/agent]
0cf0d1d03535: Pushed
1f0ac9aec537: Pushed
dd4969f97241: Mounted from portainer/portainer
latest: digest: sha256:d5e9b7b6e0ed94f868c64127fe8d4a2c3dc1c2fa771c6695f1f9c8924c646bac size: 945
在server2上执行文件 portainer-agent-stack.yml
[root@server2 ~]# docker stack deploy -c portainer-agent-stack.yml portainer
Creating network portainer_agent_network
Creating service portainer_agent
Creating service portainer_portainer
查看服务
[root@server2 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
u5grhy9dwhsw mycluster_visualizer replicated 0/1 visualizer:latest *:8080->8080/tcp
3ogf4lexuhev mycluster_web replicated 60/60 myapp:v2 *:80->80/tcp
orjpaqtp6rx7 portainer_agent global 3/3 portainer/agent:latest
9dyxf9hw31mz portainer_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
在web端登陆图形化界面
Docker入门之Docker Swarm相关推荐
- Docker入门-搭建docker私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来使用. 注册登录 可 ...
- [转]docker入门(利用docker部署web应用)
前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1. ...
- 【Docker 入门】Docker简介与安装
Docker Desktop for Windows 目录: Docker Desktop for Windows 1. Docker简介: 2. Docker应用场景: 3. Docker对比虚拟机 ...
- 【docker入门】docker入门
docker简介: 什么是容器? 一种虚拟化的方案,虚拟化操作系统 只能运行相同或相似内核的操作系统 依赖于linux内核特性:Namespace和Cgroups 什么是docker? 将开发的应用程 ...
- docker入门(利用docker部署web应用)
更新:随手写的一篇博客能收获这么多赞真是挺开心的,不过现在博主很忙,博主本人主要也是从事Java方向对docker暂时没有更深的理解了,写这个目的也是为了自己复习,恕不能对出现问题的同学进行答疑了,当 ...
- 3.8 Docker最新入门教程-Docker入门-使用 Docker Compose
3.8 使用 Docker Compose Docker Compose是一种旨在帮助定义和共享多容器应用程序的工具.使用 Compose,我们可以创建一个 YAML 文件来定义服务,并使用一个命令, ...
- Docker入门之Docker Hub学习
文章目录 1. DockerHub 仓库使用 1) 登录到Docker Hub 2) 将本地镜像推送到Docker Hub 1. DockerHub 仓库使用 Docker Hub是Docker ...
- docker入门之Docker Engine
文档:Docker Engine overview | Docker Documentation 1.简介 Docker Engine 是一种开源容器化技术,用于构建和容器化您的应用程序. Docke ...
- Docker入门 - 005 Docker 容器连接
Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...
最新文章
- 对码农的忠告---内心不强大者绕道勿看-来自某CTO的演讲
- OpenCV图像操作的实例(附完整代码)
- 纯CSS实现漂亮圆角阴影边框
- ASP.NET Core 中的规约模式(Specification Pattern )——增强泛型仓储模式
- android广播唤醒app,Android APP唤醒打开其他APP
- es解决只能查询10000条数据方案
- 远程连接 速度慢 显示 正在连接到很久
- EXT.NET高效开发(二)——封装函数
- 4.4使用@Enable*注释去切换配置
- qq四国军旗2.1 beat03 builde017记牌器开发思路(二)
- 编辑PDF用什么软件,如何替换PDF页面
- 阿里巴巴未来十年使命、愿景和价值观
- markdown编辑器和富文本编辑器区别
- 软考高级 真题 2015年上半年 信息系统项目管理师 综合知识
- QT下使用QAxObject打开word文档,文档路径含有空格open出错的解决方法
- 运维工程师与php,php新手入门的基础内容①
- 依赖倒置、控制反转、依赖注入
- MVP实现购物车(二级列表),删除结算功能,拦截器+封装okHttp
- python 选择排序 快速排序
- CSS样式内联选择器选择器优先级伪类顺序