前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker Swarm搭建集群和常用命令操作

Docker Swarm搭建集群和常用命令操作

作者头像
菲宇
发布2022-12-21 19:41:09
6250
发布2022-12-21 19:41:09
举报
文章被收录于专栏:菲宇菲宇

Docker自诞生以来,其容器特性以及镜像特性给DevOps爱好者带来了诸多方便。然而在很长的一段时间内,Docker只能在单host上运行,其跨host的部署、运行与管理能力颇受外界诟病。跨host能力的薄弱,直接导致Docker容器与host的紧耦合,这种情况下,Docker容器的灵活性很难令人满意,容器的迁移、分组等都成为很难实现的功能点。

Swarm是Docker公司在2014年12月初新发布的容器管理工具。和Swarm一起发布的Docker管理工具还有Machine以及Compose。

Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,并且还处于一个Alpha版本,目前在github上发布的版本仅有v0.1.0-rc1。然而Swarm的发展十分快速,功能和特性的变更迭代还非常频繁。因此,可以说Swarm还不推荐被用于生产环境中,但可以肯定的是Swarm是一项很有前途的技术。

端口监听

Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。这里有两种方法,一种是通过修改docker配置文件方式,另一种是通过一个轻量级的代理容器进行监听。

docker-ee安装(参考官方文档)

先卸载docker相关的旧版本

yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-selinux \

docker-engine-selinux \

docker-engine \

docker-ce

修改镜像地址

rm /etc/yum.repos.d/docker*.repo

export DOCKERURL="<DOCKER-EE-URL>"

sh -c 'echo "$DOCKERURL/centos" > /etc/yum/vars/dockerurl'

yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

yum-config-manager \

--add-repo \

"$DOCKERURL/centos/docker-ee.repo"

yum-config-manager --enable docker-ee-stable-18.03

yum -y install docker-ee

systemctl enable docker && systemctl start docker

修改配置文件修改监听端口(推荐)

由于我是使用Centos7安装的docker,所以下面的配置是适用于Centos7的。

打开配置文件/etc/sysconfig/docker:

vi /etc/sysconfig/docker

修改配置项OPTIONS中的值,若OPTIONS中没有值,则直接添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock,否则在已有参数后面添加,比如下面这样:

OPTIONS='--selinux-enabled --log-driver=journald

--signature-verification=false

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'

修改完之后保存文件,然后重启docker服务

systemctl daemon-reload

systemctl restart docker

注意:需要对所有要加入集群的docker节点都进行上面的修改配置文件的操作。

使用docker-proxy代理服务

默认情况下,Docker引擎只侦听套接字。 我们可以重新配置引擎以使用TLS,或者您可以使用代理容器。 这是一个非常轻量级的容器,它只是将请求从TCP转发到Docker监听的Unix套接字。

先通过docker pull命令下载镜像

docker pull docker.io/shipyard/docker-proxy

然后启动容器:

docker run -ti -d -p 2375:2375 \

--restart=always \

--hostname=$HOSTNAME \

--name shipyard-proxy \

-v /var/run/docker.sock:/var/run/docker.sock \

-e PORT=2375 \

docker.io/shipyard/docker-proxy:latest

注意:该代理服务容器也需要在每个要加入集群的docker节点上启动,同时要保证该容器的正常运行,如果容器停止则无法发现节点。

搭建Docker集群

拉取Swarm镜像

docker pull docker.io/swarm

生成唯一token

在任意的docker节点创建一个全世界唯一的token(集群ID),记住这个token后面需要用到。(这里用的发现服务是dockhub内置的,当然还有其他的比如etcd、consul等。)

docker run --rm swarm create

rw4d3ac32aa6a86b341e3asd69e2cd0b

执行上面的命令之后,会生成一个token。

启动Swarn Manager

docker run -ti -d -p 2376:2375 \

--restart=always \

--name shipyard-swarm-manager \

docker.io/swarm:latest \

manage --host tcp://0.0.0.0:2375 \

token://rw4d3ac32aa6a86b341e3asd69e2cd0b

Swarn Manager 只需要启动一个,所以可选取一个docker节点进行启动,我这里是在我这块的主机10.0.11.150上启动的。

启动Swarm Agent

启动Swarm agent,将当前docker节点加入到集群中,Swarm Agent需要在每一个要加入到集群中的docker节点上启动。

docker run -ti -d \

--restart=always \

--name shipyard-swarm-agent \

docker.io/swarm:latest \

join --addr [docker node ip]:2375 \

token://rw4d3ac32aa6a86b341e3asd69e2cd0b

注:上面这条命令中的[docker node ip]项需要更换为要加入集群的docker节点的真实IP。

查看docker节点情况

可以使用命令查看docker节点情况(任意docker节点上都可以执行):

docker run --rm swarm list token://rw4d3ac32aa6a86b341e3asd69e2cd0b

查看docker集群详情

可以使用命令查看docker集群的详情(可在任意docker节点上执行,IP地址是装了Swarm Master主机的IP):

docker -H 10.0.11.150:2376 info

docker node list 查看节点情况

搭建应用:

