新しいマシンに、WSL2/Ubuntu20.04 をインストールして、docker を起動するとエラーは出ないけど、起動しない。
おかしいなと思って、sudo dockerd
で起動してみると下記のエラーが出ていた
WARN[2021-08-05T14:59:17.371395300-07:00] grpc: addrConn.createTransport failed to connect to {unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial unix:///var/run/docker/containerd/containerd.sock: timeout". Reconnecting... module=grpc
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.8.4 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
これは、2つの理由で起こっているっぽい。Dockerが想定するIPテーブルがこのバージョンのOSでサポートされていないので、設定を変更するひつようがある。
$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
$ sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/sbin/iptables-legacy 20 auto mode
* 1 /usr/sbin/iptables-legacy 20 manual mode
2 /usr/sbin/iptables-nft 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
しかしこれを実施しても、権限がないとおこられてしまう。私は、まずdockerをBridgeモードで起動する。下記のファイルを書き換えると、IPテーブルを無効にして、Bridgeで上がるようになる。ただし、それも権限不足でうまくいかない。
/etc/docker$ cat daemon.json
{
"iptables": false
}
どうするかというと、コマンドプロンプトをアドミンモードで起動してそこで、WSL2を起動する。具体的にはbashコマンドで起動する。そこで、sudo dockerd
を実行すればよい。
すると、Bridgeが作られる。権限がWindows側というのが驚きだが、もしかすると、Bridgeモードでなくても、iptable でも設定を変えて、Windows側のAdminモードで実行すればよかったのかもしれない。最初の1回の初期化の際のみ必要なので、2回目以降の起動では必要ないみたい。
Resource