M1芯片Mac下Docker Nginx报Host is unreachable上游连接502错误
问题修复方案
根因说明
该问题是M1芯片Mac的Docker Desktop特性、配置疏漏共同导致,Ubuntu下运行正常是因为Linux原生Docker网络实现与macOS Docker(运行在虚拟化层)差异较大。
修复步骤
- 修复业务服务监听地址配置
你的前端服务platform-ui、management-console-ui启动后默认大概率监听的是容器内的127.0.0.1,导致其他容器无法访问。修改启动命令,指定监听所有网卡地址0.0.0.0:
以React脚手架的yarn start为例,修改package.json的启动脚本为:
"start": "HOST=0.0.0.0 PORT=8080 react-scripts start"需确认
platform-ui容器内确实监听8080端口,和nginx upstream配置的端口完全一致。- 修复业务服务监听地址配置
- 补全Docker Compose网络关联配置
你当前的reverse-proxy服务没有显式关联其他业务服务的网络,M1版Docker的默认网桥偶发会出现DNS解析/路由异常,补全配置即可:
在docker-compose.yml的reverse-proxy配置块添加links字段:
reverse-proxy: image: reverse-proxy:latest depends_on: - platform-ui - management-console-ui - web-platform links: - platform-ui - management-console-ui - web-platform ports: - "8080:8080" - "8081:8081"- 补全Docker Compose网络关联配置
- 修复M1 Docker架构兼容性问题
Docker Desktop 3.6.0对M1芯片的支持存在已知网络bug,且如果你的镜像(尤其是Nginx、业务镜像)是amd64架构构建的,在M1上转译运行会出现网络不可达问题: - 升级Docker Desktop到最新稳定版,至少高于4.0.0版本
- 构建镜像时指定适配arm64架构,或者在docker-compose中给服务添加
platform: linux/amd64强制用Rosetta转译运行:
reverse-proxy: image: reverse-proxy:latest platform: linux/amd64 # 其余配置保持不变所有使用非arm64原生镜像的服务都可以添加该配置规避架构兼容性问题。
- 修复M1 Docker架构兼容性问题
- 验证配置生效
执行以下命令重启所有服务:
docker-compose down -v docker-compose up --build进入reverse-proxy容器执行curl验证连通性:
docker exec -it <你的reverse-proxy容器名> bash curl http://platform-ui:8080如果能拿到正常响应说明连通性已恢复,再访问localhost:8080验证即可。
- 验证配置生效
内容的提问来源于stack exchange,提问作者Hermenegida
相关产品推荐
相关产品推荐

