[wsl / Docker] host解決に失敗するnetwork error問題の対処

# 1. 状況

以下のような場合に、この記事の方法で解決できる場合がある。

1. wsl内でのbuild時にdockerイメージの取得に失敗する
`docker compose build`の最初に、dockerイメージのダウンロード処理が走るが、その時点でエラーが発生してしまう。
2. wsl内で `apt install <module>` を記載した Dockerfile の build に失敗する
3. wsl内で、 `git clone` ができない


# 2. 開発環境

windowsPC上でwslを立ち上げ、wslマシンの中で`git clone`や`docker compose build`などを行っている。


# 3. 詳しい症状

## 3-1. `docker compose build` 実行時に docker image の取得に失敗

```bash
$ docker compose build
[+] Building 0.1s (4/4) FINISHED                                                                                    
 => [internal] load build definition from Dockerfile                                                           0.0s
 => => transferring dockerfile: 2.18kB                                                                         0.0s
 => [internal] load .dockerignore                                                                              0.0s
 => => transferring context: 2B                                                                                0.0s
 => ERROR [internal] load metadata for docker.io/library/python:3.9.10                                         0.0s
 => CANCELED [internal] load metadata for docker.io/library/node:18.12.1-buster-slim                           0.0s
------
 > [internal] load metadata for docker.io/library/python:3.9.10:
------
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://registry-1.docker.io/v2/library/python/manifests/3.9.10": dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:34604->[::1]:53: read: connection refused
```

`failed to solve: rpc error`などというエラーが表示される。

## 3-2. apt install に失敗

docker-compose buildで、docker imageをビルドしようとしたところ、
Dockerfile内の `apt install` のところで次のエラーが発生。

```bash
Err:1 http://deb.debian.org/debian buster InRelease
  Temporary failure resolving 'deb.debian.org'
Err:2 http://security.debian.org/debian-security buster/updates InRelease
  Temporary failure resolving 'security.debian.org'
```


## 3-3. `git clone`実行時

```bash
$ git clone https://github.com/siruku6/py_web_docker_template.git
Cloning into 'py_web_docker_template'...
fatal: unable to access 'https://github.com/siruku6/py_web_docker_template.git/': Could not resolve host: github.com
```

`Could not resolve host: github.com`というエラーが表示され、`github.com`にアクセスできていないことが分かる。


# 4対処法

## 4-1. WSL 側の network 問題の解決

### 4-1-1. `/etc/resolv.conf` 作成

`/etc/resolv.conf`に問題があるので、それを作成ないし修正することで解決する。

ファイル内を以下の2行だけにすると良いようだ。

```config:/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

### 4-1-2. `/etc/wsl.conf` 作成

これで、 `/etc/resolv.conf` が上書きされてしまうことを防ぐ。

```config:/etc/wsl.conf
[network]
generateResolvConf = false
```

これがないと、wsl 再起動する度に、自動的に `/etc/resolv.conf` が上書きされてしまうらしい。

### 4-1-3. `/etc/resolv.conf` が削除されないように

ここまでの対策だけだと、 `/etc/resolv.conf` が毎回削除されてしまう。
その対策が以下の記事に掲載されていた。

https://zenn.dev/frog/articles/9ae2428be2825a

> ```bash
> $ sudo chattr +i /etc/resolv.conf
> ```

こうしておくと、 wsl を再起動しても `/etc/resolv.conf` が削除されなくて済む。


## 4-2. docker hub の認証を有効化

git clone のエラーの場合は関係ないが、 docker build などでエラーが出た時は、こちらが原因の可能性もある。

```bash
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yourname
Password: 
Login Succeeded
```

これで build が通ったりもした。


# 5. 関連記事

wsl ネットワークエラーの解決策は以下のgithub issueから見つけた。

https://github.com/docker/cli/issues/2618

https://github.com/microsoft/WSL/issues/6016#issuecomment-702754294


もう少し詳しい情報が以下の記事で解説されていた（2023/05/04追記）

https://qiita.com/kkato233/items/1fc71bde5a6d94f1b982

docker の認証切れに関してはこちらに記載あり。

https://kawadev.net/error-wsl2-docker-desktop-pull/

`/etc/resolv.conf` が削除される問題についてはこちらの記事に記載がありました。

https://zenn.dev/frog/articles/9ae2428be2825a