Windows Subsystem for Linux(WSL)上でDockerを動作させる
Dockerを使ってみようかなと思い立ち、今やるなら「Windows Subsystem for Linux(WSL)上で動かそう」と意気込んだものの、いろいろはまったので備忘録を残しておきます。
動作させるための手順だけ残そうか迷いましたが、はまった箇所も残しておこうかと。
さくっと動かしたい方は「Docker 17.09.0 を再インストール」以降から読んでもらえれば大丈夫です。
インストール
「Get Docker CE for Ubuntu」に書かれている通りに、リポジトリセットアップをごにょごにょやって最後に docker-ce で apt-get する。
# apt-get install apt-transport-https ca-certificates curl software-properties-common # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # apt-get install docker-ce
バージョン表示されればインストールOK。
# docker version Client: Version: 18.06.1-ce API version: 1.38 Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:24:51 2018 OS/Arch: linux/amd64 Experimental: false Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Docker Engine の起動
今回 Windows Subsystem for Linux(WSL) に Docker をインストールしたわけですが、普通にやると Docker Engine が動作しないらしく
Webを調べてみるとどうやら下記の手順を踏む必要があるみたいです。
# apt update # apt upgrade -y # apt install -y docker.io # cgroupfs-mount # usermod -aG docker $USER # service docker start
一度、WSLを抜けて管理者権限で再度起動して service コマンドで Docker を起動する。
# cgroupfs-mount # service docker start
「 * Docker is running 」って出たら無事起動完了。
# service docker status
* Docker is running
hello-world イメージの実行
ここまできたわけですが、hello-worldイメージを動作させようとしても、下記のエラーが出てできません。
# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Extracting [==================================================>] 977B/977B docker: failed to register layer: Error processing tar file(exit status 1): invalid argument. See 'docker run --help'.
これも調べてみると次の情報を提供してくれている方がおりまして、WSLではどうも Docker 17.09.1 以降バージョンは(現状)動作しないようです。
Docker 17.09.0 を再インストール
というわけで Docker 17.09.0 を再インストールしてやってみるとようやく動きました。
# apt-get purge docker-ce # curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb # dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb # docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:42:09 2017 OS/Arch: linux/amd64 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? # service docker start
# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest 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/
「Hello from Docker!」と出てて、とりあえず無事コンテナが動作したようです。
なお、ダウンロードしたイメージ、実行したコンテナはそれぞれdocker image ls、docker ps -aで確認可能です。
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 6 weeks ago 1.84kB ★hello-world image # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4033ff160c8b hello-world "/hello" 19 seconds ago Exited (0) 12 seconds ago youthful_boyd ★イメージから実行されたコンテナ 5536f7632792 hello-world "/hello" 14 minutes ago Exited (0) 14 minutes ago happy_mcnulty
hello-world イメージから2度コンテナを実行したので、docker ps -a の方は2行出力されています。
上記からわかる通り、一つのイメージからいくつもコンテナを作成することが可能となります(イメージは初回実行時のローカルになければダウンロード(pull)してきてくれるみたいです。次回以降はpullしたイメージを利用する)。
hello-worldは実行後すぐに終了するため、STATUS は Exited になってます。
終了したコンテナを削除するには、docker rmで。
指定したコンテナID「4033ff160c8b」のコンテナが削除されていることが確認できます。
# docker rm 4033ff160c8b 4033ff160c8b docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5536f7632792 hello-world "/hello" 27 minutes ago Exited (0) 27 minutes ago happy_mcnulty
次のように書いてあげると終了したコンテナをまとめて削除することができます。
# docker rm 'docker ps -aq'
今回はこんなところで。次は CentOS のイメージからコンテナ起動してコンテナないでパッケージインストールしたりしてみたいと思います。
以上です。