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

树莓派5上Docker网络间歇性异常问题排查求助

容器更新后Nginx Proxy Manager反向代理502问题排查

环境信息

  • 设备:树莓派5 8GB
  • 运行环境:树莓派版Docker,所有服务均以容器化方式运行
  • 涉及服务:Nginx Proxy Manager(NPM)、Jenkins、自定义服务my-service-container-name
  • 网络配置:所有服务接入同一Docker外部网络main-net

问题现象

  1. 初始部署完成后,NPM通过容器名my-service-container-name:4173反向代理该服务,工作正常。
  2. 通过Jenkins更新并重新部署my-service-container-name容器后,NPM返回502错误。
  3. 从NPM容器内ping该服务的IP172.20.0.4提示目标主机不可达,但ping同网络的Jenkins容器IP172.20.0.7通信正常。
  4. 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"]

可能的原因与排查方向

  1. 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)
  2. Docker DNS缓存问题
    若NPM使用容器名解析服务地址,Jenkins重建容器后IP变更,但NPM的DNS缓存未更新。可尝试:

    • 在NPM容器内手动解析容器名(nslookup my-service-container-name),查看是否指向正确IP
    • 重启NPM容器清除DNS缓存
  3. main-net的Attachable属性限制
    当前网络Attachable: false,虽然初始部署正常,但容器重建时可能因该设置导致无法正确注册到网络。可执行命令修改属性后重新部署服务:

    docker network update --attachable true main-net
    
  4. 树莓派Docker架构兼容性问题
    树莓派为ARM架构,Docker bridge驱动可能存在容器重建后跨容器通信的bug。可尝试:

    • 重启Docker服务(sudo systemctl restart docker)
    • 删除并重新创建main-net网络
  5. 服务启动状态未就绪
    容器显示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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:15:54