【省流提示】:以下内容作用不大,仅属于作者个人的踩坑记录,请忽略。
前言
windows下的docker用得好好的,但突然有一天docker容器无法访问宿主机中的代理,进入容器发现无法ping通宿主机。(我只是个小呆瓜,我也很懵啊)
处理过程>>>
1、检查网络配置
查看wsl2网络配置跟宿主机网络配置是否一致
分别在wsl2虚拟机中执行ifconfig跟在windows中执行ipconfig /all,发现wsl2中的ip为172.24.101.x,windows中的WSL桥适配器的ip是172.24.96.x。
2、修改配置
修改wsl2中的ip(例如这里修改为172.24.96.100)
- 【可选】在wsl2终端中直接修改,测试是否可行:
1
2sudo ifconfig eth0 172.24.96.100 netmask 255.255.240.0
sudo route add default gw 172.24.96.1 eth0 - 【推荐】修改wsl2虚拟机中的配置文件
/etc/netplan/01-netcfg.yaml然后执行1
2
3
4
5
6
7
8
9
10
11cat <<EOF | tee /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [172.24.96.100/20]
gateway4: 172.24.96.1
nameservers:
addresses: [8.8.8.8]
EOFsudo netplan apply使配置生效
3、验证结果
修改wsl2的ip配置后,可以正常ping通宿主机了。
4、被啪啪打脸
以为上面可以ping通就可以了吗?
NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO!NO^10086
测试了其他docker容器,发现还是无法ping通,所以上面解决方案是错误的(留下没有技术的泪水(̂ ˃̥̥̥ ˑ̫ ˂̥̥̥ )̂……洪湖水啊……)。
5、继续排查继续尝试解决
心想这问题就是这两天发生的,嫌疑犯必定在其中。我似乎回忆起最近用vscode的Dev Containers插件来运行过开发环境,经排查,确实又找到了一些线索。
以下是其中一个.devcontainer/docker-compose.yml的配置。
1 | version: '3.8' |
可以看到PROXY配置了端口是7890的代理,而下面的ports本来应该将容器的7860映射到宿主机的7860,但是实际上映射到了0.0.0.0:7890。
我怀疑过是否跟端口冲突有关,但是正常情况下,启动docker容器时应该会报端口占用才对,这里没有提示,为什么呢?可能是当时代理软件没有打开,而7890端口刚好未被占用吧。
于是乎,开发环境的docker容器就这么启动了,且中奖式地创建了一条192.168.50.0/20的bridge网络。而我宿主机的地址是192.168.50.48,跟这个docker的bridge网络有冲突。
我的网络知识实在有限(留下没有技术的泪水……(-̩̩̩-̩̩̩-̩̩̩-̩̩̩-̩̩̩___-̩̩̩-̩̩̩-̩̩̩-̩̩̩-̩̩̩)),实在不明白这一切为什么就这么巧合地发生了。
我只知道,当我将那条192.168.50.0/20的bridge网络删除掉 + 修正之前错误的7890端口映射后,一切都恢复了正常。
我感到欢喜又感到悲伤。欢喜是因为这个问题终于解决了,可以继续cdocker了。悲伤的是,我并不知道到底是什么原因,导致docker创建了192.168.50.0/20的bridge网络。
或许 Docker 在创建默认 bridge 网络时检测到冲突(例如,如果 172.17.0.0/16 已经被占用),它可能会选择其他可用的子网。而 192.168.50.0/20 碰巧是下一个可用的子网,那么它就选择了这个子网……
我能想到的是,这一切可能都源于中奖式的巧合(再再次留下没有技术的泪水……)(༎ຶ ෴ ༎ຶ) ( ´༎ຶㅂ༎ຶ`) (༎ຶ⌑༎ຶ) ฅ(⌯͒•̩̩̩́ ˑ̫ •̩̩̩̀⌯͒)ฅ
6、小结
其实上面的.devcontainer/docker-compose.yml配置,没有明确配置docker的网络,启动时会创建一个新的docker桥接网络。这里建议还是主动指定容器的网络,尽可能的避免奇怪(这里的奇怪仅对于我这样的小白而言)的问题发生。
没指定网络的情况:
指定网络的情况:
如何配置指定的网络?只需要在.devcontainer/docker-compose.yml中增加network_mode: bridge即可,默认会自动配置到名称为bridge的网络下。
如果需要配置其他网络,则需要手动创建,并指定网络名称,例如这里创建一个名为vscode_devcontainer的网络:。
创建网络
1
docker network create vscode_devcontainer
配置
.devcontainer/docker-compose.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29version: '3.8'
services:
storydiffusion:
build:
context: ..
dockerfile: .devcontainer/Dockerfile-dev
args:
PROXY: http://192.168.50.48:7890
volumes:
- ..:/app
- G:/.cache:/root/.cache
command: sleep infinity
restart: unless-stopped
environment:
NVIDIA_VISIBLE_DEVICES: 0
XXXX_DEMO: XXXX_DEMO
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
network_mode: bridge
networks:
- vscode_devcontainer
shm_size: 22g
ports:
- "0.0.0.0:7860:7860"修改
.devcontainer/devcontainer.json1
2
3
4
5
6
7
8
9
10
11
12
13{
"name": "storydiffusion",
"dockerComposeFile": "docker-compose.yml",
"service": "storydiffusion",
"workspaceFolder": "/app",
"extensions": [
"ms-python.python",
"ms-python.debugpy",
"humao.rest-client",
"samge.vscode-samge-translate"
],
"network": "vscode_devcontainer"
}