Docker资源名称命名规则

2026-05-11 15:12:00
丁国栋
原创 28
摘要:本文记录和整理关于Docker资源名称命名规则,方便在使用docker的场景中使用。

由于没有找到Docker官方文档、权威参考,本文内容取自AI、网络和使用经验,如果有不正确之处请指出。

什么是有效 Docker 资源名?

在 Docker 里常说的“有效资源名”,指的是容器 / 服务 / 网络 / volume / secret / config / stack 等资源的名称必须满足的格式规则。不同资源略有差异,但核心规则是一致的。

1)通用核心规则(最常见、最安全)

一个“安全且通用”的 Docker 资源名应满足:

  • 字符集
    • 小写字母 a-z
    • 数字 0-9
    • 分隔符:连字符 -、下划线 _
  • 不能为空
  • 不能以 -_ 开头或结尾
  • 不能包含: 空格、点 .、冒号 :@、中文、特殊符号等

✅ 推荐(最稳):

my-service
web
redis-cache
app_v2

❌ 不推荐 / 可能报错:

-my-service
my_service_
my.service
app:1

2)Docker 实际使用的正则(概念性)

很多 Docker 资源名的校验大致等价于(不完全逐字引用,但意思对了):

  • 允许:[a-zA-Z0-9_-]+
  • 常额外限制:不能以 -_ 开头/结尾
  • 对某些资源还会限制长度(尤其是容器/网络涉及 DNS/iptables 时)

实际上:全小写 + - 分隔 是社区事实标准,几乎不会踩坑。


3)不同资源的细微差别(你知道就行)

  • 容器名 / 服务名 / 网络名: 会更“严格”,因为它们可能参与 DNS、iptables、网桥等。
  • volume 名: 某些后端(尤其 Windows / 某些驱动)对字符更敏感。
  • stack 名: 会作为前缀生成 <stack>_<service> 等,所以更要“干净”。

4)一条实用建议

如果你不确定某个名字是否“有效/稳妥”:

只用小写字母 + 数字 + -,不以 - 开头结尾,别加点/冒号/空格。

Docker Swarm 的 stack 名称在命名上有一些硬性限制推荐习惯,下面按“必须 / 建议”给出总结。


1) 硬性规则(不满足会报错或行为异常)

Stack 名称最终会作为前缀参与生成资源名:

<stack>_<service>
<stack>_<network>
<stack>_<secret>
<stack>_<config>

因此 stack 名称必须是一个有效的 Docker 资源名称,通常要求:

  • 只能包含
    • 小写字母 a–z
    • 数字 0–9
    • 分隔符 -(连字符)、_(下划线)
  • 不能-_ 开头/结尾
  • 不建议/不能用:
    • .
    • 冒号 :
    • 空格
    • 特殊字符(@#$%^&* 等)

示例合法名:

prod
staging
demo-web
app_v2

2) 推荐命名习惯(工程上更重要)

  • 全小写 + - 分隔(社区最常用): webbackendmonitoringlogging-loki
  • 不要用 _ 开头/结尾,也尽量避免全是 _ 拼接(可读性差)
  • 不要带“stack”字样本身: 推荐 web,不推荐 web-stack
  • 短且有意义:会频繁出现在 docker service ls / ps、日志、网络名里

3) 常见踩坑

  • 改 stack 名 ≈ 重新创建所有资源 因为资源名是 <stack>_<service>,改名后旧 service/network 不会自动复用。
  • 不要依赖 stack 名做“环境区分”过度复杂化 比如 prod-eu-web-01 这种偏长,往往不如用 label/environment=prod 清晰。
  • 某些老版本/某些场景对 _ 处理不一致,- 更安全

一句话结论

Stack 名应是小写字母/数字,用 - 分隔,不以 -/_ 开头结尾的短名字;它会直接成为服务/网络等资源的前缀,所以命名要稳定、可读、可预测。

在 Docker Swarm 的 stack 文件(deploy 里,services 下的 key(服务名) 一般遵循下面这些约定/规则:

1) 语法层面:必须是“有效 Docker 资源名”

  • 只能包含
    • 小写字母 a–z
    • 数字 0–9
    • 分隔符:-(连字符)、_(下划线)
  • 不能以 -_ 开头/结尾(很多场景会报非法名)。
  • 通常是 全小写 + - 分隔单词,例如: webapiredisdbnginx-proxy

这其实和 Docker 的 container name / service name / network name 的命名限制是一致的。

2) Swarm/Stack 实际产生的资源名格式

当你用 docker stack deploy -c xxx.yml mystack 部署时,最终资源名会变成:

<stack>_<service>

例如 mystack_webmystack_redis

因此:服务名本身不要带 stack 前缀,除非你有意为之。

3) 推荐命名习惯(工程上更稳)

  • kebab-case(短横线):auth-servicepayment-api
  • 避免特殊符号:@ : . , 等都不建议
  • 避免过长(尤其在日志/label/网络名里会更明显)
  • 若同一 stack 里有多个同类服务,加角色后缀更清晰: dbdb-replicacachecache-session

4) 容易踩坑的点

  • 服务名会作为 内网 DNS 名<service><stack>_<service>),所以命名要稳定,别随意改,否则依赖方需要同步改。
  • 某些旧版本/特定场景对 _ 支持不一致,社区惯例更偏向 -
发表评论
博客分类