ここで対処する必要のあるポイントがいくつかあります。
Dockerボリュームとは何かから始めましょう(この時点では、MacBookやVagrantマシンについて考えないようにしてください。Dockerがこの時点で存在する可能性のある場所で別のファイルシステムを使用していることに注意してください):想像してみてくださいこのように、Dockerのすべてのボリュームは、それ自体、Dockerが使用する内部ファイルシステムの一部にすぎません。コンテナーは、これらのボリュームを、それらによってマウントされ、それらの間で共有できる「小さなハードドライブ」のように使用できます(または、2つのクライアントに超高速バージョンのftpサーバーをマウントするなど、2つで同時にマウントします。
原則として、DockerfileのVOLUME命令を介して、これらのボリュームを宣言できます(まだ、コンピューター/ Vagrant自体については考えておらず、ドッカーだけです;))。標準的な例では、次のように1つのWebサーバーコンテナーを実行します。
FROM: nginx
VOLUME /www
これで、理論的には/ wwwに入るすべてのものをコンテナにマウントおよびマウント解除したり、複数のコンテナにマウントしたりできます。Nginxだけでは退屈なので、nginxが保存するファイルに対してphpを実行して、より楽しいコンテンツを作成する必要があります。 =>そのボリュームをphp-fpmコンテナにマウントする必要があります。composeファイルのErgoでこれを行います
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=>出来上がり! nginx / webコンテナ内のVOLUMEディレクティブによって宣言されたすべてのフォルダは、phpフォルダに表示されます。ここで注意すべき重要な点は、nginxの/ wwwにあるものはすべて、phpが/ wwwにあるものを上書きします。:roを配置すると、phpはそのフォルダーに書き込むことさえできません:)
問題に近づき、ボリュームを宣言する2番目の方法があります。これは、Dockerfileで宣言する必要がありません。これは、ホスト(この場合はvagrant / boo2dockerthingy)からボリュームをマウントすることで実行できます。最初にネイティブLinuxで実行しているように、これについて説明しましょう。
次のようなものを置く場合:
volumes:
- /home/myuser/folder:/folder
docker-compose.ymlで、これは/ home / myuser/folderがdockerにマウントされることを意味します。これは、Dockerが/ folderに持っているものをすべてオーバーライドし、/ wwwと同様に、それを宣言したものからアクセスできます。これで、Dockerデーモンが実行されているLinuxマシンになります。
理論についてはこれだけです:)実際、作業を進めるには次のアドバイスが必要です:):
boot2docker / docker-machine / kitematicとこれらすべてのものが問題に対処する方法は、まず最初に、vagrantマシンのボリュームをdockerコンテナーにマウントするだけであり、Macファイルシステムにもこのものをマウントするだけです。 、すべてがうまくいくことを願っています:P
さて、Macでこれを使用している(または同僚が甘いDocker:Pの世界に入るのを助けようとしている)実際の問題については、許可があります。つまり、rootまたは他のユーザーがコンテナ内のファイルを処理し、ユーザーvagrantがvagrantホスト内のファイルを処理し、Macユーザー「skalfyfan」がMacでそれらのファイルを処理する場合があります。これらはすべて異なるユーザーIDを持ちます。>多くの問題が発生しますが、Dockerで実際に実行しているものによっては多少異なります。MysqlとApacheは、コンテナ内でrootとして実行されないため、特に苦痛です。つまり、Macファイルへの書き込みに問題が発生することがよくあります。システム。
以下の2番目のアプローチを試す前に、コンテナボリュームをMacのホームディレクトリの下に置いてみてください。これにより、ほとんどの場合、MySQLの問題が解決されます。ところで、ボリュームへのフルパスを宣言する必要はありません。/folderは問題なく、docker-compose.ymlが存在する場所を基準にして読み取られます!強い>
ただcompose-ymlをMacユーザーフォルダに入れてください。それだけが重要です。 chmod 777 -R:Pはここでは役に立ちません。ホームフォルダの下にある必要があります:)
それでも一部のアプリ(たとえばApache)はまだ苦労します。コンテナで実行されるもののユーザーIDがMacのユーザーIDと異なるという事実は、あなたの人生を地獄にします。これを回避するには、Macのアクセス許可と競合しない方法で、ユーザーIDとユーザーグループを調整する必要があります。 Macで必要なグループはスタッフであり、機能するUIDはたとえば1000になります。したがって、これをDockerfileの最後に置くことができます。
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
または
RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
だからあなたが今学んだように:
すぐに、それはそれをします:)
これは間違っています:)説明したように、ホストフォルダーを指定しない場合、Dockerはこのパスを保持します。ただし、このコンテナの場合のみ、すべてがDockerファイルシステム内に残ります。ホストには何も書き込まれません!これは、コンテナフォルダの前にホストフォルダを指定した場合にのみ常に発生します!
これがお役に立てば幸いです:)