如何修复 WSL 和 Docker Compose 之间的网络冲突?

如何修复 WSL 和 Docker Compose 之间的网络冲突?

几天前,WSL2(Ubuntu 20.04),我安装了docker compose并创建了一个docker-compose.yml,它基于postgres:12镜像构建数据库。我第一次运行它时,一切都很正常。

几天后,当我再次运行docker compose时,构建没有成功。Docker 无法访问互联网来拉取 postgres 镜像,连接被拒绝. 以下是其中的内容:

$ docker compose up -d

[+] Running 1/0
 ! database Warning                                                                                                                              
[+] Building 0.0s (3/3) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                
 => => transferring dockerfile: 290B                                                                                                                
 => [internal] load .dockerignore                                                                                                                   
 => => transferring context: 2B                                                                                                                     
 => ERROR [internal] load metadata for docker.io/library/postgres:12-alpine                                                                         
------
 > [internal] load metadata for docker.io/library/postgres:12-alpine:
------
failed to solve: postgres:12-alpine: failed to do request: Head "https://registry-1.docker.io/v2/library/postgres/manifests/12-alpine": dial tcp: lookup registry-1.docker.io on 172.18.0.1:53: read udp 172.18.0.1:51217->172.18.0.1:53: read: connection refused

因此,我尝试或检查了 WSL 中是否仍可以访问互联网,sudo apt-get updateping google.com没有……事实上,从那天起,我就无法在 WSL 中再访问互联网了。

$ ping www.google.com
ping: www.google.com: Temporary failure in name resolution

我已尝试过:

  • 我尝试进入/etc/resolve.conf并修改名称服务器地址,通过输入 google DNS,8.8.8.8而不是默认地址。resolve.conf 内容:
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateR.esolvConf = false
nameserver 8.8.8.8

我甚至创建了一个wsl.conf来保留nameserver 8.8.8.8。之后,我的问题解决了几分钟,但一切又崩溃了。

  • 如果我在 中更改名称服务器,docker 错误会有所不同resolve.conf。使用默认名称服务器,如果我想在 docker 中拉取 postgres 映像,我有一个连接被拒绝(就像使用docker compose一样):
$ docker pull postgres
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.18.0.1:53: read udp 172.18.0.1:57439->172.18.0.1:53: read: connection refused

并且nameserver 8.8.8.8,我有一个暂停来自docker的错误:

$ docker pull postgres
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 8.8.8.8:53: read udp 172.18.7.177:46999->8.8.8.8:53: i/o timeout
  • 但奇怪的是,如果我重启电脑,然后运行 ​​WSL,我就会有一个短暂的互联网连接,大约需要 2 分钟,(如果我做一个sudo apt-get update,它就会起作用),然后它最终会失去所有连接。

我认为 docker 或 docker compose 一定在我的 WSL 网络中造成了冲突,可能是 IP 地址已被其他程序使用,但我无法解释原因。这是我的 Docker 和 Docker compose 版本。

Docker version 23.0.3, build 3e7cbfd
Docker Compose version v2.17.2

谢谢您的帮助,说实话我不知道该怎么办。

相关内容