2015-12-05 18 views
17

私はローカルのVirtualBoxプロバイダ(boot2dockerが入っています)を持った私のUbuntu 14.04 LTSホストマシンで開発中のドッカーを作成しています。Docker Machine + Docker Compose + Volumes on Ubuntu

最近私は(Pycharmとの統合のため)ドッカーマシンを試してみることにしましたが、私はいくつかの新しいコードを保存すると、ドッカーコンテナが自動的にはもう自動的に更新されず、私はdocker-compose.ymlウェブサービスで自分のボリュームをコメントアウトしているので、私はエラーを取得するので、私は理解していないので、私はこれを理解してhere私はそれをコメントする必要があります。

私はインターネット上で多くのことを読んできました。ドッカーマシンをUbuntuでドッキングしてうまくいくための良い単純なアプローチがあるかどうかを知りたいと思います。

DockerFile

FROM ubuntu:14.04.3 
ENV PYTHONUNBUFFERED 1 
RUN apt-get update && apt-get install -y \ 
    build-essential \ 
    git-core \ 
    python2.7 \ 
    python-pip \ 
    python-dev \ 
    libpq-dev \ 
    postgresql-client-9.3 \ 
    libjpeg-dev \ 
    binutils \ 
    libproj-dev \ 
    gdal-bin 
RUN mkdir /vagrant 
WORKDIR /vagrant 
RUN mkdir requirements 
COPY requirements requirements 
RUN pip install -r requirements/local.txt 
COPY . /vagrant/ 

ドッキングウィンドウ-compose.yml

postgis: 
    image: mdillon/postgis:9.3 
    ports: 
    - "5432:5432" 
    environment: 
    POSTGRES_USER: postgres 
    POSTGRES_PASSWORD: "postgres" 
# volumes: 
# - /etc/postgresql 
# - /var/log/postgresql 
# - /var/lib/postgresql 

web: 
    build: . 
    dockerfile: Dockerfile 
    command: python manage.py runserver 0.0.0.0:8000 --settings=xxx.settings.local 
# https://stackoverflow.com/a/31567743/977622 
# volumes: 
# - .:/vagrant 
    ports: 
    - "8000:8000" 
    links: 
    - "postgis:postgis" 

UPDATE:私は私のVM内でmountコマンドを実行したときに

私が取得:

tmpfs on/type tmpfs (rw,relatime,size=918096k) 
proc on /proc type proc (rw,relatime) 
sysfs on /sys type sysfs (rw,relatime) 
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000) 
tmpfs on /dev/shm type tmpfs (rw,relatime) 
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) 
/dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,data=ordered) 
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,mode=755) 
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset) 
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu) 
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct) 
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio) 
cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory) 
cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices) 
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer) 
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,relatime,net_cls) 
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event) 
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,relatime,net_prio) 
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,relatime,hugetlb) 
/dev/sda1 on /mnt/sda1/var/lib/docker/aufs type ext4 (rw,relatime,data=ordered) 
none on /mnt/sda1/var/lib/docker/aufs/mnt/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d type aufs (rw,relatime,si=462e07a762a4065f,dio,dirperm1) 
shm on /mnt/sda1/var/lib/docker/containers/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k) 
mqueue on /mnt/sda1/var/lib/docker/containers/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime) 
nsfs on /var/run/docker/netns/2e4dbeed7a66 type nsfs (rw) 

マイsh aredフォルダは最も安全(最も互換性のある)の賭けは、イメージを再構築し、それぞれがあなたが作る変更のために(コンテナを再配備することになるだろう、フォルダパスは、残念ながら/home

+0

リンクされた問題の説明と同様に、ホストボリュームのマウントは、Dockerを実行している_host_を基準にしています。 Dockerマシンがプロバイダ内で外部で実行されている場合、そのボリュームはローカルマシンのデータではありません。 Dockerマシンはどこで動作していますか? –

+0

私はVirtualBox @AndyShinnでdockerマシンを実行しています – psychok7

+0

VMにログインして( 'docker-machine ssh ')、マウント( 'mount')を取得して、ホストから何かがVMにマウントされているかどうか確認できますか?そうでない場合、これはVMでは不可能です。コンテナがアクセスできるようにするには、ホストフォルダをVMと共有する必要があります。 –

答えて

2

あるUIで言いますすなわち、docker-compose build && docker-compose up -dまたはそれに類するもの)。これは遠隔のDockerデーモン(あなたが使い易いので、docker-machineの機能をもっと魅力的にするかもしれない)に対しても働くという素晴らしい利点があります。

