WSL2(Ubuntu)でdocker daemonが起動しない場合の対処法


### *環境*

- WSL2
- Ubuntu
- Docker version 26.0.0　以下の埋め込みを参考にインストール済

[Ubuntu 20.04へのDockerのインストールおよび使用方法  | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja)


### *結論*
以下のコマンドを実行して解決した。
```bash
$ sudo usermod -aG docker $USER
$ sudo service docker start

$ sudo systemctl start nftables
$ sudo systemctl enable nftables
$ sudo service docker start
```
しかしこれだけでクリティカルに解決したわけではないので詳細は以下を参考にしてください。

### 現状

```bash
$ sudo docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

$ sudo service docker start
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.

$ sudo service docker status
× docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2024-03-27 11:30:07 JST; 1min 28s ago
TriggeredBy: × docker.socket
       Docs: https://docs.docker.com
    Process: 6762 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/F>
   Main PID: 6762 (code=exited, status=1/FAILURE)
 
```

### 解決策(1)

```bash
$ sudo usermod -aG docker $USER
$ sudo service docker start
```

### 結果(1)

```bash
$ sudo service docker status
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: activating (start) since Wed 2024-03-27 11:47:44 JST; 36ms ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2597 (dockerd)
      Tasks: 9
     Memory: 20.5M
     CGroup: /system.slice/docker.service
             └─2597 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
```

### 解説(1)

[**Linux**](https://www.geeksforgeeks.org/introduction-to-linux-operating-system/)システムでは、コマンドを実行するユーザーは、Docker デーモンに接続する docker グループのメンバーである必要があったがそうでなかった。そのため、 usermod -aG docker $USERコマンドで現在のユーザーをdockerグループに入れることで解決できた。

しかしこの後、またinactive状態になってしまったので、再度原因確認をした。

### 現状(2)

```bash
$ sudo dockerd --debug
（省略）
DEBU[2024-03-27T12:26:20.624543879+09:00] unmounting daemon root                        mountpoint=/var/lib/docker
failed to start daemon: Error initializing network controller: error creating default "bridge" network: Failed to program NAT chain: COMMAND_FAILED: 'python-nftables' failed: internal:0:0-0: Error: Could not process rule: No such file or directory

$ dpkg -l | grep nftables
ii  libnftables1:amd64            1.0.2-1ubuntu3                          amd64        Netfilter nftables high level userspace API library
ii  libnftnl11:amd64              1.2.1-1build1                           amd64        Netfilter nftables userspace API library
ii  nftables                      1.0.2-1ubuntu3                          amd64        Program to control packet filtering rules by Netfilter project

$ sudo systemctl status nftables
○ nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:nft(8)
             http://wiki.nftables.org
```

### 解決策(2)

```bash
$ sudo systemctl start nftables

$ sudo systemctl enable nftables
Created symlink /etc/systemd/system/sysinit.target.wants/nftables.service → /lib/systemd/system/nftables.service.

$ sudo service docker start
```

### 結果(2)

```bash
$ sudo systemctl status nftables
● nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2024-03-27 12:31:29 JST; 6min ago
       Docs: man:nft(8)
             http://wiki.nftables.org
   Main PID: 13792 (code=exited, status=0/SUCCESS)

Mar 27 12:31:29 IBM-PF44YKZS systemd[1]: Starting nftables...
Mar 27 12:31:29 IBM-PF44YKZS systemd[1]: Finished nftables.

$ sudo service docker status
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-03-27 12:39:45 JST; 2s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 15765 (dockerd)
      Tasks: 11
     Memory: 37.4M
     CGroup: /system.slice/docker.service
             └─15765 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
```

### 解説

debug結果によると、デフォルトの「bridge」ネットワークを作成する過程でNATチェーンのプログラミングに失敗し、「python-**nftables**」が原因でエラーが発生していたらしい。

**`No such file or directory`**のエラーは、通常、必要なファイルやディレクトリが見つからない場合に表示されるとのこと。

したがって、systemctl start **nftables** で解決した。

### 参考

[How to Resolve the "cannot connect to the Docker daemon" Error](https://phoenixnap.com/kb/cannot-connect-to-the-docker-daemon-error)

[How to fix “cannot connect to the Docker daemon” Error - GeeksforGeeks](https://www.geeksforgeeks.org/how-to-fix-cannot-connect-to-the-docker-daemon-error/)