※スマホ対応はしてません。

タグ: WSL

WSL 2でCannot connect to the Docker daemonと言われたら、デフォルトを確認する。

カテゴリー: サーバー

デフォルトの、なに、ディストロ?を確認してバージョンが WSL 2 になってなかったらそれが原因ぽい。

先にまとめ

  • WSL2 + Docker
  • docker run … でエラー: “Cannot connect to the Docker daemon at unix:///var/run/docker.sock”
  • 対象の WSL2 のディストロをデフォルトに設定して再起動
  • 同様のエラーは様々な原因がありそうなので、これで解決しないかも

状況

Windows 10 はこう。

>wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu                 Running         1
  docker-desktop         Running         2
  Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2

(ここで VERSION が 2 になってないのが駄目だったぽい。)

Windows 側からなら Docker は普通に動く。

>docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
…

使いたい WSL2 ディストロ (Ubuntu-20.04) はこう。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
$ docker --version
Docker version 19.03.11, build 42e35e61f3

で、docker run でエラーになる。

$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.

--set-default デフォルト設定して解決

目的のディストロをデフォルトに設定する。

Win10 側のターミナルでこれだけ。

>wsl --set-default Ubuntu-20.04

デフォルト “*” で選択されているものの VERSION が 2 になってることを確認。

>wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  Ubuntu                 Running         1
  docker-desktop         Running         2
  docker-desktop-data    Running         2

WSL インスタンスをいったん終了。(これいらないかも?)

>wsl --terminate Ubuntu-20.04

ここで Docker を再起動する。Windows タスクバーのアイコンを右クリックして “Restart” を選択。しばらく待つ。

Docker が起動したら、WSL2 へログインして docker run をまた実行。

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
…

やったー

おしまい

VM である WSL2 の中から VM 的な存在である Docker コンポーネントを起動できないのは当たり前だと思って諦めてたんだけど、実はそうでもなかった……。

たまたま docker --help 眺めててデフォルトってのがあるぞと気付けて良かった。

今回は WSL 1 から使っていた環境をそのまま残して別途 WSL 2 用にインスタンスを用意したんだけど、普通は変換して使うとか今なら最初から 2 だけ入れるとかになると思うので、引っかかるひとあんまりいないんじゃないかと思います。

WSL 1 を残す必要のない方は変換してください。こちらをどうぞ。

この↑記事にもあるように「デフォルトのバージョン」という設定もあるので混同しないようにご注意ください。

ところでデフォルト設定が必要ってことは、複数の WSL 2 ディストロと Docker の組み合わせはだめなのかな。未確認。そんなことするひといなさそうだけど。

WSL2をインストールしてDocker使ったりUbuntuを変換したり戻したりした。

カテゴリー: 開発環境

これまでも WSL を愛用していたんだけどいよいよ WSL 2 が来たようなので、入れてみました。そんで戻しました。

ちなみに WSL の 1 と 2 はそれぞれ長所短所ある別の仕組みであるらしく、同じ Windows 機に同時にインストールできるみたいです。Docker 使うなら 2 が必要。

本記事の内容

  • WSL 1 を利用中が前提
  • WSL 1 の環境を 2 へ変換する
  • WSL 2 の環境を 1 へ戻す
  • デフォルトで 1 で使うか 2 で使うかの設定
  • Docker は Docker Desktop を使うよ

Windows Terminal

本件とは直接関係ないんだけど、すっげー便利なのでおすすめです。このアプリひとつで Power Shell もコマンドプロンプトも、ついでに WSL で動いてる Linux シェルも開けます。

WSL 2 の用意

Windows バージョンの確認

Windows の設定 (Win+I) → System → About → Windows Specifications を開いて、”Version” の項を確認してください。(最初から version とかで検索しても出てくるはず。) これが最新の 2004 (かそれ以上)である必要があります。

まだなら Windows を更新

OS の Windows Update の画面から更新を何度確認しても降ってこなかったので(そういうものなの?)、インストーラーを探してインストールしました。こちらから。

URL 的に将来再利用されそうだけれど、現時点では最新版 “Windows 10 May 2020 Update” がダウンロードできます。このファイル自体はダウンローダー?なので一瞬で終わるんだけど、それを起動して更新をダウンロード、インストールするのに 30 分くらいかかりました。ほげえ。

なお最新の状態でこのインストーラーを起動しても「今最新版だよ~」と教えてくれるだけなので無害です。

ただし人によってはこれでインストールできない場合もあるらしい。どういうんだろう。

Virtual Machine Platform を有効化

管理者権限で PowerShell を開き、以下を実行します。

> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

1 分くらい?

カーネルをインストール

この “Download the Linux kernel update package” の節から wsl_update_x64.msi をダウンロード、実行。

Windows Subsystem for Linux Update Setup のウィンドウ

更新はウィザードでぽちぽちするだけ。

WSL 2 を使う

(任意)デフォルトで WSL 2 を利用するように

WSL 1 と 2 を併用できます。Microsoft Store とかでダウンロードした Linux ディストロをインストールするときの初期値をそのどちらにするか設定できるようです。

2 にするなら、こう。

