WSLでDockerを使う

基本的に以下の先人たちの内容をなぞっているだけですが、ちょっとハマりました。

  • WSLでdockerを実行する話

WSL環境構築まとめ
Windows Subsystem for Linux(Hyper-Vなし)でDockerを動かす
Windows10 HomeでDockerを利用できるようにするお話
どうしても Docker on Ubuntu 18.04 on WSL したかった

  • docker基礎

Docker入門 Hello world

ハマったポイント

まずWSLにdockerをインストールする話ですが、Win10のバージョンで違います。

winverコマンドで自分の環境を確認します。最新の1809と1803以下でインストールするdockerのバージョンが変わってきます。どうも最新のdockerで採用された機能が1803以下のWSLには対応してないようで、コンテナが起動できないエラーに遭遇します。

  • Windows10のバージョンが1803以下

winver-1803-1

古いdockerのパッケージを直接DLして手動でインストールする。(手間ではない)

  • Windows10のバージョンが1809

aptコマンドでdocker.ioをインストールする。

docker.ioはUbuntuが管理しているパッケージ名で、そうでないものがdocker-ce(docker-ee)で、docker-engineは古いバージョンの名前らしい。

docker-engine、docker-ce、docker.ioの違い

Win10 1803でDockerをインストール&Hello-worldコンテナを展開してみる

自身の環境が1803なので、こちらを試してみました。

Ubuntu17.09用のパッケージをDLしてインストールします。

> curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
> sudo dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb
> sudo usermod -aG docker $USER

以上。別に問題なくインストールされました。

次に管理者権限でWSLを起動して(これ重要)、dockerのデーモンを起動する必ずデーモン起動前にcgroupfs-mountも実行しておく。statusを確認してDocker is runningになっていればOK

順番間違えたり、試行錯誤してもダメなら一度Win10を再起動してやり直します。どうもデーモンが中途半端な状態で起動すると、リトライもできないようなので。

> sudo cgroupfs-mount
> sudo service docker start
> sudo service docker status
 * Docker is running

コンテナの実行にはWSLコンソールを管理者権限で実行する必要はないです。試しにhello-worldコンテナを実行して下記のように起動するはず。

> docker run hello-world

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Win10再起動したら、cgroupfs-mountとdockerのデーモン起動は管理者権限で実行しないといけないのでちょっと注意です。

ハマっていた時のログ

失敗していたときの状態もログとして残しておく。

  • ケース1

まず、1803のWSLで普通にdockerをインストールして実行したときのケース。hello-worldが実行できなかったが、そもそもdockerプロセスがちゃんとstartされてなかった。(最新dockerが1803のWSLに互換性がなかったのが原因)

> sudo apt install docker.io
> sudo cgroupfs-mount
> sudo usermod -aG docker $USER
> sudo service docker start
> 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'.

> sudo service docker status
* Docker is not running
  • ケース2

1803に対応しているdockerをインストールしてプロセスは起動したが、管理者権限でWSLコンソールを表示せずにプロセスを起動したのと、cgroupfs-mountを実行してなかったケース。(2つミスしていたが、どちらが原因かまでは特定してない)

hello-worldコンテナを展開するときに謎のエラーが表示される。

> sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Extracting     977B/977B
docker: failed to register layer: Error processing tar file(exit status 1): invalid argument.
See 'docker run --help'.

ちなみにWin版のdockerもある

上記はWSLではあるけど、Linux版のdockerをインストールしました。Win版もあるようですが、Hyper-Vを使うようなので、Windows10 Pro以上じゃないとできないっぽいです。

開発目的でちょこちょこ環境を切り替えるならWSLでも良いと思いますが、本格運用の場合はちゃんとLinuxサーバー建ててそこでやったほうが、余計なトラブルには遭遇しないはず。

Windows10 1809(Redstone5)にアップデートしてみる

redstone5のアップデートってできるのかな?とWindows Updateをクリックしたら、勝手にインストールが開始してしまった。。(やりたくない人は注意)

win10-1809

しばらくDLしたのちに再起動せよと言われて従うことに。。去年の秋にリリースしてからだいぶ経つので、トラブルはないことを祈ります。

再起動後、無事?1809にアップデートしていました。

winver-1809

最新のdockerをインストールして動作するか確認する。

まずは、1803時代にインストールしたWSLのままで、dockerだけ最新版をインストールして、動作するのかやってみる。

まず、前回インストールした前バージョンのdockerを削除します。

> dpkg -l | grep docker
ii  docker-ce                         17.09.0~ce-0~debian               amd64        Docker: the open-source application container engine

> sudo apt remove docker-ce
> sudo dpkg --purge docker-ce

最新版をインストールします。今回はaptコマンドから普通にインストールします。

> sudo apt install docker.io

省略しますが、結果はダメでした。。なんで?

-->