Windows Tips

WSL の docker client から、Docker for Windows の docker daemon を使う手順

投稿日:2018年7月19日 更新日:

Windows 10 Pro (Hyper-V) で、WSL から Docker を使う環境を構築する手順について説明します。

前提とする知識

1. Docker とは?

まず、Docker についてですが、ウィキペディアでは以下のように説明されています。

Docker(ドッカー)はコンテナ型の仮想化環境を提供するオープンソースソフトウェアである。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境 (インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つ。

引用元:Docker – Wikipedia

簡単に言ってしまうと、Docker は「ものすごく軽い仮想化環境構築ソフトウェア」です。Linux の仮想化技術を利用することで、必要なディスク使用量は小さく動作も軽いというメリットを生んでいます。

この「手軽な仮想化」が思った以上に便利であることが分かり、どんどん用途が広がって爆発的に普及しました。

Docker の思想

Docker では、「1つの仮想環境を作り、その中でいろいろなアプリケーションをインストールして使う」というよりは、

1つのアプリケーションに1つのDockerコンテナを作る。
使いたいアプリケーションが複数ある場合は、Dockerコンテナを連携させる。

という使い方をします(Docker では「Dockerコンテナ」という単位で仮想環境を作ります)。「軽い」から、こういう使い方ができるのです。「ある特定のアプリケーションが動くLinux環境」がコマンド一発でちょっと待てばできてしまいます。

実際の感覚としては、「動かしたい特定のアプリケーションをそのままホスト環境にインストールして使うのではなく、Docker コンテナという入れ物の中に入れて使う。そうすれば、ホスト環境から隔離した状態のまま使えて便利。」という感覚です。

この利便性の高さによって様々な用途が生まれ、新たなエコシステムが形成されました。

新たなエコシステム

例えば、 この Dockerコンテナの雛形となるデータは「イメージ」として誰でも作成できるのですが、Docker Hubなどのウェブサイトでは、このイメージをアップロード・ダウンロードすることができます。このイメージの名前を指定して docker コマンドを実行すれば、自動的にイメージをダウンロードしてくれ、これを元にコンテナを生成することができます。

今では、様々な有名アプリケーションが Docker 用イメージを公式に提供しています。Docker はアプリケーションを実行するための新たな基盤となっているのです。

Docker の利点

Dockerコンテナでアプリケーションを実行する利点の1つは、「既存の環境(= ホスト側の環境)は全く汚れない」ことです。使い終わってDockerコンテナを消してしまえば、跡形も残りません。

次に「毎回、全く同じ内容の環境が作れる」ことです。決まったイメージから作成されるDockerコンテナは常に同じものです。そこは、「どこか前回と違うのではないか?」などと心配する必要はありません。

一時的にアプリケーションを試すのに最適

何かのアプリケーションを試しに使ってみたいときも便利です。

「Aというアプリケーションを試してみたいけれど、そのためにはアプリケーションB とアプリケーションC が必要だからインストールや設定が面倒。しかも、メリットを感じないアプリケーションだったら、すべて完全に削除したい。」といった場合です。

こんなときに Docker を使えば、必要なアプリケーションを入れたコンテナをそれぞれ作って試せます。試し終われば、きれいに削除できます。

開発やテストにも最適

ソフトウェア開発やテストに必要な環境も手軽に作成できます。他の仮想化技術とは「手軽さ」が圧倒的に違います。

サーバーアプリケーションの実行環境としても便利

サーバーアプリケーションの環境をイメージとして作成しておけば、何かトラブルが起こった場合でも、簡単に新たな環境を用意することができます。各サーバーアプリケーション毎に別々のイメージとして管理できるのも魅力的です。

広がる可能性

こうなると、「どんなアプリケーションでもコンテナに入れて使えば便利になるのではないか?」とさえ思えてきます。パラダイムシフトが起こったような感覚です。

実際は、Docker によって得られるメリット・デメリット、ローカル環境に必要なソフトウェアをそのままインストールして使うメリット・デメリットを比較してどちらにするか決めることになります。アプリケーションの特性や使う目的によってどちらを選ぶか変わるでしょう。

Docker のアーキテクチャ

ここで少しだけ Docker のアーキテクチャについて説明します。

以下のアーキテクチャの図は、Docker overview | Docker Documentation からの引用です。赤枠などは後から追加してあります。

Docker のアーキテクチャ
(引用元:Docker overview | Docker Documentation

ここにあるように、Docker は サーバークライアントに分かれて動作します。「イメージ」や「Dockerコンテナ」はサーバー上に配置され、クライアント側から送られる docker コマンドによって操作されます。サーバーとクライアントは同じホスト上にあってもよいですし、別々のホストにあっても問題ありません。

2. Docker for Windows とは?

Docker は Linux の技術を利用していますが、Windows 上で Docker を利用するために Docker For Windows というソフトウェアが用意されています。

Docker For Windows は、Windows 10 Professional か Enterprise で 64bit版でないと使えません。これらでないと、Hyper-V という Microsoft の仮想化技術が使えないからです。それ以外の Windows には、Docker Toolbox というツールが提供されていますが、本記事では扱いません。

Windows 10 Home をお使いの方へ

Windows 10 Home で Docker を利用する場合(特にWSLから使う場合)の導入方法については、以下のページを参考にしてください。

docker

Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法

2018.07.20

Docker for Windows の仕組み

Linux の技術を使う Docker が、どうして Windows 10 で使えるのでしょうか?

それは、Docker for Windows では、Windows 10 に用意された Hyper-V という仮想化技術を利用して Linuxの仮想マシンを作り、その中に Docker のソフトウェアを導入して利用するからなのです。

以下のスクリーンショットのように、Hyper-V マネージャーを開いてみると、仮想マシンが作成されていることが分かります。

3. WSL とは?

WSL とは、Windows Subsystem for Linux の略で、Windows 10 上で Linux を動かす仕組みです。

Microsoft Store 上で “WSL” と検索すると、導入できる Linux ディストリビューションがいくつも見付かります。

WSL で Linux ディストリビューションを導入すると、以下のように Linux の操作が実行できるようになります。

具体的な導入方法については、以下の記事を参考にしてください。

Windows

WSL のシンプルな導入手順(2019年1月版)

2018.05.25
Windows

WSL (Windows Subsystem for Linux) の導入と設定

2017.07.12

4. 本ページで目標とする構成・使い方

通常、Docker for Windows を導入した場合、PowerShell を使って docker コマンドを実行することになると思います。

PowerShell

しかし、本ページでは、WSL のターミナル上から docker コマンドを実行することを目標とします。

WSL (Cmderを使用)

以下のような構成です。

サーバー:Docker for Windows により、Hyper-V を利用して作成された仮想マシン
クライアント:WSL を利用してインストールされた Linuxディストリビューション

全体像を図にすると以下のようになります。

MobyLinuxVM は、Docker for Windows によって作成される仮想マシンです。この中に、Docker がインストールされており、docker daemon サービスが稼働します。

Ubuntu は、WSL 用に Microsoft Store からインストールした Linux ディストリビューションです。こちらの Linux 内では、Linux用の docker パッケージをインストールします。本来はこちらも docker daemon として利用することもできるはずなのですが、WSL 環境ではサポートされていないようです。ですので、クライアントとしてのみ利用します。

注意点

「Docker for Windows を使わなくても、WSL で入れた Ubuntu 内にインストールした Docker で、そのまま docker daemon も動く」という情報が出回っています。しかし、この方法は WSL を管理者権限で実行したり、それによるマイナス面もありますので、現時点では素直に Docker for Windows を使った方が安全であると判断しました。

ネタ元は、この書き込みだそうです。→ docker is running natively on wsl : bashonubuntuonwindows

導入作業

1. 前提条件

WSL を利用した Linuxディストリビューションの導入が既に済んでいることを前提とします。特に本ページでは、Microsoft Store にある Ubuntu を導入した場合を想定しています。

繰り返しになりますが、具体的な導入方法については、以下の記事を参考にしてください。

Windows

WSL のシンプルな導入手順(2019年1月版)

2018.05.25
Windows

WSL (Windows Subsystem for Linux) の導入と設定

2017.07.12

2. Hyper-V を有効にする

まず、Hyper-V を有効にする必要があります。

(1) スタートメニューを開き、”windows の機能” と入力すると「Windows の機能の有効化または無効化」が表示されますのでクリックして実行します。

(2) 「Hyper-V」にチェックを入れます。

(3) 「OK」ボタンをクリックすると、Windows の再起動を促されますので従います。何か他のアプリケーションで作業中なら、そちらを保存して終了させてから再起動します。

(4) Windows が起動したら、[コントロールパネル] – [管理ツール] の中に、「Hyper-V クイック作成」「Hyper-V マネージャー」という項目が追加されています。

※ Windows 10 Home の場合、Hyper-V はありません。

VirtualBox を使っている方へ

Hyper-V を有効にすると VirtualBox が使えなくなります。

実際に、Hyper-V を有効にしたまま VirtualBox による仮想マシンを起動すると、以下のエラーが発生します。

VirtualBox を使いたい場合は Hyper-V を無効に戻しておきましょう。

3. Docker for Windows をインストールする

Docker Store の以下のページから、「Docker Community Edition for Windows」をダウンロードするのですが、Docker Store のアカウントがない場合は予め作成しておく必要があります。

アカウントを作ったら Docker Store にログインした上で、上記のページを開いて、Docker Community Edition for Windows をダウンロードします。

Docker for Windows Installer.exe」というファイルがダウンロードされますので、これをダブルクリックして実行します。

あとは、インストーラーの指示に従っていけばよいです。

途中、以下のように設定内容について聞かれますが、デフォルトのままでよいでしょう。

インストールが完了すると、以下のようなウィンドウが表示されます。

この中に書いてありますが、既に Docker daemon が動いています。

Hyper-V マネージャーを見れば、MobyLinuxVM という仮想マシンが作成されているのが分かるでしょう。

この仮想マシンのハードディスクイメージファイルは、C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.vhdx に配置されていました。これは、Hyper-V マネージャーから確認することができます。

動作確認

PowerShell を開いて、docker コマンドを実行してみましょう。

(例1)Docker のバージョンを表示する。

PS> docker version

(例2)Docker版 Hello, World を実行する。

PS> docker run hello-world

(例3)Ubuntu の環境を作り、ターミナルを実行する。

PS> docker run --interactive --tty ubuntu bash

基本的な操作

Docker が起動している間は、画面右下の通知領域にクジラのアイコンが常駐し、右クリックすることでいろいろな操作を行うことができます。

おまけ: WSL 側から docker.exe コマンドを実行してみる

ちなみに、Docker for Windows によってインストールされた docker.exe コマンドを、WSL上で実行するとまともに動作しません。

docker version くらいなら結果がちゃんと表示されますが、インタラクティブな操作を行うコマンドだとエラーになります。

docker.exe ファイルは、C:\Program Files\Docker\Docker\resources\bin に配置されています。

4. WSL 側に docker パッケージをインストールする

基本的には、Get Docker CE for Ubuntu | Docker Documentation に従うだけです。この参照先では apt-get コマンドが使われていますが、最近は代わりに apt コマンドを使いますので、ここでは aptコマンドを使った場合のコマンドを書いておきます。

(1) apt のパッケージインデックス情報を更新します。

$ sudo apt update

(2) この後の作業で必要となるツールをインストールしておきます。

$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

(3) Docker の公式 GPG鍵を追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

追加した鍵が改ざんされていないか確認します。

以下のコマンドを実行し、フィンガープリントとして 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 が出力されれば問題ありません。

$ sudo apt-key fingerprint 0EBFCD88

(4) 以下のコマンドを実行して、stable(安定した)なDocker用レポジトリを追加します。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu\
   $(lsb_release -cs) \
   stable"

(5) 新しくレポジトリを追加したので、再度 apt のパッケージインデックス情報を更新します。

$ sudo apt update

(6) 最新版の Docker CE をインストールします。

$ sudo apt install docker-ce

本ページ用に試した時には、ファイルサイズが合計 182MBありました。

docker-compose コマンドをインストールする

docker-compose コマンドもインストールしておきます。

この段階で、apt install docker-compose コマンドを実行してインストールすることもできるのですが、これだとかなり古いバージョンがインストールされてしまうため、Install Docker Compose | Docker Documentation で説明されている方法に従います。

(1) 以下のコマンドを実行し、docker-compose コマンドを直接 /usr/local/bin 以下に配置します。

$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
このコマンドにはバージョン番号が含まれています。Install Docker Compose にて最新のコマンドを確認してください。

(2) バーミッションを変更します。

マニュアルページでは、オプションが「+x」となっていますが、ここは「a+rx」として読み取り権限も追加しておくべきです。

$ sudo chmod a+rx /usr/local/bin/docker-compose

(3) docker-compose コマンドを実行してみます。

ここでは、バージョンを表示させています。

$ docker-compose --version

以下はオプションです(必須ではありません)。

(4) 次に、docker-compose コマンド引数の補完が聞くように、/etc/bash_completion.d/ 以下に補完スクリプトを配置します。

$ sudo curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
このコマンドにはバージョン番号が含まれています。ここでのバージョン番号は、(1)で実行したコマンドに合わせてください。
$(docker-compose version --short) の部分は、インストールされた docker-compose のバージョンに置き換えられます。

(5) こちらのファイルもパーミッションを変更しておきます。

$ sudo chmod a+r /etc/bash_completion.d/docker-compose

(6) すぐに補完を有効にするには、このスクリプトを直接読み込ませましょう。

$ source /etc/bash_completion.d/docker-compose

5. WSL から Docker for Windows を利用するための設定

(1) WSL側で実行する docker コマンドが、MobyLinuxVM 内の docker daemon を使うように設定します。

具体的には、~/.profile ファイルに以下を記述します。

export DOCKER_HOST="tcp://0.0.0.0:2375"

(2) Docker for Windows が、外部(この場合は WSL)からのアクセスを許可するように設定します。

通知領域の Dockerアイコンを右クリックして「Settings…」を開き、[General]タブ内にある「Expose daemon on tcp://localhost:2375 without TLS」にチェックを入れます。Docker が自動的に再起動して変更が反映されます。

Hyper-V を無効にしたい場合

VirtualBox を使う必要がある場合などには、Hyper-V を無効にする必要があります。

しかし、Docker For Windows がインストールされている状態で Hyper-V を無効にすると、Windows 起動時に以下のウィンドウが表示され、「Hyper-V を有効にするか」聞いてきます。
(Hyper-V を有効にするつもりがないなら [Cancel] を押します)

Hyper-V を有効にしますか?と聞いてきます
Hyper-V を有効にしますか?と聞いてきます

このウィンドウを表示させないようにするには、タスクマネージャーの [スタートアップ] タブ内で、Docker Desktop を無効にしましょう。

Docker Desktop を右クリックして無効にします
Docker Desktop を右クリックして無効にします

おわりに

Docker があれば、いろいろなアプリケーションを手軽に実行することができます。ソフトウェア関連の仕事をしている方にとっては、手放せないツールになるでしょう。この先、具体的な利用例も紹介する予定です。

参考情報

📂-Windows Tips

執筆者:labo


  1. ドムドム より:

    はじめまして。
    参考にさせていただいています。
    typoがありました。

    > (1) 以下のコマンドを実行し、docker-compose コマンドを直接 /usr/local/bin 以下に配置します。
    >
    >$ sudo curl -Lhttps://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

    誤)
    curl -Lhttps://git….

    正)
    curl -L https://git….

  2. ドムドム より:

    コピペして使わせていただいています。

    > (4) 次に、docker-compose コマンド引数の補完が聞くように、/etc/bash_completion.d/ 以下に補完スクリプトを配置します。

    > $ sudo curl ->Lhttps://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose-o /etc/bash_completion.d/docker-compose

    誤1)
    > sudo curl -Lhttps://ra……
    正1)
    > sudo curl -L https://ra……

    誤2)
    > …ash/docker-compose-o /etc/bash_completion.d/docker-compose
    正2)
    > …ash/docker-compose -o /etc/bash_completion.d/docker-compose

    インストール済みのバージョンを取得して指定する方法が、オフィシャルページにありました。ご参考までに。

    sudo curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version –short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

    参考:http://docs.docker.jp/compose/completion.html

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Windows

Windows 10 でスクリーンショットを撮る方法(キャプチャ機能)

Windows 10 においてスクリーンショットを撮る(キャプチャする)方法について説明します。

Windows

Windows Terminal についての情報

Windows Terminal アプリケーションについての情報を記載しています。

Windows 10 で「Web ブラウザ」の「既定のアプリ」を変更する方法

Windows 10 で「Web ブラウザ」の「既定のアプリ」を変更する手順を説明します。 [設定] – [システム] – [既定のアプリ] の画面で簡単に変更できそうですが、 …

ICTリテラシー

Windows、Mac (macOS) で通信量を確認する方法

目次1. はじめに2. Windows で通信量を確認する方法使い方メモ3. Mac (macOS) で通信量を確認する方法4. おわりに 1. はじめに 従量制で課金される環境でパソコンを使用する場 …

Windows

【Windows】重いアプリケーション(ソフトウェア)の優先度を低くして、他の作業を快適に行う

目次はじめにアプリケーションの優先度を落とす手順(1) タスクマネージャーを起動する(2) 重いアプリケーション(タスク)を探す(3) 目的のアプリケーション(タスク)の優先度を低くするまとめ はじめ …