仅用 -m 限制物理内存不够,必须同步配置 --memory-swap,否则 docker 默认启用等量 swap(如 -m 512m → --memory-swap=1g),导致实际可用内存达1gb且oom行为不可控;禁用swap需显式设为 -m 512m --memory-swap=512m。

Docker 命令的帮助信息本身足够清晰,但对复杂参数(比如 --health-cmd、--memory-swap、--network=container: 这类需要上下文理解的选项)来说,仅靠 docker COMMAND --help 往往不够——它只列用法和简短说明,不解释行为边界、依赖条件或实际影响。这时结合系统级 man 手册,才能真正看清“这个参数在内核/运行时层面到底做了什么”。
直接查 man docker-run 并不可行
Docker 官方不提供传统 man 页面(如 man docker-run 会失败)。它的文档以内置帮助 + 官网手册为主,但 Linux 系统自带的 man 仍能补位:关键在于查底层依赖和相关内核机制。
查 man 补充 Docker 参数的真实约束
Docker 多数高级参数最终调用 Linux 内核能力,man 能告诉你这些能力是否可用、如何配置、有哪些限制。
-
资源限制类参数(
--memory,--cpus,--pids-limit)
对应 cgroups v1/v2 控制组机制。
✅ 推荐查:man 7 cgroups man 5 cgroups2 # 如果系统启用 cgroups v2 man 7 capabilities
例如
--memory=512m实际写入/sys/fs/cgroup/memory/docker/<id>/memory.limit_in_bytes</id>,而man cgroups会说明该文件的单位、生效时机、OOM behavior 等细节——比docker run --help里那句“Limit memory usage”实在得多。 -
网络与命名空间类(
--network=host,--pid=container:,--userns=)
本质是 Linux namespace 隔离。
✅ 推荐查:man 7 namespaces man 7 network_namespaces man 7 pid_namespaces man 7 user_namespaces
比如
--network=container:foo实际是让新容器复用 foo 的网络命名空间,man network_namespaces会明确告诉你:共享 netns 意味着共用 IP、端口、路由表、iptables 规则——这直接影响端口冲突判断和防火墙策略。 -
安全与权限类(
--cap-add,--security-opt,--read-only)
依赖 Linux capabilities 和 mount 选项。
✅ 推荐查:man 7 capabilities man 8 mount
--cap-add=NET_ADMIN不是简单“加个权限”,而是把CAP_NET_ADMINcapability 加入进程的 effective set;man capabilities会列出它具体能做什么(如配置路由、修改 iptables),避免误以为它能突破 root 权限。
用 docker help 快速定位 + man 深挖原理
不要从头读 man,而是按需跳查:
- 先运行
docker run --help | grep -A5 memory找到相关参数 - 发现
--memory和--memory-swap并列 → 意识到 swap 行为可能受内核配置影响 - 立刻查:
man 5 proc搜索swappiness,或man 7 cgroups搜索swap - 得知:
--memory-swap=0表示禁用 swap,但前提是内核编译时启用了CONFIG_MEMCG_SWAP——否则该参数会被忽略(man cgroups明确标注)
官方文档 + man + 实验验证三步闭环
光看文档和手册还不够,必须验证:
- 查完
man 7 namespaces,运行:docker run --rm --pid=host alpine ps aux | head -5
对比
docker run --rm alpine ps aux,亲眼看到 PID 空间是否共享 - 查完
man 7 capabilities,运行:docker run --rm --cap-drop=ALL --cap-add=CHOWN alpine chown 1001:1001 /tmp/test && echo ok || echo fail
确认 capability 是否真起作用
这种“命令提示 → 手册解构 → 实验验证”的路径,才是吃透 Docker 复杂参数的可靠方式。











