docker swarm 学习命令整理

本文介绍 Docker Swarm 的基本操作,包括集群初始化、节点管理、服务创建与更新等。提供详细的命令示例,帮助读者掌握 Swarm 的使用技巧。

Docker swarm

初始化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 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 

swarm 文章

1、http://www.jianshu.com/p/54b1b0a098c3
2、http://www.cnblogs.com/fundebug/p/6823897.html
3、https://blog.fundebug.com/2017/05/08/docker-swarm-suggestion/
4、https://success.docker.com/Architecture/Docker_Reference_Architecture%3A_Designing_Scalable%2C_Portable_Docker_Container_Networks

<think>好的,用户想了解如何使用Docker Swarm实现GitLab的高可用性部署。我需要先整理一下Docker Swarm的基础知识,然后结合GitLab的高可用需求来设计方案。 首先,Docker SwarmDocker原生的集群管理工具,可以管理多个Docker节点,提供服务的部署、扩展和故障恢复功能。高可用性通常需要多节点部署,避免单点故障。所以,GitLab的高可用可能需要多个实例分布在不同的节点上,并且数据要持久化,避免数据丢失。 接下来,用户的问题可能涉及到几个方面:Swarm集群的搭建、GitLab服务的配置、数据持久化、负载均衡以及故障转移。需要参考用户提供的引用内容,特别是引用[2]和[4]提到Swarm的功能,比如集群管理、动态伸缩和服务发现,这些对高可用部署很重要。 数据持久化是关键,GitLab的数据包括仓库、数据库(PostgreSQL)、Redis等,必须使用卷或者分布式存储来确保数据在容器重启或迁移时不丢失。引用[5]中提到的Mac部署GitLab时遇到的问题,可能涉及到存储配置,需要注意。 然后,服务发现和负载均衡方面,Swarm自带负载均衡,通过ingress网络将请求分发到各个节点。可能需要配置多个GitLab实例,并确保它们共享同一个数据库和Redis,或者使用外部数据库服务,避免单点故障。 另外,健康检查和服务更新策略也是高可用的一部分。Swarm可以监控服务状态,自动重启失败的容器,或者将流量切换到健康的节点。引用[3]中的docker swarm命令,比如初始化集群和加入节点,这些都是基础步骤。 还需要考虑网络配置,确保不同服务之间的通信,比如GitLab、PostgreSQL、Redis之间的网络互通。可能需要创建覆盖网络(overlay network)来实现跨主机的容器通信。 最后,持续集成和部署方面,用户提到Hyperf和Gitlab-runner,可能需要在Swarm集群中部署GitLab Runner,以实现自动化CI/CD流程,这也需要高可用配置。 总结步骤应该是:初始化Swarm集群、配置存储卷、部署数据库和Redis(或者使用外部服务)、部署GitLab服务并配置副本数、设置健康检查、配置负载均衡和网络,最后测试故障转移和数据持久化是否有效。 可能还需要注意版本兼容性和资源分配,比如内存和CPU的限制,避免节点过载。同时,备份和恢复策略也是高可用的一部分,需要规划定期备份GitLab数据。</think>### Docker Swarm 部署高可用 GitLab 方案 #### 一、基础架构设计 1. **Swarm 集群搭建** - 至少包含 3 个管理节点(Manager)和多个工作节点(Worker),确保集群容错能力[^2] - 初始化 Swarm 集群: ```bash docker swarm init --advertise-addr <MANAGER_IP> ``` - 其他节点加入集群: ```bash docker swarm join --token <SWARM_TOKEN> <MANAGER_IP>:2377 ``` 2. **存储方案** - 使用 `nfs` 或分布式存储(如 `glusterfs`)实现数据持久化 - 挂载卷示例: ```yaml volumes: gitlab_data: driver: local driver_opts: type: nfs o: addr=<NFS_SERVER_IP>,rw device: ":/path/to/gitlab_data" ``` #### 二、服务部署配置 1. **编写 Docker Compose 文件** ```yaml version: '3.8' services: gitlab: image: gitlab/gitlab-ce:latest deploy: replicas: 3 placement: constraints: [node.role == worker] restart_policy: condition: on-failure volumes: - gitlab_data:/var/opt/gitlab - gitlab_logs:/var/log/gitlab - gitlab_config:/etc/gitlab networks: - gitlab_network environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://gitlab.example.com' volumes: gitlab_data: gitlab_logs: gitlab_config: networks: gitlab_network: driver: overlay ``` 2. **关键参数说明** - `replicas:3` 确保至少 3 个实例运行 - `overlay` 网络实现跨节点容器通信[^4] - 环境变量配置需包含 PostgreSQL 和 Redis 连接信息(建议使用独立数据库集群) #### 三、高可用保障措施 1. **数据库高可用** - 建议使用外部 PostgreSQL 集群(如 Patroni 方案) - Redis 部署哨兵模式或使用云服务 2. **负载均衡配置** ```yaml services: traefik: image: traefik:v2.5 command: - "--providers.docker.swarmMode=true" - "--entrypoints.web.address=:80" ports: - "80:80" deploy: mode: global networks: - gitlab_network ``` 3. **健康检查与自动恢复** ```yaml deploy: healthcheck: test: ["CMD", "curl", "-f", "http://localhost/-/health"] interval: 30s timeout: 10s retries: 3 ``` #### 四、部署与验证 1. 部署服务: ```bash docker stack deploy -c gitlab-stack.yml gitlab ``` 2. 验证状态: ```bash docker service ls docker service ps gitlab_gitlab ``` 3. 模拟故障测试: - 主动关闭一个节点观察服务自动迁移 - 使用 `docker node update --availability drain <NODE_ID>` 测试节点维护场景 --- ### 常见问题解决方案 1. **数据一致性** - 使用分布式锁机制(如 Redis 锁) - 定期执行 `gitlab-ctl reconfigure` 2. **性能优化** - 调整 `unicorn['worker_processes']` 参数 - 配置 SSD 存储提升 IO 性能 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值