docker service create --name portainer1 --mode global --publish mode=host,target=9000,published=9001 docker.io/portainer/portainer:latest

docker service create --name nginx-test --replicas 3 --publish mode=host,target=80,published=81 docker.io/nginx:latest

查看应用列表docker service list

docker swarm常用命令

代码语言:javascript
复制
初始化swarm manager并制定网卡地址
docker swarm init --advertise-addr 192.168.10.117
强制删除集群,如果是manager,需要加–force
docker swarm leave --force
docker node rm docker-118
查看swarm worker的连接令牌
docker swarm join-token worker
查看swarm manager的连接令牌
docker swarm join-token manager
使旧令牌无效并生成新令牌
docker swarm join-token --rotate
加入docker swarm集群(使用docker swarm join-token worker查询的)
docker swarm join --token SWMTKN-1-5d2ipwo8jqdsiesv6ixze20w2toclys76gyu4zdoiaf038voxj-8sbxe79rx5qt14ol14gxxa3wf 192.168.10.117:2377
查看集群中的节点
docker node ls
查看集群中节点信息
docker node inspect docker-117 --pretty
调度程序可以将任务分配给节点
docker node update --availability active docker-118
调度程序不向节点分配新任务,但是现有任务仍然保持运行
docker node update --availability pause docker-118
调度程序不会将新任务分配给节点。调度程序关闭任何现有任务并在可用节点上安排它们
docker node update --availability drain docker-118
添加节点标签
docker node update --label-add label1 --label-add bar=label2 docker-117
删除节点标签
docker node update --label-rm label1 docker-117
将节点升级为manager
docker node promote docker-118
将节点降级为worker
docker node demote docker-118
查看服务列表
docker service ls
查看服务的具体信息
docker service ps redis
创建一个不定义name,不定义replicas的服务
docker service create nginx
创建一个指定name的服务
docker service create --name my_web nginx
创建一个指定name、run cmd的服务
docker service create --name helloworld alping ping docker.com
创建一个指定name、version、run cmd的服务
docker service create --name helloworld alping:3.6 ping docker.com
创建一个指定name、port、replicas的服务
docker service create --name my_web --replicas 3 -p 80:80 nginx
为指定的服务更新一个端口
docker service update --publish-add 80:80 my_web
为指定的服务删除一个端口
docker service update --publish-rm 80:80 my_web
将redis:3.0.6更新至redis:3.0.7
docker service update --image redis:3.0.7 redis
配置运行环境,指定工作目录及环境变量
docker service create --name helloworld --env MYVAR=myvalue --workdir /tmp --user my_user alping ping docker.com
创建一个helloworld的服务
docker service create --name helloworld alpine ping docker.com
更新helloworld服务的运行命令
docker service update --args “ping www.baidu.com” helloworld
删除一个服务
docker service rm my_web
在每个群组节点上运行web服务
docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest
创建一个overlay网络
docker network create --driver overlay my_network
docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 my-network
创建服务并将网络添加至该服务
docker service create --name test --replicas 3 --network my-network redis
删除群组网络
docker service update --network-rm my-network test
更新群组网络
docker service update --network-add my_network test
创建群组并配置cpu和内存
docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx
更改所分配的cpu和内存
docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx
指定每次更新的容器数量
--update-parallelism
指定容器更新的间隔
--update-delay
定义容器启动后监控失败的持续时间
--update-monitor 
定义容器失败的百分比
--update-max-failure-ratio
定义容器启动失败之后所执行的动作
--update-failure-action
创建一个服务并运行3个副本,同步延迟10秒,10%任务失败则暂停
docker service create --name mysql_5_6_36 --replicas 3 --update-delay 10s --update-parallelism 1 --update-monitor 30s --update-failure-action pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
回滚至之前版本
docker service update --rollback mysql
自动回滚
如果服务部署失败,则每次回滚2个任务,监控20秒,回滚可接受失败率20%
docker service create --name redis --replicas 6 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest
创建服务并将目录挂在至container中
docker service create --name mysql --publish 3306:3306 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
 Bind带来的风险
1、绑定的主机路径必须存在于每个集群节点上,否则会有问题
2、调度程序可能会在任何时候重新安排运行服务容器,如果目标节点主机变得不健康或无法访问
3、主机绑定数据不可移植,当你绑定安装时,不能保证你的应用程序开发方式与生产中的运行方式相同
添加swarm配置
echo "this is a mysql config" | docker config create mysql -
查看配置
docker config ls
查看配置详细信息
docker config inspect mysql
删除配置
docker config rm mysql
添加配置
docker service update --config-add mysql mysql
删除配置
docker service update --config-rm mysql mysql
添加配置
docker config create homepage index.html
启动容器的同时添加配置
docker service create --name nginx --publish 80:80 --replicas 3 --config src=homepage,target=/usr/share/nginx/html/index.html nginx 

链接文章:

Docker Swarm架构、特性与基本实践

创建docker swarm应用

生产环境中使用Docker Swarm的一些建议

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker Swarm架构、特性与基本实践
  • 创建docker swarm应用
  • 生产环境中使用Docker Swarm的一些建议
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档