docker(11、Docker Swarm4)11、副本数量(replicated 和 global )12、Label 控制 Service 的位置 13、如何配置 Health Check

11、副本数量模式(replicated mode 和 global mode)

Swarm 可以在 Service 创建和运行过程中灵活的通过 --replicas 调整容器副本数量,内部调度器则会根据当前集群的资源使用情况在不同的node 上启停容器,这就是 Service 默认的 replicated mode 。在此模式下,node 上运行的副本数有多有少,一般情况下,资源更丰富的node 运行的副本数更多,反之亦然。

除了 replicated mode ,Service 还提供了一个 global mode ,其作用是强制在每个node上都运行一个且最多一个副本。

global mode 特别适合需要运行daemon 的集群环境。比如要收集所有容器的日志,就可以用 global mode 创建 Service,在所有 node 上都运行 gliderlabs/logspout 容器,及时之后有新的node加入,swarm 也会自动在新的node上启动一个 gliderlabs/logspout 副本

[root@swarm-manager ~]# docker service create --mode global --name bbox busybox sleep 99999
5qamycgjpsivklii7omh4wgq8
overall progress: 2 out of 2 tasks 
l9usnqu08wnq: running   [==================================================>] 
su6as9kbp9od: running   [==================================================>] 
verify: Service converged 
[root@swarm-manager ~]# 
[root@swarm-manager ~]# docker service ps bbox
ID                  NAME                             IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
ygwk31ee5cek        bbox.su6as9kbp9odmbemdasjgvsd1   busybox:latest      swarm-worker2       Running             Running 40 seconds ago                       
kswnk367tpyu        bbox.l9usnqu08wnqrejs6v3a3c9j7   busybox:latest      swarm-worker1       Running             Running 40 seconds ago                       
[root@swarm-manager ~]# 

 例如swarm-manager是Drain 状态 通过docker node update swarm-manager --availability active   GLobal会在swarm-manager创建副本,global模式会在每台机器上创建副本

可以通过 docker service inspect 查看 service 的 mode。

[root@swarm-manager ~]# docker service inspect bbox  --pretty

ID:		5qamycgjpsivklii7omh4wgq8
Name:		bbox
Service Mode:	Global
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		busybox:latest@sha256:836945da1f3afe2cfff376d379852bbb82e0237cb2925d53a13f53d6e8a8c48c
 Args:		sleep 99999 
 Init:		false
Resources:
Endpoint Mode:	vip

[root@swarm-manager ~]# 

Service Mode:    Global

这里是 Global,如果创建 service 时不指定,默认是 Replicated

12、Label 控制 Service 的位置

使用 label能精细控制 Service 的运行位置呢

逻辑分两步:

1、为每个 node 定义 label。
2、设置 service 运行在指定 label 的 node 上。label 可以灵活描述 node 的属性,其形式是 key=value,用户可以任意指定,
例如将 swarm-worker1 作为测试环境,为其添加 label env=test:
swarm-worker1标记为测试环境,swarm-worker2标记为线上环境

swarm-worker1

[root@swarm-manager ~]# docker node update --label-add env=test swarm-worker1
swarm-worker1
[root@swarm-manager ~]# docker node inspect swarm-worker1 --pretty
ID:			l9usnqu08wnqrejs6v3a3c9j7
Labels:
 - env=test
Hostname:              	swarm-worker1
Joined at:             	2020-05-12 06:57:51.232356307 +0000 utc
Status:
 State:			Ready
 Availability:         	Active

