nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

Windows Subsystem for Linux(Hyper-Vなし)でDockerを動かす

Docker for Windowsは非常に便利なのですが、Hyper-V前提になっていることが多くの足かせを生んでいます。Hyper-VはCPUの仮想化支援機能を占有してしまうため、VMwareなどの他の仮想化ソフトウェアや、Intel HAXMを利用したAndroid Emulatorと同時に動かすことができません。

もちろん、切り替えれば(簡単に切り替える方法がありますが)良いのですが、PCの再起動が必要ですし、同時に動かしたい事もままあるはずです。

私も絶賛困っていたのですが、このツイートを見てDockerをHyper-Vなしで動かせることを知りました。

実際やってみたところ、少々はまり処もあったのでここに具体的な設定方法をまとめておきます。ただし、docker-composeはネットワーク絡みで、まだ正しく動かないようです。

参考文献:https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/

環境

  • Windows 10 Pro 1803(Home Editionでも動作するはずです)
  • Ubuntu 16.04 (18.04は試しましたが同じ方法では動きませんでした)

Ubuntuのインストール

Windows StoreでUbuntuを検索し、16.04をインストールします。

Ubuntuを管理者で起動する

管理者で起動する事は必須なので忘れないようにしましょう。

Dockerのインストールと環境設定

次のコマンドを実行してDockerをインストールして、環境を構築します。

sudo apt update
sudo apt upgrade -y
sudo apt install -y docker.io
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start

ここで一旦WSLを再起動します。再起動しないと以下のエラーがでて正しく動作しません(でした、私の環境では)。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

なんらかのプロセスを再起動すればよい気もしますが、私には特定不能なので再起動します。

Dockerを起動する

あらためてUbuntuを起動しますが、管理者権限で起動することを忘れないようにしましょう。

Ubuntuが起動したら、Dockerを起動します。

sudo cgroupfs-mount && sudo service docker start

都度cgroupfs-mountが必要になりますので気を付けてください。これで準備は完了です。実際に動作を確認してみましょう。

Dockerの動作確認

Hello, World.

まずはHello, Worldから。次のようにコマンドを実行します。

sudo docker run --rm hello-world

つぎのような実行結果が表示されれば成功です。

f:id:nuitsjp:20180709140239p:plain

Webサーバー

つづいて、次のように実行してみましょう。

sudo docker run -it --rm -p 8080:80 nginx:latest

そしてブラウザを開き、http://localhost:8080を開いてみましょう。つぎのように表示されたら成功です。

f:id:nuitsjp:20180709140438p:plain

Ubuntu起動時にDockerが起動している状態にする

~/.bashrcを編集する

~/.bashrcの文末に次の1行を追加します

cgroupfs-mount

起動時にDockerが自動起動するよう設定する

次のコマンドを実行します。

sudo systemctl enable docker

ログインして、次のコマンドを実行してみれば、設定が正しく行ったかどうかわかります。

sudo service docker status

docker-composeがまだ使えないなど、限定的ではありますがなんとなく将来に期待が持てそうですね。

以上です。