一台 PC 作为家用服务器使用,上面使用 Docker 跑了若干容器。
由于防火墙和透明代理配置的需要,需要部分容器使用独立 IP 来跑,并在相关规则中添加这些 IP 的规则。 于是我开始使用 Docker 提供的 macvlan 功能,创建了一个 macvlan 类型的 network ,相关容器配置使用这个 network ,并指定独立 IP 。
容器创建出来后是可以按照预期运行的,在其他设备访问这些 IP 也都可以正确访问到这些容器。
问题是在这些容器开始建立一些网络连接后,这些容器就会变得不可访问,直到连接断开才重新恢复访问。容器本身的运行状态正常(无闪退、死机)。其他非 macvlan 容器访问正常。
举个例子,用容器跑 aria2 或 transmission ,没有任务的时候可以正常访问,添加任务后,当任务与一定数量节点建立联系后,aria2 或 transmission 的 RPC API 就无法访问,直到任务完成后又恢复访问。
不光从容器外部访问会失联,使用 docker exec 进入到正在运行的容器内部,执行 curl 127.0.0.1 也会失联或延迟数十秒返回结果。
如何排查问题可能出在哪?
系统情况:
1
zljklang 2023-10-30 15:20:44 +08:00
用网桥
|
2
libook OP @zljklang #1 可以具体说明配置什么样的网桥吗?
因为需要独立 IP ,所以没有使用 docker 默认的网桥网络,而是用了 macvlan ,我需要确保从外面用容器自己的 IP 访问容器。 |
3
zljklang 2023-10-31 09:30:53 +08:00
docker network create kind -o com.docker.network.bridge.default_bridge=true -o com.docker.network.bridge.enable_icc=true -o com.docker.network.bridge.enable_ip_masquerade=true -o com.docker.network.bridge.host_binding_ipv4=0.0.0.0 -o com.docker.network.bridge.name=vmbr0 -o com.docker.network.driver.mtu=1500 --driver bridge --subnet 192.168.3.33/27 --gateway 192.168.3.254
|
4
zljklang 2023-10-31 09:33:36 +08:00
先手动命令新建网桥 vmbr0 ,在执行上面这个命令,--gateway 网关就填网桥 ip
|
5
libook OP @zljklang #3 还没试,有两个疑问:
1. 我需要容器拥有一个与宿主机并列的独立 IP ,因为路由器要根据这个独立 IP 来添加规则,不能用 docker 宿主机的 IP ,否则会把宿主机上其他使用网桥的容器也一并按规则处理了。这个指令看起来是在 docker 宿主机内部创建了一个子网,是不是说最终还是是的使用 docker 宿主机的 IP+容器端口来访问容器? 2. 在宿主机上执行 docker exec 进入容器内部,在容器内部 curl 容器上服务进程所监听的端口( 127.0.0.1:端口号),依然会出现与外部访问一样的失联问题,我理解在容器内部访问容器本地端口应该是走的容器内的 lo interface ,而不是任何其他宿主机上创建的网桥或 macvlan ,依然会出现失联问题的话,会不会是更底层的网络管理或实现方面的问题? |
7
zljklang 2023-10-31 11:18:49 +08:00
会分到路由器给的 IP ,路由器上也能看到 ip
|
8
zljklang 2023-10-31 11:20:06 +08:00
或者可以不用改,直接在路由上添加静态路由也可以直接访问容器 ip ,这个要在宿主机上开启包转发功能。
|
9
zljklang 2023-10-31 11:27:24 +08:00
那是不是是你服务的问题,curl 127.0.0.1 也有问题
|