--sysctl 启动注入是安全精准的容器协议栈调优方式,仅支持 namespaced 参数如 net.core.somaxconn、net.ipv4.tcp_tw_reuse 等;非 namespaced 参数如 vm.max_map_count 需宿主机配置;host 网络模式下 sysctls 无效;需同步调整 ulimit 和 conntrack 容量。

只设可 namespaced 的参数
Docker 仅允许修改已隔离(namespaced)的内核参数,网络类常见可用项包括:
-
net.core.somaxconn:监听队列长度,建议设为
65535防止高并发建连丢 SYN -
net.ipv4.tcp_tw_reuse:设为
1允许 TIME-WAIT 端口快速复用,适合 API 网关类短连接服务 -
net.ipv4.ip_local_port_range:扩大临时端口范围,如
"1024 65535" -
net.ipv4.conf.lo.rp_filter:设为
0关闭回环接口反向路径过滤,解决同机容器间 RTT 暴增问题 - net.core.netdev_max_backlog:增大网卡接收队列,缓解突发流量丢包
像 vm.max_map_count 或 fs.file-max 这类未 namespace 化的参数,不能通过 --sysctl 设置,必须在宿主机上配置。
命令行与 Compose 写法要规范
docker run 中重复使用 --sysctl 即可:
docker run --sysctl net.core.somaxconn=65535 \
--sysctl net.ipv4.tcp_tw_reuse=1 \
--sysctl net.ipv4.conf.lo.rp_filter=0 \
-d nginx
docker-compose.yml 中必须用字符串格式写值,且不支持缩写:
services:
app:
image: nginx
sysctls:
net.core.somaxconn: "65535"
net.ipv4.tcp_tw_reuse: "1"
net.ipv4.conf.lo.rp_filter: "0"
注意:network_mode: host 下 sysctls 会被忽略——此时容器共享宿主机网络命名空间,参数应直接调优宿主机。
配套调整文件描述符与 conntrack 容量
TCP 连接数受限于两个硬性资源:进程能打开的文件数(fd),以及内核 conntrack 表大小。二者需同步放大:
- 用
--ulimit nofile=65536:65536提升容器内单进程 fd 上限 - 若使用 bridge 网络或依赖 NAT,需在宿主机扩大 conntrack 表:
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
并写入/etc/sysctl.conf持久化
验证是否生效
进容器后执行:
-
cat /proc/sys/net/core/somaxconn—— 应输出设定值(如65535) -
ulimit -n—— 应输出设定的文件描述符上限(如65536)


















