@znz blog

ZnZ の memo のようなもの

boot2docker で VM のファイルをコンテナやホストと共有する

| Comments

Mac OS X 上の boot2docker でホストとコンテナでファイルを共有する方法を試してみました。 さらに boot2docker ssh で入ったときにも見えるような設定でも試してみました。

参考

対象バージョン

  • Mac OS X 10.9.4
  • VirtualBox 4.3.14
  • docker 1.1.2
  • boot2docker 1.1.2

実行コマンド

  • docker run -v /mnt/sda1/data:/data --name my-data busybox true で共有ボリューム用コンテナ作成
  • docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba my-data で samba 起動
  • docker run -it --rm --volumes-from my-data ubuntu /bin/bash で確認

共有ボリューム用コンテナ作成

Dockerで不要になったコンテナやイメージを削除する のように docker ps -a -q | xargs docker rm などで停止しているコンテナを削除してしまうと my-data という名前を付けたデータ保存用のコンテナも消えてしまうので、 boot2docker では永続化されているパーティションの /mnt/sda1data をおくことにしました。

run の時点で /mnt/sda1/data は自動作成されるので、 あらかじめ作っておく必要はありません。

間違えてコンテナを削除してしまった場合は docker run -v /mnt/sda1/data:/data --name my-data busybox true で作成し直せばデータは残ったまま my-data コンテナを再作成できます。

このやり方は docker を動かすホストに依存してしまうので、 一般には標準のボリュームコンテナを作成する方法の方がおすすめのようです。

共有ボリューム用コンテナ再作成 (標準の方法の場合)

--volumes-from で指定した共有は使っているコンテナがなくなってしまっても内容が残っていますが、 名前で指定して取り出す方法がなくなってしまうように見えます。

my-data コンテナを削除してしまった場合、 --volumes-from my-data は使えなくなるので、 docker run --volumes-from samba-server --name my-data busybox true のように残っているコンテナを --volumes-from で指定して再作成すれば、 また docker run -it --rm --volumes-from my-data ubuntu /bin/bash のように --volumes-frommy-data を指定できるようになります。

samba 起動

docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba my-data で samba を起動します。

docker.sock も渡しているので、多重起動しないように既存の samba-server は止めてくれるようです。

起動時に以下のようにホスト側からの接続方法の説明が出ます。

% docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba my-data
stopping and removing existing server
starting samba server container sharing my-data:/data

# run 'docker logs samba-server' to view the samba logs

================================================

Your data volume (/data) should now be accessible at \\<docker ip>\ as 'guest' user (no password)

For example, on OSX, using a typical boot2docker vm:
    goto Go|Connect to Server in Finder
    enter 'cifs://192.168.59.103
    hit the 'Connect' button
    select the volumes you want to mount
    choose the 'Guest' radiobox and connect

Or on Linux:
    mount -t cifs //192.168.59.103/data /mnt/data -o username=guest

Or on Windows:
    Enter '\\192.168.59.103\data' into Explorer
    Log in as Guest - no password

samba に接続

boot2docker ip で IP アドレスを確認して、 192.168.59.103 なら、 Finderサーバへ接続 (メニューの 移動サーバーへ接続...) を開いて、 サーバアドレスとして cifs://192.168.59.103/data を入力して 接続 します。 ユーザの種類ゲスト を選んで 接続 します。 すると /Volumes/data で見えるようになります。

Linux なら mount -t cifs //192.168.59.103/data /mnt/data -o username=guest のようにマウントするそうです。

Windows ならエクスプローラーで \\192.168.59.103\data にパスワードなしのゲスト接続すれば見えるそうです。

別コンテナで確認

docker run -it --rm --volumes-from my-data ubuntu /bin/bash などで別コンテナを起動すると、 /data にマウントされているので、 ls -l /data で中身を確認したり、 /data の中にファイルを作成して他で見えることを確認しました。

まとめ

README に書いてある Folder sharing だと間違えて消してしまうことがあったので、ちょっと工夫した方法を紹介しました。

Comments