容器内可调的内核参数
在容器命名空间内调整内核参数:只允许白名单中的命名空间化参数,未列入的会被拒绝,除非容器以特权方式运行。能通过宿主统一配置的参数,就不必写进容器命令。
基本信息
| 语法 | --sysctl 键=值 |
|---|---|
| 限制 | 非白名单参数会被拒绝 |
| 常见可用项 | 网络命名空间内的转发类参数 |
| 绕过方式 | 特权模式,需要重新评估风险 |
| 适用平台 | Linux 上的 Docker Engine |
典型使用场景
- 容器内需要开启转发类网络参数
- 应用启动时依赖特定内核参数,确认可用性
- 排查参数被拒绝的原因
- 区分哪些参数适合宿主统一配置
- 验证参数是否在容器内生效
设置与验证
设置与验证
docker run --rm --sysctl net.ipv4.ip_forward=1 alpine \
cat /proc/sys/net/ipv4/ip_forward # 验证容器内取值
docker run --rm --sysctl kernel.msgmax=65536 alpine echo test # 观察是否被拒绝参数类别与可设置性
| 参数类别 | 是否可设 | 说明 |
|---|---|---|
| 网络命名空间参数 | 通常可设 | 容器独立网络栈内 |
| 内核级参数 | 一般被拒 | 需要特权模式 |
| 宿主共享参数 | 被拒 | 避免容器影响宿主 |
| 未列入白名单 | 被拒 | 属预期行为 |
需要大范围非白名单参数时先评估必要性;能通过宿主统一配置的就不放进容器命令。
被拒绝时看到不允许的提示属预期行为,用特权模式放开要重新评估风险面。
参数名或取值写错可能在运行时才暴露,变更先在测试容器验证再进编排文件。
容器内的取值与宿主上的取值是两个层面,核对时要在容器内确认。
把需要的内核参数在宿主统一配置、容器保持默认,通常更容易维护。
参数被拒绝时错误信息会明确指出,按提示区分是参数名问题还是白名单限制。
涉及网络转发的参数常与容器使用的网络模式共同决定行为,调整前先确认容器采用的是哪种网络模式。