docker runには-vオプションというのがあって、dockerホストのディレクトリをコンテナ内のディレクトリにマウントすることができます。ただboot2dockerを使っている場合、マウントされるのはVirtualBox上で動いているVMのディレクトリになります。私の場合はMacですが、できればコンテナからMacのディレクトリを直接マウントしたくなります。
仕組み
VirtualBoxにはGuestAdditionsというものがあって、ゲストOSにインストールすることでパフォーマンスを引き出したり、今回使う共有フォルダ機能を使うことができるようになります。詳しくは下記。
6.4. VirtualBox Guest Additions のインストール
共有フォルダというのは、ホストOSのディレクトリをVirtualBox上のVMから読み書きできるようにするものです。これを使って、
- 共有フォルダ機能を使って、Mac上のディレクトリをVMからマウントする
- dockerコンテナからは、1でマウントしたディレクトリをマウントする
という方法をとります。
手順
boot2dockerはISOイメージからVMを作成し、それを起動してその上でdockerが動作する仕組みになっています。ISOイメージは~/.boot2docker/boot2docker.isoにあります。このISOイメージにはGuestAdditionsはインストールされていません。インストールもできますが、インストール済みのISOイメージを作っている人がいるので、ありがたく使わせてもらいます。
boot2docker together with VirtualBox Guest Additions
# ダウンロード
cd ~/.boot2docker
wget http://static.dockerfiles.io/boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso
# リネーム
mv boot2docker.iso _boot2docker.iso.orig
mv boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso boot2docker.iso
VMを停止します
boot2docker stop
VMを削除して、ISOイメージから作り直します。既存のコンテナやイメージは全て消えるので注意してください。
boot2docker destroy
boot2docker init
VMを起動する前に共有フォルダの設定を行います。-hostpathは、共有したいMac上のディレクトリを指定します。以下のようにすると、Mac上の/UsersがVM上の/Usersにマウントされます。LaunchPadからVirtualBoxを起動して、GUIで設定してもOKです。
VBoxManage sharedfolder add boot2docker-vm -name home -hostpath /Users/
なお-nameは、homeを指定するとVM上の/Usersに自動的にマウントしてくれますが、それ以外を指定すると手動でマウントする必要があります。これはISOイメージの/etc/mtabに「none /Users vboxsf rw,nodev,relatime 0 0」と書いてあるためです。
さて、VMの設定はこれで終わりです。起動します。
boot2docker start
/Usersが正しくマウントされているか確認します。boot2docker sshでVMにログインし、/Usersを見てみます。
boot2docker ssh
ls -l /Users
正しくマウントされていれば、ホスト上にあるファイルが表示されるはずです。
あとはdocker runの-vオプションを指定すれば、コンテナから直接ホスト上のディレクトリが読めるようになります。
docker run -v /Users:/mnt/users -i /bin/bash