You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:15:39