Docker Swarm 之 Config 与 Secret

摘要

Config 简介

  • 在 Docker Swarm 中,Config 是一种用于管理配置资源的机制,允许你将配置文件与容器分离,便于在不同环境中重用和共享配置。

  • Config 和 Volume 都是 Docker 中用于管理数据的机制,但它们的设计目的和使用场景有显著不同:

特性 Config Volume
用途 只能是文件,用于存储配置文件、只读数据 文件目录均可,存储应用数据、可读写数据
可变性 通常不可变(只读) 可变(读写)
生命周期 随服务部署更新 独立于容器生命周期
存储位置 存储在Docker管理的内存/文件系统 存储在主机文件系统或网络存储
Swarm支持 原生Swarm功能 通用功能
更新机制 更新需要重新部署服务 可动态更新
典型用例 配置文件、环境变量 数据库文件、日志、用户上传内容

Config 命令

命令 中文说明 示例
create 从文件或标准输入创建一个 config docker config create my_config config.txt
inspect 显示一个或多个 config 的详细信息 docker config inspect my_config
ls 列出所有 configs docker config ls
rm 删除一个或多个 config docker config rm my_config

docker config create: 创建一个 config

1
2
3
4
# 从文件中创建
docker config create my_config my_config.json
# 从标准输入创建
cat my_config.json | docker config create my_config -

docker config inspect: 查看 config 的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker config inspect my_config
## 输出,可以看到 Data 字段,用 base64 解码后,就是 config 的原始内容
[
{
"ID": "q4257t5c2wq6uvvkm4g3hssae",
"Version": {
"Index": 3145
},
"CreatedAt": "2025-06-10T06:09:25.712614071Z",
"UpdatedAt": "2025-06-10T06:09:25.712614071Z",
"Spec": {
"Name": "my_config",
"Labels": {},
"Data": "WwogICAgewogICAgICAgICJJRCI6ICJxbGtsc2t2eHRocDYxaTBuYnZ6dnI2d3V3IiwKICAgICAgICAiVmVyc2lvbiI6IHsKICAgICAgICAgICAgIkluZGV4IjogMzE0NAogICAgICAgIH0sCiAgICAgICAgIkNyZWF0ZWRBdCI6ICIyMDI1LTA2LTEwVDA2OjA3OjAzLjQwMzg4OTU2NVoiLAogICAgICAgICJVcGRhdGVkQXQiOiAiMjAyNS0wNi0xMFQwNjowNzowMy40MDM4ODk1NjVaIiwKICAgICAgICAiU3BlYyI6IHsKICAgICAgICAgICAgIk5hbWUiOiAibXlfc2VjcmV0IiwKICAgICAgICAgICAgIkxhYmVscyI6IHt9CiAgICAgICAgfQogICAgfQpdCg=="
}
}
]
# 解码
echo "WwogICAgewogICAgICAgICJJRCI6ICJxbGtsc2t2eHRocDYxaTBuYnZ6dnI2d3V3IiwKICAgICAgICAiVmVyc2lvbiI6IHsKICAgICAgICAgICAgIkluZGV4IjogMzE0NAogICAgICAgIH0sCiAgICAgICAgIkNyZWF0ZWRBdCI6ICIyMDI1LTA2LTEwVDA2OjA3OjAzLjQwMzg4OTU2NVoiLAogICAgICAgICJVcGRhdGVkQXQiOiAiMjAyNS0wNi0xMFQwNjowNzowMy40MDM4ODk1NjVaIiwKICAgICAgICAiU3BlYyI6IHsKICAgICAgICAgICAgIk5hbWUiOiAibXlfc2VjcmV0IiwKICAgICAgICAgICAgIkxhYmVscyI6IHt9CiAgICAgICAgfQogICAgfQpdCg==" | base64 -d


# 更易读
docker config inspect --pretty my_config
docker config inspect --format "{{.ID}} {{.Spec.Name}}" my_config

