树莓派5上Docker网络间歇性异常问题排查求助
容器更新后Nginx Proxy Manager反向代理502问题排查
环境信息
- 设备:树莓派5 8GB
- 运行环境:树莓派版Docker,所有服务均以容器化方式运行
- 涉及服务:Nginx Proxy Manager(NPM)、Jenkins、自定义服务
my-service-container-name - 网络配置:所有服务接入同一Docker外部网络
main-net
问题现象
- 初始部署完成后,NPM通过容器名
my-service-container-name:4173反向代理该服务,工作正常。 - 通过Jenkins更新并重新部署
my-service-container-name容器后,NPM返回502错误。 - 从NPM容器内ping该服务的IP
172.20.0.4提示目标主机不可达,但ping同网络的Jenkins容器IP172.20.0.7通信正常。 my-service-container-name容器状态显示正常(docker ps无异常),且通过宿主机IP192.168.0.254:3500可正常访问该服务。
容器网络与状态信息
网络main-net详情
$ docker network inspect main-net [ { "Name": "main-net", "Id": "488966e42093e1abe082c19e83443955855952df79207c331c0a4f08e12b2bb7", "Created": "2024-01-24T12:13:31.125832336+09:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.20.0.0/16", "Gateway": "172.20.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "2cc86409aed17c249b1d7724e2eca5a5010cf7f97e2cfb15d23ca2677114b085": { "Name": "my-service-container-name", "EndpointID": "8d781f8a59bdb5abd52a74712143c4bb7c9bf77392a59ea8ab40e5eb3b9cde54", "MacAddress": "02:42:ac:14:00:03", "IPv4Address": "172.20.0.4/16", "IPv6Address": "" }, "a74e49c05c1482a42141d34d194a5e2879d207dff1ec631acd7a0570643bc4f3": { "Name": "nginx-proxy-manager", "EndpointID": "30b9b6b80dfa890dcbae4415a655918015ad198e42169ef4a835adad782de732", "MacAddress": "02:42:ac:14:00:03", "IPv4Address": "172.20.0.5/16", "IPv6Address": "" }, "ce25283e3f332aa925eb9ca35f1d4a7a5322b803a741334e045d4b35b4ea1a49": { "Name": "jenkins", "EndpointID": "df1da37a87db198f1e0fceeaac3488466118f4b68f6a8e9911d412532c5ac863", "MacAddress": "02:42:ac:14:00:02", "IPv4Address": "172.20.0.7/16", "IPv6Address": "" } ... More }, "Options": {}, "Labels": { "com.docker.compose.network": "main-net", "com.docker.compose.project": "host", "com.docker.compose.version": "2.24.1" } } ]
NPM容器ping服务IP结果
[root@docker-a74e49c05c14:/app]# ping 172.20.0.4 PING 172.20.0.4 (172.20.0.4) 56(84) bytes of data. From 172.20.0.5 icmp_seq=10 Destination Host Unreachable From 172.20.0.5 icmp_seq=11 Destination Host Unreachable From 172.20.0.5 icmp_seq=12 Destination Host Unreachable
NPM容器ping JenkinsIP结果
PING 172.20.0.7 (172.20.0.7) 56(84) bytes of data. 64 bytes from 172.20.0.7: icmp_seq=1 ttl=64 time=0.171 ms 64 bytes from 172.20.0.7: icmp_seq=2 ttl=64 time=0.094 ms 64 bytes from 172.20.0.7: icmp_seq=3 ttl=64 time=0.096 ms
my-service-container-name容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2cc86409aed1 my-service-container-name "docker-entrypoint.s…" 25 hours ago Up 13 hours 0.0.0.0:3500->4173/tcp, :::3500->4173/tcp my-service-container-name
相关配置文件
vite.config.ts
export default defineConfig({ plugins: [react(), svgrPlugin(), tsconfigPaths()], server: { port: 3000, host: '0.0.0.0', }, preview: { port: 4173, host: '0.0.0.0', }, })
docker-compose.yml
version: '3.9' services: front: build: context: . dockerfile: Dockerfile restart: unless-stopped ports: - '3500:4173' networks: - main-net networks: main-net: external: true
Dockerfile
FROM node:20-alpine RUN apk add yarn WORKDIR /hcc COPY package.json . COPY yarn.lock . RUN yarn COPY . . RUN yarn build EXPOSE 4173 CMD ["yarn", "preview"]
可能的原因与排查方向
Docker网络端点未正确更新
容器重新部署后,Docker可能未在main-net中正确刷新容器的网络路由条目。即使docker network inspect显示容器已接入网络,实际网络栈中可能不存在该容器的路由。可尝试:- 重启NPM容器,触发网络路由刷新
- 移除并重新添加
my-service-container-name到main-net(docker network disconnect main-net my-service-container-name再docker network connect main-net my-service-container-name)
Docker DNS缓存问题
若NPM使用容器名解析服务地址,Jenkins重建容器后IP变更,但NPM的DNS缓存未更新。可尝试:- 在NPM容器内手动解析容器名(
nslookup my-service-container-name),查看是否指向正确IP - 重启NPM容器清除DNS缓存
- 在NPM容器内手动解析容器名(
main-net的Attachable属性限制
当前网络Attachable: false,虽然初始部署正常,但容器重建时可能因该设置导致无法正确注册到网络。可执行命令修改属性后重新部署服务:docker network update --attachable true main-net树莓派Docker架构兼容性问题
树莓派为ARM架构,Docker bridge驱动可能存在容器重建后跨容器通信的bug。可尝试:- 重启Docker服务(
sudo systemctl restart docker) - 删除并重新创建
main-net网络
- 重启Docker服务(
服务启动状态未就绪
容器显示Up但内部服务可能未完全启动,导致NPM转发失败。可在docker-compose中添加健康检查:services: front: # ... 其他配置 healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:4173"] interval: 10s timeout: 5s retries: 3
内容的提问来源于stack exchange,提问作者Jessie
相关产品推荐
相关产品推荐

