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

Docker Compose无法从Ubuntu WSL访问Nginx主机问题排查

问题描述

平台信息

- 操作系统:Windows 11 Pro
- 系统版本:22H2(22621.674)
- WSL发行版:Ubuntu 22.04.2 LTS
- Docker Desktop版本:4.22.1(118664)
- Docker Engine版本:v24.0.5

通过docker compose -f docker-compose.yml up启动多组服务后,在Ubuntu和Windows主机上通过localhost:EXPOSED_PORT可正常连接,但无法通过Nginx及/etc/hosts配置的独立主机名访问各服务,会触发ERR_CONNECTION_CLOSED错误。

Ubuntu环境下用curl访问Nginx容器内网IP时,返回curl: (52) Empty reply from server,但Docker容器内部可正常访问。已尝试将网络驱动改为host、在ports属性中指定IP,均未解决问题。

相关配置文件

docker-compose.yml

// docker-compose.yml

version: "3.8"
services:
  moonshine2_webserver_local:
    build:
      context: ${SRC_CODE_FOLDER}
      dockerfile: ${PWD}/back/Dockerfile
    container_name: moonshine2.webserver.local
    domainname: moonshine2.local
    image: moonshine2.webserver.local.image
    restart: always
    ports:
      - "3333:3333"
      - "5850:5850"
    depends_on:
      - moonshine2_mongo_local
      - moonshine2_mongors_initializer
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.3
    links:
      - moonshine2_mongo_local
      - moonshine2_mongo_rs1_local
      - moonshine2_mongo_rs2_local
      - moonshine2_mongo_rs3_local
      - moonshine2_sftp_local:sgfm.moonshine2.local
      - moonshine2_cdn_local
    command: npm run debug_vscode_docker --site=manager --services=manager_dev --unsafe-perm true
    volumes:
      - ${SRC_CODE_FOLDER}:/home/node/app

  moonshine2_webserver_local_front:
    build:
      context: ${SRC_CODE_FOLDER}
      dockerfile: ${PWD}/front/Dockerfile
    container_name: moonshine2.frontend.local
    domainname: moonshine2.local.front
    ports:
      - "3000:3000"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.7
    links:
      - moonshine2_webserver_local
    command: npm start --unsafe-perm true
    volumes:
      - ${SRC_CODE_FOLDER}:/home/node/app

  moonshine2_mongo_local:
    image: mongo:4.2
    container_name: moonshine2.mongo.local
    domainname: moonshine2.mongo.local
    restart: always
    ports:
      - "27017:27017"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.2
    volumes:
      - "${VOLUMES_FOLDER}/local_mongo/data/db:/data/db"
    command:
      # Define default command (remove logging driver none to see logs).
      # profile 0 (default): no query logged
      - mongod
      # profile 1: log slow queries
      #- mongod --profile 1 --slowms 2
      # profile 2: log all queries
      #- mongod --profile 2
    logging:
      driver: none
      
  moonshine2_mongors_initializer:
    image: mongo:4.2
    container_name: moonshine2.mongors.initializer
    domainname: moonshine2.mongors.initializer
    restart: always
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.20
    volumes:
      - "${VOLUMES_FOLDER}/local_mongors_initializer/data:/data"
    depends_on:
      - moonshine2_mongo_rs1_local
      - moonshine2_mongo_rs2_local
      - moonshine2_mongo_rs3_local
    entrypoint: bash /data/init_rs.sh
    logging:
      driver: none

  moonshine2_mongo_rs1_local:
    image: mongo:4.2
    container_name: moonshine2.mongors1.local
    domainname: moonshine2.mongors1.local
    restart: always
    ports:
      - "30001:27017"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.21
    volumes:
      - "${VOLUMES_FOLDER}/local_mongo_rs1/data/db:/data/db"
    command: mongod --replSet msrs
    logging:
      driver: none

  moonshine2_mongo_rs2_local:
    image: mongo:4.2
    container_name: moonshine2.mongors2.local
    domainname: moonshine2.mongors2.local
    restart: always
    ports:
      - "30002:27017"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.22
    volumes:
      - "${VOLUMES_FOLDER}/local_mongo_rs2/data/db:/data/db"
    command: mongod --replSet msrs
    logging:
      driver: none

  moonshine2_mongo_rs3_local:
    image: mongo:4.2
    container_name: moonshine2.mongors3.local
    domainname: moonshine2.mongors3.local
    restart: always
    ports:
      - "30003:27017"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.23
    volumes:
      - "${VOLUMES_FOLDER}/local_mongo_rs3/data/db:/data/db"
    command: mongod --replSet msrs
    logging:
      driver: none

  moonshine2_nginx_local:
    image: nginx:1.24.0
    container_name: moonshine2.nginx.local
    restart: always
    links:
      - moonshine2_webserver_local
      - moonshine2_mongo_local
      - moonshine2_mongors_initializer
      - moonshine2_mongo_rs1_local
      - moonshine2_mongo_rs2_local
      - moonshine2_mongo_rs3_local
    volumes:
      - ${VOLUMES_FOLDER}/local_nginx:/etc/nginx/conf.d
    ports:
      - "8081:80"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.4
    environment:
      - NGINX_HOST=moonshine2.local
      - NGINX_PORT=80
    command: /bin/bash -c "envsubst < /etc/nginx/conf.d/moonshine2.local > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

  moonshine2_cdn_local:
    image: nginx:1.24.0
    container_name: moonshine2.cdn.local
    restart: always
    volumes:
      - ${VOLUMES_FOLDER}/cdn:/etc/nginx/conf.d
      - ${VOLUMES_FOLDER}/sftp:/www/data/statics/uat/manager/contents/images/uploads
      - ${VOLUMES_FOLDER}/sftp:/www/data/statics/uat/manager/contents/documents/uploads
    ports:
      - "8181:81"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.6
    environment:
      - NGINX_HOST= moonshine2.cdn.local
      - NGINX_PORT=81
    command: /bin/bash -c "envsubst < /etc/nginx/conf.d/moonshine2.cdn.local > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    logging:
      driver: none

  moonshine2_sftp_local:
    image: atmoz/sftp
    container_name: moonshine2.sftp.local
    restart: always
    volumes:
      - ${VOLUMES_FOLDER}/sftp:/home/nodejs/public/manager/contents/images/uploads
      - ${VOLUMES_FOLDER}/sftp:/home/nodejs/public/manager/contents/documents/uploads
    ports:
      - "2222:22"
    networks:
      moonshine_docker_local:
        ipv4_address: 10.10.0.5
    command: nodejs:nodejs:1000
    logging:
      driver: none