docker config ls: 列出所有 config

1
2
3
docker config ls
# 只显示 ID
docker config ls -q

docker config rm: 删除一个或多个 config

1
2
3
4
5
docker config rm my_config
# 删除多个
docker config rm my_config1 my_config2
# 删除所有 ,慎重使用
docker config rm $(docker config ls -q)

Stack中使用Config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
configs: #  声明 config 列表
nginx_config: # config 名称
file: ./nginx/nginx.conf # config 文件
my_config: # 使用外部 config,即 docker config create 创建的
external: true

services:
web:
image: nginx:alpine
ports:
- "80:80"
configs: # 服务使用 config
- source: nginx_config # 指定 config 名称
target: /etc/nginx/nginx.conf # 指定容器中配置文件存放位置
- source: my_config # 使用外部 config
target: /app/config.json
mode: 0444 # 指定权限
uid: "1000" # 指定用户
gid: "1000" # 指定用户组

Secret 简介

  • Secrets 是 Docker 专门为敏感数据设计的安全管理机制,用于安全地存储和传输密码、API密钥、TLS证书等敏感信息。

  • 与 Configs 的主要区别

特性 Secrets Configs
用途 敏感数据(密码、密钥等) 普通配置文件
存储 加密存储 明文存储
传输 加密传输 明文传输
访问 挂载为内存文件 常规文件挂载
权限 默认仅 root 可读(0440) 可自定义权限

Secret 命令

命令 中文说明 示例
create 从文件或标准输入创建一个 secret docker secret create my_secret secret.txt
inspect 显示一个或多个 secret 的详细信息 docker secret inspect my_secret
ls 列出所有 secrets docker secret ls
rm 删除一个或多个 secret docker secret rm my_secret

docker secret create: 创建一个 secret

1
2
3
4
# 从文件中创建
docker secret create my_secret my_secret.txt
# 从标准输入创建
echo "my_secret" | docker secret create my_secret -

docker secret inspect: 查看 secret 的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker secret inspect my_secret
## 输出,可以看到 没有 data 字段,所以无法查看原始的内容
[
{
"ID": "qlklskvxthp61i0nbvzvr6wuw",
"Version": {
"Index": 3144
},
"CreatedAt": "2025-06-10T06:07:03.403889565Z",
"UpdatedAt": "2025-06-10T06:07:03.403889565Z",
"Spec": {
"Name": "my_secret",
"Labels": {}
}
}
]
# 输出更易读
docker secret inspect --pretty my_secret
docker secret inspect --format "{{.ID}} {{.Spec.Name}}" my_secret

docker secret ls: 列出所有的 secret

1
2
3
4
docker secret ls
# 列出所有的 secret 的 ID
docker secret ls -q
docker secret ls --filter name=my_secret

docker secret rm: 删除 secret

1
2
3
docker secret rm my_secret
# 删除所有,慎重使用
docker secret rm $(docker secret ls -q)

Stack中使用Secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets: # 关联secret,容器内关联路径为 /run/secrets/<secret_name>
- db_root_password
- my_secret

secrets: # 声明 secret 列表
db_root_password: # secret 名称
file: ./mysql_root_password.txt # secret 文件
my_secret: # 生产环境建议使用预创建的secret
external: true # 引用预先创建的secret
  • 优化: 使用非root用户,并隐藏 secret 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
mysql:
image: mysql:8.0
user: "mysql:mysql" # 关键点1:使用非root用户
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/.db_root_password # 关键点2:隐藏文件
secrets:
- source: db_root_password
target: .db_root_password # 隐藏文件名
uid: "999" # mysql用户ID
gid: "999" # mysql组ID
mode: 0400 # 仅拥有者可读
- source: my_secret
target: .my_secret
uid: "999"
gid: "999"
mode: 0400


secrets:
db_root_password:
file: ./mysql_root_password.txt
my_secret:
external: true