Docker DesktopをWSLから使う場合、WSL1と2で使い方が違うので整理してみました。
なお以下の説明を作る際に使った環境は以下になります。
- ホストOS
- Windows11 21H2
- Docker Desktop version 4.14.1
- WSLのディストリビューション
- Ubuntu20.04
共通のDocker Desktopの設定
Docker DesktopのGUIを表示して
Settings(右上のほうの歯車を押すと出てくる画面)→Generalにある「Use the WSL 2 based engine」のチェックを入れます。
WSL1の場合は入れなくてもいいのですが極力設定を共通化するために入れておきます。
WSL1で使う場合
Docker Desktopの設定
Docker DesktopのGUIから
Settings→Generalにある「Expose daemon on tcp://localhost:2375 without TLS」のチェックを入れます。
Ubuntu側の設定
まずdockerコマンドをインストールします。
WSL1でインストールされているディストリビューションを起動して、コンソールから
$ sudo apt update
$ sudo apt install docker.io
としてdockerをインストールします。
パスの反映があるので一度ログインしなおして下さい。
このままだと
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
のように出てアクセスできません。
そこで
$ export DOCKER_HOST=tcp://localhost:2375
とすると
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コマンドが正しく返ってくるようになります。
適宜.bashrc等にDOCKER_HOSTの設定を入れておくとよいでしょう。
WSL2で使う場合
Docker Desktopの設定
同じくDocker DesktopのGUIから
Settings→Resources→WSL Integrationの設定画面で「Enable integration with my default WSL distro」にチェックを入れます。
これによってWSLでデフォルトに設定されているディストリビューションでdockerが自動的に有効になります。(ただしデフォルトがWSL1だと意味をなしません)
ちなみにデフォルトのディストリビューションとはPower Shellを起動して
> wsl -l -v
としたときに左端に*(アスタリスク)がついているディストリビューションのことで、
> wsl -s ディストリビューション名
とすることでデフォルトを変更できます。
また、先ほどの設定画面で「Enable integration with additional distros:」という項目の下にインストールされているディストリビューションのリストが出てきて左にスイッチがありますが、これをONにすることでもそのディストリビューションでdockerが使えるようになります。
※上図は「Ubuntu-18.04-2」と「Ubuntu-20.04v2」というWSL2のディストリビューションがインストールされている環境で「Ubuntu-20.04v2」のほうでdockerコマンドを使えるようにしたときの状態です。
Ubuntu側の設定
上記Docker Desktop側の設定だけでdockerコマンドは使えるようになります。
ただ一般ユーザーだとそのままでは権限の関係でdockerコマンドがエラーになってしまうため、普段使うUbuntu上のユーザーをdockerグループに属させる必要があります。
方法は(ユーザー名をpenguinsanとした場合)以下のコマンドを実行します。
$ sudo usermod -G docker penguinsan
※実行後グループを反映させるためにUbuntuにログインしなおしてください。
まとめ
上記を見ていくと実はWSL1とWSL2でDocker Desktopの設定自体がぶつかり合うことはありません。
なのでWSL1とWSL2のディストリビューションを両方インストールしている環境でも共存可能です。
注意が必要なのはWSL2の場合、環境変数DOCKER_HOSTの設定が必要ないことです。
もし設定されてしまっている場合はスクリプト上で設定している個所を削除するか、unset DOCKER_HOSTで環境変数を削除してください。