Docker容器并发连接数由宿主机、容器运行时和应用三层共同决定:1. 容器需设--ulimit nofile=65536:65536;2. 应用层按服务配置(如Node.js设maxConnections、MySQL设max_connections);3. 宿主机调优somaxconn等内核参数;4. 须通过ab/wrk压测并ss -s验证。

在 Docker 中,容器本身没有直接的“最大并发连接数”参数,这个限制实际由三层共同决定:宿主机系统级限制、容器运行时限制、以及应用自身配置。只调一环往往无效,必须协同设置。
1. 容器运行时文件描述符限制(关键基础)
每个 TCP 连接占用一个文件描述符(file descriptor, fd),Linux 默认单进程最多打开 1024 个 fd。高并发场景下极易耗尽,导致 accept: too many open files 错误。
启动容器时必须显式提升:
- 用
--ulimit nofile=65536:65536设置软硬限制均为 65536 - 若用 Docker Compose,在
services下加:
ulimits:
nofile:
soft: 65536
hard: 65536 - 验证方式:进入容器执行
ulimit -n,应返回65536
2. 应用层连接数控制(按服务类型配置)
运行时限制只是前提,真正生效的并发上限由应用或中间件控制:
-
Node.js:设置
server.maxConnections = 1000(需在http.createServer()后赋值) -
MySQL:在容器内修改
/etc/mysql/mysql.conf.d/mysqld.cnf,添加max_connections = 1000,再重启 MySQL 服务 -
RabbitMQ:向
/etc/rabbitmq/rabbitmq.conf写入rabbitmq.max_connections = 2000 -
Nginx:在
http块中设worker_connections 4096;,并确保worker_processes auto;
3. 宿主机内核参数调优(影响连接建立能力)
即使容器内配置充足,宿主机的 TCP 队列和连接跟踪机制也可能成为瓶颈:
- 增大全连接队列:运行
sysctl -w net.core.somaxconn=65535 - 增大半连接队列:运行
sysctl -w net.ipv4.tcp_max_syn_backlog=65535 - 这些参数建议写入
/etc/sysctl.conf并执行sysctl -p持久化 - 注意:Docker 默认 bridge 网络会经过 iptables 连接跟踪(conntrack),大量短连接可能触发
nf_conntrack_full,必要时可调大net.netfilter.nf_conntrack_max
4. 验证是否真正生效
不要只看配置文件,要实测:
- 用
ab -n 10000 -c 2000 http://localhost:3000/或wrk -t4 -c2000 -d30s http://host:port压测 - 压测中进入容器,执行
ss -s查看当前 socket 统计,重点关注established和synrecv数量 - 检查应用日志是否出现连接拒绝、fd 耗尽或队列溢出提示


















