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加载空配置。
- 解决方法:
- 检查
${VOLUMES_FOLDER}/local_nginx目录下是否存在moonshine2.local文件,确保配置正确挂载。 - 进入容器验证default.conf内容:
docker exec -it moonshine2.nginx.local cat /etc/nginx/conf.d/default.conf - 若无需环境变量替换,直接修改docker-compose中Nginx的command:
command: nginx -g 'daemon off;'
- 检查
4. HTTPS服务端口未映射
Nginx中前端服务配置了443端口,但容器未将443端口映射到主机,导致外部无法访问HTTPS服务。
- 解决方法:在docker-compose的Nginx服务中添加端口映射:
ports: - "8081:80" - "443:443"
相关产品推荐
相关产品推荐

