コード

Docker for Windowsでファイルやフォルダを共有する方法

最近巷で流行りのDocker for Windowsを使ってandroidアプリのビルド環境を作りました。

androidアプリをビルドするためにSDKやNDKが必要ですが、拡張と保守の観点からそれぞれのバージョンが異なるビルド環境が必要になるケースがあります。

SDKのバージョン毎にPCを買って環境を構築するお金があるはずもなく、かといって手作業で必要なファイルをインストールして環境を再構築するのも面倒で絶対嫌だとアレルギー反応が出ました。

そこでDocker for Windowsの登場です。

  • Docker for Windowsのインストール手順
  • Docker for Windowsを使ってWindows上のファイルやフォルダをコンテナ側と共有する方法

環境構築方法とハマった時の対処方法をまとめました。

下準備

実施環境

  • OS:Windows10 Enterprise 1709
  • CPU:Inter®︎ Core(TM) i5-7200 CPU @ 2.50GHz
  • RAM:8GB
  • Docker Desktop for Windows :v18.09.2をインストールする
  • コンテナのイメージ:ubuntu16.04
  • WindowのC:/tempとコンテナの/dataを共有する

Docker for WindowsはHyper-Vを利用します。Windows10のPro以上でHyper-Vがサポートされています。

セットアップ

  • CPU仮想化が有効であること。タスクマネージャ>パフォーマンス>CPU仮想化で確認。
  • Hyper-Vの有効化にチェックを入れて再起動。

Hyper-Vの有効化は以下の手順で確認できます。

Windowsマーク上で右クリック>アプリと機能>プログラムと機能>Windowsの機能と有効化または無効化 > 「Hyper-V」にチェックを入れる。

Docker for Windowsのインストール

公式ページより最新版のDocker for Windowsをダウンロードします。

Install Docker Desktop for Windows

上記リンク先ページの「Download form Docker Hub」ボタンをクリックします。

Please Login to Downloadボタンをクリックします。アカウントログインを求められるので、アカウントを持っていなければ作成します。

アカウント作成後にメールが送られてくるので認証します。すると、Docker for Windowsがダウンロードできるようになります。Get Docker!

ダウンロードした「Docker for Windows Installer.exe」を実行してインストールします。途中で聞かれる「Configuration」はデフォルトのまま「OK」を選択します。後ほど変更します。

インストールが完了すると自動的にログアウトします。

再ログイン後、PowerShellを起動します。PowerShellはスタートメニューの「Windows PowerShell」から起動できます。

PowerShell上で以下コマンドを入力します。正しくインストールでされていればDockerのバージョン情報が表示されます。

PS C:¥> docker -v
Docker Version 18.09.2, build 6247962 ← バージョン情報が表示される

ファイルやフォルダを共有する(マウント)

Ubuntu16.04のイメージを取得してDockerを起動させます。

Dockerを起動するホスト側(今回の環境でいうWindows)とコンテナ側(Ubuntu)でファイルやフォルダを共有するためには-vオプションをつけます。

PS C:\> docker pull ubuntu:16.04
PS C:\> docker run -v C:/temp:/data -it ubuntu /bin/bash

が、ubuntu上からは見えませんでした。はてさて。

Shared Drivesのチェックが入らない

タスクトレイのDockerアイコンを右クリック > Settings… > Shared Drivesで共有したいCドライブのチェックをクリックするも、設定中のまま待てども有効にならない。

WorkstationサービスとServerサービスを有効にする。

Windows におけるファイル共有は「共有リソースへのアクセスを要求するクライアント (ワークステーション)」と「その要求を受け付けて処理を行うサーバー」で構成されており、それぞれ「Workstationサービス」と「Server サービス」という名前のサービスがその役割を担っているそうです。

Windowsキー>WIndows管理ツール>サービスを選択し、「Workstaion」と「Server」の状態が「実行中」になっているかを確認します。私の環境では「Serverサービス」が停止していたので、自動(遅延開始)に切り替えて再起動しました。

参考:ファイル共有の仕組み – Server サービスと Workstation サービス –

共有できた!

再度Dockerを起動させてubuntu側から/dataを見てみると、C:/tempフォルダ以下が見えるようになっていました。

これでホスト側にあるソースコードのリポジトリを指定してあげれば、Dockerからも同じように参照できるようになりました。めでたしめでたし。

ファイルやフォルダが共有できない現象時のその他の対応法

調べてみるとShared Drivesのチェックを入力してApplyはできるが、その後にチェックが外れてしまうという現象もあるようです。

その場合はファクトリーリセット後にShared Drivesの設定を行うことで回避できるそうです。

参考:Docker for Windows で Shared Drives のチェックが入らない

-コード
-