如何在Docker Compose中禁用IPv6解决Nginx启动失败问题
解决Docker Compose在无IPv6服务器上的容器启动问题
问题背景
在未启用IPv6的第三方托管服务器上运行Docker Compose项目时,Nginx容器启动报错:
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
尝试通过容器sysctl配置禁用IPv6时出现以下错误:
Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open /proc/sys/net/ipv6/conf/all/disable_ipv6: no such file or directory: unknown
原因是宿主机未启用IPv6,容器内不存在对应的IPv6系统参数节点,因此无法通过该方式禁用。
解决方案
1. 修改Docker Compose网络配置(禁用IPv6)
在Compose文件的网络配置中明确禁用IPv6,可针对单个网络设置:
services: cont-nginx: container_name: cont-nginx networks: - cont image: nginx:latest depends_on: - cont-app restart: always ports: - "880:880" - "4443:4443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf networks: cont: driver: bridge enable_ipv6: false # 禁用该网络的IPv6支持 ipam: config: - subnet: 172.20.0.0/16 # 指定IPv4子网,确保网络仅使用IPv4
2. 修改Nginx配置,仅监听IPv4端口
问题本质是Nginx默认尝试监听IPv6端口,直接修改nginx.conf,将所有listen指令改为仅监听IPv4地址:
# 替换原listen指令 listen 0.0.0.0:880; # 仅监听IPv4的880端口 listen 0.0.0.0:4443 ssl; # HTTPS端口同理
避免使用listen [::]:80;或未指定地址的listen 80;(后者在IPv6环境下会同时监听IPv4和IPv6)。
3. 全局禁用Docker IPv6(若有权限修改Docker配置)
如果服务器允许修改Docker守护进程配置,编辑/etc/docker/daemon.json添加以下内容:
{ "ipv6": false, "fixed-cidr-v6": "" }
然后重启Docker服务:
systemctl restart docker
此配置会让所有新建容器默认不启用IPv6支持。
内容的提问来源于stack exchange,提问作者Hamperfait
相关产品推荐
相关产品推荐