> wsl --set-default-version 2
For information on key differences with WSL 2 please visit https://aka.ms/wsl2

利用中の WSL 1 を 2 へ変換

一覧から名前を得て、その名前を対象に更新します。

まずは一覧を表示して、名前を得ます。この例では “Ubuntu” ですね。

> wsl --list --verbose
NAME STATE VERSION
* Ubuntu Stopped 1

この名前 “Ubuntu” を覚えておく。

続いて --set-version します。

> wsl --set-version Ubuntu 2
Conversion in progress, this may take a few minutes...
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
…

数分かかるとのことだが 60 分経っても終わりませんでした。ま、まただましたな!

完了したらバージョンが上がったのを確認。

> wsl --list --verbose
NAME STATE VERSION
* Ubuntu Running 2

使う

あとは普通に使うだけ。やったね。

やっぱり戻す

WSL 側から Windows 側ファイルの監視があやしい。

/mnt/c/User/ginpei 下にプロジェクト配置してるんだけど、どうも watch が怪しい感じがする。かつて普通の VM (VirtualBox) を使ってた頃も同じような問題に直面したような。

新機能は別途試すとして、やっぱり今の環境はそのまま残しておこう……ということにしました。残念。

バージョンをまた変える

さっき WSL 1 → 2 にしたのと同じ手順で 2 → 1 へ変換します。

> wsl --set-version Ubuntu 1

はいこれで元通り。こっちの変換の方が所要時間が少ない様子。

変換にかかる時間

対象は新規にダウンロード、インストールした空っぽの Ubuntu 20.04 LTS です。空っぽだと変換が速いみたい。

WSL のデフォルトを WSL 2 にしているので、2 → 1 → 2 の順番に変換してます。

2 → 1

1 分。

> Measure-Command { wsl --set-version Ubuntu-20.04 1 }

Days : 0
Hours : 0
Minutes : 0
Seconds : 49
Milliseconds : 284
Ticks : 492840008
TotalDays : 0.000570416675925926
TotalHours : 0.0136900002222222
TotalMinutes : 0.821400013333333
TotalSeconds : 49.2840008
TotalMilliseconds : 49284.0008

1 → 2

4 分。

> Measure-Command { wsl --set-version Ubuntu-20.04 2 }

Days : 0
Hours : 0
Minutes : 3
Seconds : 42
Milliseconds : 670
Ticks : 2226708369
TotalDays : 0.00257720876041667
TotalHours : 0.06185301025
TotalMinutes : 3.711180615
TotalSeconds : 222.6708369
TotalMilliseconds : 222670.8369

WSL 1 vs 2

表を翻訳して転載。

機能 WSL 1 WSL 2
Windows と Linux の統合
高速起動
省サイズ
Managed VM
完全な Linux カーネル
完全なシステムコール互換性
現行版の VM Ware や VirtualBox と併用
OS のファイルシステム越しのパフォーマンス

(Managed VM って何? 本当の VM だよって意味?)

感覚的には、こんな感じ↓かなと思ってます。正しいですか?

  • WSL 1 は Windows のまま Linux のコマンドを動かす(Cygwin や MinGW みたいな)
  • WSL 2 は Windows とは別に Linux VM を動かす(VM Ware や VirtualBox みたいな)
  • あと、 2 は Windows 10 Home でも使える

Docker

動くようになりました。Windows 側に Docker をインストールする必要があります。

Docker がサポートしたのは WSL2 上の Linux ではなく「WSL2 バックエンド」だそうで、つまり Docker Desktop for Windows を経由してコンテナーを WSL2 の仕組みで実行させる、というものであるらしい。……これで合ってる?

Docker を使う流れ

なので、こんな流れ。

  1. WSL2 準備(本稿)
  2. Docker Desktop インストール
  3. WSL 2 のインスタンスから docker run hello-world

さっくり動きました。

エラー

管理者権限が必要

Power Shell なり何なりを普通に起動すると、権限を elevate してねと言われます。管理者権限で起動してください。

>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Error: 740

Elevated permissions are required to run DISM.
Use an elevated command prompt to complete these tasks.

不明なオプション

メモ取り忘れたんだけど、WSL 2 の準備が終わってないと --set-version とか諸々が使えません。( wsl コマンド自体は存在する。)

順にやっていきましょう。

カーネルが古い

「不明なオプション」と同じ。まだ WSL 2 の準備が終わってません。『カーネルをインストール』の節を参照。

> wsl --set-default-version 2
WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel

Docker が使えない

WSL 全体の設定で、WSL 2 のディストロをデフォルトに設定しないといけないようです。はまった。

以下 Ubuntu で試したもの。

$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.

Docker デーモンが動いてない? じゃあ動かそう。

$ sudo systemctl start docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

このエラー見たことある……。

おしまい

仕事は引き続き WSL 1 でやることにします。

とはいえ Docker 使ってやっていきをしたいところ。ファイル監視はな~どうしたら良いかな、気のせいであってほしいけど。

参考

更新履歴

  • 2020/11/24
  • Docker が動かないと思ってたけど動いてたので更新
  • WordPress のエディターが替わって編集がうまくやれない
  • 2020/06/15 17:22
  • 初版公開