<think>好的,用户现在问的是如何进入Docker Swarm的容器。首先,我需要确认用户对Docker Swarm的基本了解程度。Docker SwarmDocker原生的集群管理工具,用户可能已经部署了服务,但需要进入容器进行调试或查看日志。 接下来,用户的问题是关于如何进入容器,这在Swarm模式下单机Docker有所不同。在单机环境中,通常用`docker exec`,但在Swarm中,服务可能运行在多个节点上,容器名称是动态生成的,所以直接使用`docker exec`可能不太方便。 我需要分步骤解释。首先,用户需要确定要进入的容器名称或ID,这可能涉及到列出服务中的任务,然后找到对应的容器。然后,用户需要连接到运行该容器的节点,如果是多节点环境的话,可能需要SSH到那个节点,再执行`docker exec`命令。 另外,用户可能没有意识到Swarm模式下容器分布在不同的节点上,所以需要强调如何定位容器所在的节点。还有,动态容器名的问题,比如使用服务名任务ID组合的命名方式,需要指导用户如何获取正确的容器名称。 可能用户的实际需求是调试或查看日志,所以可以建议使用`docker service logs`来查看日志,而不必进入容器。但如果必须进入容器,步骤需要明确,包括找到容器ID、定位节点、执行命令。 还需要注意权限问题,比如是否有权限访问节点,或者是否需要sudo来执行docker命令。此外,如果是短暂的任务容器,可能需要先确保容器处于运行状态,避免进入已经退出的容器。 最后,提醒用户在生产环境中谨慎使用进入容器的操作,可能会影响服务稳定性,建议尽量使用日志监控工具。</think>以下是关于在Docker Swarm中进入容器的详细指南: --- ### 一、核心原理 **Swarm模式容器与单机Docker容器的关键区别**: 1. 容器名称由Swarm自动生成(格式:`<服务名称>.<任务ID>.<随机后缀>`) 2. 容器可能分布在集群的不同节点上 3. 直接使用`docker exec`需要先定位到具体节点 --- ### 二、标准操作流程 #### 步骤1:查看服务列表 ```bash docker service ls ``` 输出示例: ``` ID NAME MODE REPLICAS IMAGE a1b2c3d web_server replicated 3/3 nginx:latest ``` #### 步骤2:定位具体容器 ```bash # 查看服务任务分布(显示节点信息) docker service ps --no-trunc <SERVICE_NAME> # 示例输出: ID NAME IMAGE NODE DESIRED STATE CURRENT STATE d4e5f6a... web_server.1 nginx:latest node-02 Running Running 2 hours ago g7h8i9j... web_server.2 nginx:latest node-01 Running Running 2 hours ago ``` #### 步骤3:进入容器(需SSH到对应节点) ```bash # 连接到目标节点(示例为node-02) ssh user@node-02-ip # 在目标节点上列出容器 docker ps --filter name=<服务名称> # 进入容器 docker exec -it <CONTAINER_ID> /bin/bash ``` --- ### 三、快捷方法(单命令行操作) ```bash # 自动定位并进入第一个运行中的容器(需要jq工具) docker inspect $(docker service ps -q <SERVICE_NAME> | head -1) \ --format '{{.NodeID}} {{.Status.ContainerStatus.ContainerID}}' \ | xargs -I{} sh -c 'ssh $(docker node inspect --format "{{.Description.Hostname}}" {1}) \ "docker exec -it {2} sh"' ``` --- ### 四、特殊场景处理 #### 场景1:容器崩溃无法连接 ```bash # 强制创建新容器(调试模式) docker service update --force <SERVICE_NAME> # 立即查看新建容器ID watch -n 1 "docker service ps <SERVICE_NAME>" ``` #### 场景2:容器没有交互式shell ```bash # 直接执行命令(无需进入) docker exec <CONTAINER_ID> ls /app # 创建临时shell环境 docker exec -it <CONTAINER_ID> sh -c "exec sh" ``` --- ### 五、Swarm模式最佳实践 | 需求 | 推荐方案 | 优势 | |------|----------|------| | 调试日志 | `docker service logs --tail 50 -f <SERVICE_NAME>` | 实时查看所有副本日志 | | 批量操作 | `docker service update --env-add DEBUG=true <SERVICE_NAME>` | 集群级环境变量更新 | | 持久化存储 | 挂载NFS卷:`--mount type=volume,source=app_data,destination=/data,volume-driver=local,volume-opt=type=nfs,...` | 跨节点数据一致性 | --- ### 六、安全注意事项 1. **生产环境限制**: ```bash # 禁用交互式访问(通过服务约束) docker service create --name api \ --limit-memory 2g \ --constraint 'node.role != manager' \ --restart-condition any \ myapp:prod ``` 2. **审计追踪**: ```bash # 记录所有exec操作 dockerd --authorization-plugin=authz-broker \ --userns-remap=default ``` --- **关键提示**: 1. Swarm模式下优先使用`docker service logs`代替直接进入容器 2. 进入容器时应使用`sh`而不是`bash`(Alpine镜像等精简系统可能没有bash) 3. 修改容器文件系统后,需通过`docker commit`生成新镜像并更新服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值