networks:
  moonshine_docker_local:
    driver: bridge
    ipam:
      config:
        - subnet: 10.10.0.0/25
          gateway: 10.10.0.1

Nginx配置文件

upstream moonshine2.local {
    server 10.10.0.3:3333;
}

server {

    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.local;
    client_max_body_size 100M;

    location / {
        proxy_pass http://moonshine2.local;
        #include /etc/nginx/proxy_params;
    }    
}

upstream moonshine2.frontend.local {
    server 10.10.0.7:3001;
}
server {
    listen 443 ssl;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
    ssl_certificate /etc/nginx/conf.d/certs/moonshineUAT.pem;
    ssl_certificate_key /etc/nginx/conf.d/certs/moonshineUAT.key;
    ssl on; 
    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;
    server_name moonshine2.frontend.local;
    location / {
        proxy_pass http://moonshine2.frontend.local;
        #include /etc/nginx/proxy_params;
    }    
}

upstream moonshine2.mongo.local {
    server 10.10.0.2:27017;
}

server {

    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.mongo.local;

    location / {
        proxy_pass http://moonshine2.mongo.local;
        #include /etc/nginx/proxy_params;
    }
}

upstream moonshine2.mongors.initializer {
    server 10.10.0.20;
}

server {

    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.mongors.initializer;

    location / {
        proxy_pass http://moonshine2.mongors.initializer;
        #include /etc/nginx/proxy_params;
    }
}

upstream moonshine2.mongors1.local {
    server 10.10.0.21:27017;
}

server {
 
    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.mongors1.local;

    location / {
        proxy_pass http://moonshine2.mongors1.local;
        #include /etc/nginx/proxy_params;
    }
}

upstream moonshine2.mongors2.local {
    server 10.10.0.22:27017;
}

server {

    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.mongors2.local;

    location / {
        proxy_pass http://moonshine2.mongors2.local;
        #include /etc/nginx/proxy_params;
    }
}

upstream moonshine2.mongors3.local {
    server 10.10.0.23:27017;
}

server {

    gzip_types text/plain text/css application/json application/x-javascript
               text/xml application/xml application/xml+rss text/javascript;

    server_name moonshine2.mongors3.local;

    location / {
        proxy_pass http://moonshine2.mongors3.local;
        #include /etc/nginx/proxy_params;
    }
}

/etc/hosts文件(Ubuntu和Windows中均配置)

10.0.199.205    host.docker.internal
10.0.199.205    gateway.docker.internal

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# Moonshine2 docker local environment
10.10.0.4 moonshine2.local moonshine2.contents.local moonshine2.frontend.local www.moonshine2.local www.moonshine2.contents.local www.moonshine2.frontend.local
10.10.0.2 moonshine2.mongo.local manager-mongo
10.10.0.5 moonshine2.sftp.local
10.10.1.4 moonshine2.dev moonshine2.mongo.dev moonshine2.contents.dev
10.10.0.6 sgfm.moonshine2.local

# Moonshine2 mongo replica set
10.10.0.20 moonshine2.mongors.initializer
10.10.0.21 moonshine2.mongors1.local
10.10.0.22 moonshine2.mongors2.local
10.10.0.23 moonshine2.mongors3.local

问题排查与解决方案

1. WSL与Docker容器内网IP的路由问题

WSL 2的虚拟化网络默认无法直接访问Docker bridge子网的容器IP,导致curl访问Nginx容器IP返回空响应。

  • 解决方法:在WSL的Ubuntu中添加路由规则,将Docker子网流量导向Windows主机网关:
sudo ip route add 10.10.0.0/25 via $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')

2. Nginx前端服务端口配置错误

docker-compose中前端服务映射的是3000:3000,但Nginx upstream配置写的是10.10.0.7:3001,端口不匹配导致转发失败。

  • 解决方法:修改Nginx配置中的前端upstream:
upstream moonshine2.frontend.local {
    server 10.10.0.7:3000;
}

3. Nginx启动命令的配置文件生成问题

当前Nginx启动命令依赖/etc/nginx/conf.d/moonshine2.local文件生成default.conf,若该文件不存在或envsubst替换失败,会导致Nginx加载空配置。

  • 解决方法:
    1. 检查${VOLUMES_FOLDER}/local_nginx目录下是否存在moonshine2.local文件,确保配置正确挂载。
    2. 进入容器验证default.conf内容:
      docker exec -it moonshine2.nginx.local cat /etc/nginx/conf.d/default.conf
      
    3. 若无需环境变量替换,直接修改docker-compose中Nginx的command:
      command: nginx -g 'daemon off;'
      

4. HTTPS服务端口未映射

Nginx中前端服务配置了443端口,但容器未将443端口映射到主机,导致外部无法访问HTTPS服务。

  • 解决方法:在docker-compose的Nginx服务中添加端口映射:
ports:
  - "8081:80"
  - "443:443"
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:37:08