+1

これは正しく見えません。開発するたびにこれを行うのは苦痛になります。それぞれの機会に手動でコンパイルするC言語を思い出させます。将来この動作を変更する予定があるかどうか知っていますか? – psychok7

+1

アプリケーションは実際にVM内で動作しているので、基本的にリモートバインドマウントについて話しています。私はVagrantがこの種のものを容易にするのに役立つコネクタをたくさん持っていることを知っています(vboxsfからsshfsまでずっとrsyncを前後に使用していると思います)。代わりにNFSを試してみる価値があります(特にホストもLinuxであるため)。 – tianon

1

@ AndyShinnのコメント/ @ tianonの回答は私が信じる質問に答えます。

しかし、Ubuntuホストを実行している場合は、VMではなくベアメタルで実行してみてください。最近では、--userns-remapフラグを使ってdockerコンテナを非ルートとして実行することができるため、セキュリティについてはあまり心配する必要はありません。ほとんどのチュートリアルやものはドッカーマシンのVMを前提条件としていますが、その対象読者はほとんどがVMなしでドッカーを実行できないOS XまたはWindowsの人々です。ハイパーバイザー(特にバーチャルボックス)== IOパフォーマンスの悪化、メモリの過剰使用、起動の遅れ。我々はドッキングウィンドウ:)

+0

"私はLinuxを使っていると私のホストでそれを実行する方が良い"ということを知っていますが、OS XとWindowsユーザーがどうやってこの問題に対処しているかはわかりません。あなたが単にそれを構築せずに保存時にあなたのコードを更新することができない場合、(Linuxのホスト上でさえ)以前のやり方よりも、ドッカーマシンをアドバンテージとしてアドバタイズするか、あるいはアドバンテージとしてアドバタイジングするのはなぜですか? OS Xユーザーは小さなコードを変更するたびにビルドするのですか? – psychok7

+0

個人的には、新しいコードを実行するたびに実際に再構築します。通常、OS Xで動作しないコードベースの一部である奇妙な科学ソフトウェアがない限り...私は自分のローカルOSXマシンで100%作業しています。テストは合格する。 VM上のコンテナ(ローカルまたはその他)で実行する場合は、ワークディレクトリをVMと共有して、コンテナと共有できるようにする必要があります。このプロセスは、リモートVMと似ていますが、sshfs、nfs、またはその他のネットワークプロトコルを使用してネットワーク経由でファイルを同期させる – pnovotnak

0

docker-machineは(boot2dockerがやったように)あなたのVirtualBoxを実行しているマシンとローカルのデフォルトのドッキングウィンドウVM間でユーザーディレクトリを共有する試みをしていた理由です。あなたはデフォルトのVMを実行していない場合は、vmshareを作成し、Windows C:\Users上およびMac /Usersに自分で

それをマウント/UsersとしてdefaultドッカVMにマウントされます。/home

vmhost$ docker-machine ssh default 
vm$ mount | grep User 
Users on /Users type vboxsf (rw,nodev,relatime) 
vm$ exit 

リストローカルユーザーディレクトリ

vmhost$ ls -1 /Users/me/docker 
compose_env_file 
registry_push_test 

は、容器の容積として、VMに共有されているローカルディレクトリを、マウントとしてLinuxは/homeを共有してマウントします。

vmhost$ docker run -v /Users/me/docker:/test busybox ls /test 
compose_env_file 
registry_push_test 

実際には、上記のコマンドが実行されているものと同じです。

vm$ docker run -v /Users/me/docker:/test busybox ls /test 
compose_env_file 
registry_push_test 

あなたがあなたのマシンからの変更は、あなたのVMに表示したい場合は、ユーザーディレクトリから作業し、ドッキングウィンドウのコンで相対パスを使用する必要があります。