wsl2中docker环境突然无法ping通宿主机的问题处理

【省流提示】:以下内容作用不大,仅属于作者个人的踩坑记录,请忽略。

前言

windows下的docker用得好好的,但突然有一天docker容器无法访问宿主机中的代理,进入容器发现无法ping通宿主机。(我只是个小呆瓜,我也很懵啊)
image

处理过程>>>

1、检查网络配置

查看wsl2网络配置跟宿主机网络配置是否一致

分别在wsl2虚拟机中执行ifconfig跟在windows中执行ipconfig /all,发现wsl2中的ip为172.24.101.x,windows中的WSL桥适配器的ip是172.24.96.x
image

2、修改配置

修改wsl2中的ip(例如这里修改为172.24.96.100

  • 【可选】在wsl2终端中直接修改,测试是否可行:
    1
    2
    sudo 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
    11
    cat <<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]
    EOF
    然后执行 sudo netplan apply 使配置生效

3、验证结果

修改wsl2的ip配置后,可以正常ping通宿主机了。
image

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通,所以上面解决方案是错误的(留下没有技术的泪水(̂ ˃̥̥̥ ˑ̫ ˂̥̥̥ )̂……洪湖水啊……)。

image

5、继续排查继续尝试解决

心想这问题就是这两天发生的,嫌疑犯必定在其中。我似乎回忆起最近用vscode的Dev Containers插件来运行过开发环境,经排查,确实又找到了一些线索。

以下是其中一个.devcontainer/docker-compose.yml的配置。

1
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
version: '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]
shm_size: 22g
ports:
- "0.0.0.0:7890:7860"

可以看到PROXY配置了端口是7890的代理,而下面的ports本来应该将容器的7860映射到宿主机的7860,但是实际上映射到了0.0.0.0:7890

我怀疑过是否跟端口冲突有关,但是正常情况下,启动docker容器时应该会报端口占用才对,这里没有提示,为什么呢?可能是当时代理软件没有打开,而7890端口刚好未被占用吧。

于是乎,开发环境的docker容器就这么启动了,且中奖式地创建了一条192.168.50.0/20bridge网络。而我宿主机的地址是192.168.50.48,跟这个docker的bridge网络有冲突。

我的网络知识实在有限(留下没有技术的泪水……(-̩̩̩-̩̩̩-̩̩̩-̩̩̩-̩̩̩___-̩̩̩-̩̩̩-̩̩̩-̩̩̩-̩̩̩)),实在不明白这一切为什么就这么巧合地发生了。

image

我只知道,当我将那条192.168.50.0/20bridge网络删除掉 + 修正之前错误的7890端口映射后,一切都恢复了正常。

我感到欢喜又感到悲伤。欢喜是因为这个问题终于解决了,可以继续cdocker了。悲伤的是,我并不知道到底是什么原因,导致docker创建了192.168.50.0/20bridge网络。

或许 Docker 在创建默认 bridge 网络时检测到冲突(例如,如果 172.17.0.0/16 已经被占用),它可能会选择其他可用的子网。而 192.168.50.0/20 碰巧是下一个可用的子网,那么它就选择了这个子网……
image

我能想到的是,这一切可能都源于中奖式的巧合(再再次留下没有技术的泪水……)(༎ຶ ෴ ༎ຶ) ( ´༎ຶㅂ༎ຶ`) (༎ຶ⌑༎ຶ) ฅ(⌯͒•̩̩̩́ ˑ̫ •̩̩̩̀⌯͒)ฅ

image

6、小结

其实上面的.devcontainer/docker-compose.yml配置,没有明确配置docker的网络,启动时会创建一个新的docker桥接网络。这里建议还是主动指定容器的网络,尽可能的避免奇怪(这里的奇怪仅对于我这样的小白而言)的问题发生。

没指定网络的情况:
image

指定网络的情况:
image

如何配置指定的网络?只需要在.devcontainer/docker-compose.yml中增加network_mode: bridge即可,默认会自动配置到名称为bridge的网络下。

如果需要配置其他网络,则需要手动创建,并指定网络名称,例如这里创建一个名为vscode_devcontainer的网络:。

  • 创建网络

    1
    docker network create vscode_devcontainer
  • 配置.devcontainer/docker-compose.yml

    1
    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
    29
    version: '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.json

    1
    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"
    }

其他说明>>>

1、参考文章