DockerホストをHyper-Vで作成するとフォルダの共有が難しい
zshの補完が優秀なためBash on Windows(BoW)上でdockerを使うために、docker-machineでWindowsのホスト上でDockerホストを立ち上げて、そこからTLSでBoWからアクセスしています。
そのままの状態でdocker run -v マウントしたいフォルダ:/マウント先
でマウントしようとしても、このコマンドはDockerホスト上のフォルダをマウントしようとするため、BoW上でもWindows上でもなく、Dockerホスト(boot2docker)上のフォルダをマウントしようとします。
VirtualBoxでは共有フォルダ機能を使用してどうにかこうにかできますが、Hyper-V上では一筋縄では行きません。
作業の流れ
作業の流れとしては、以下の流れになります。
- Windows上で対象のフォルダを共有フォルダにする
- boot2docker上で共有フォルダをマウントする
- dockerのコンテナを起動するときに、boot2dockerでマウントしたパスを指定して、マウントする
1.Windows上で対象のフォルダを共有フォルダにする
方法は色々ありますが、まずは対象のフォルダを共有フォルダにしましょう。
私は、対象のフォルダを右クリックしてフォルダのプロパティから、共有タブで共有フォルダに設定しました。
2.boot2docker上で共有フォルダをマウントする
boot2docker上でWindowsの共有フォルダをマウントしましょう。
しかしboot2dockerにはWindowsの共有フォルダをマウントするモジュールが標準で入っていないため、入れる必要があります。
必要なのは、cifs-utilsです。
2.1失敗したモジュールの入れ方
boot2dockerはTinyCoreLinuxをベースに作られているため、各種パッケージを入れるコマンドは、tce-load
になります。
Hyper-Vマネージャから対象のDockerホスト名のVMに接続しましょう。
パッケージをダウンロードしてインストールするオプションは-wi
のため、tce-load -wi cifs-utils
を実行すると、ルートで実行しないでね、と怒られるため、ユーザを作成するなりなんとかします。
既にdockerというユーザが作成されていたため、私はそれを流用しました。
dockerでログインして先ほどのtce-loadを叩くと、途中でコケます。
ログを見ると、
Downloading filesystems-4.4.84-boot2docker.tcz
のように、boot2docker専用のパッケージを途中で探しにいくようで、存在しないがために404 Not Foundを吐き出します。
ではどうするかというと、boot2dockerはTinyCoreLinuxのカスタムのため、ベースのTinyCoreLinuxのパッケージを入れます。
2.2成功したモジュールの入れ方
まず、ベースのTinyCoreLinuxのバージョンを調べます。
boot2dockerに接続したdockerからdocker info
を叩きましょう。
色々情報が出力されますが、次の行に注目します。
Operating System: Boot2Docker 17.07.0-ce (TCL 7.2); HEAD : 24e9d2f - Wed Aug 30 00:04:56 UTC 2017
OSType: linux
Architecture: x86_64
このTCL 7.2というのがTinyCoreLinuxのバージョンになります。アーキテクチャとバージョンだけ覚えましょう。
このバージョンとアーキテクチャから対象のパッケージを探します。
7.2のx86_64の場合次のURLにパッケージ一覧があります。
違うバージョンの場合URLを適宜置き換えてください。
ここからパッケージを探します。
cifs-utils.tcz.depに依存関係が書かれています。
最終的に、依存関係含めて2つのファイルをboot2docker上でダウンロードします。
- http://distro.ibiblio.org/tinycorelinux/7.x/x86_64/tcz/samba-libs.tcz
- http://distro.ibiblio.org/tinycorelinux/7.x/x86_64/tcz/cifs-utils.tcz
boot2docker上でroot以外のユーザーになったあと、wgetやcurlなどで上記の2つのファイルをダウンロードします。
そのあと、次のコマンドを叩きます。
tce-load -i samba-libs.tcz
tce-load -i cifs-utils.tcz
これで、boot2docker上でWindowsの共有フォルダをマウントできるようになりました。
そして、WindowsとDockerが所属しているネットワークの、Windows側のIPを調べておきます。
boot2dockerのrootで次のコマンドで共有フォルダをマウントしましょう。
mount -t cifs //Windows側のIP/共有フォルダのパス /マウント先のパス -o user=共有フォルダの許可したユーザー名,iocharset=utf8
このiocharset=utf8
を忘れるともれなく日本語が文字化けします。
3.dockerのコンテナを起動するときに、boot2dockerでマウントしたパスを指定して、マウントする
コンテナを起動するときに先ほどのマウント先のパスを指定します。
例:boot2docker上で/mnt/shareにマウントして、docker上で/windowsShareにマウントする場合
docker run -v /mnt/share:/workspace イメージ名
以上の流れで共有可能です。
VirtualBoxよりも複雑で難しいですね。