我在Macbook Pro笔记本电脑上运行 docker-machine(0.5.0)和 docker-compose(1.5.0)以使我的容器运行。
这意味着我使用docker-machine创建了我的虚拟机boot2docker驱动的HOST机器,它将运行我的docker守护程序并托管我的所有容器。
我认为我遗漏了一些关于HOSTS和VOLUME概念的重要内容,因为它们引用了Docker和文档。
这是我的docker-compose.yml文件(web只是构建了php:5.6-apache图像):
web:
restart: "always"
build: ./docker-containers/web
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
links:
- mysql:mysql
mysql:
restart: "always"
image: mysql:5.7
volumes_from:
- data
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=XXX
data:
restart: "no"
image: mysql:5.7
volumes:
- /var/lib/mysql
command: "true"
Docker撰写卷的文件文档位于:http://docs.docker.com/compose/compose-file/
它表示卷 - 将路径作为卷安装,可选择指定主机上的路径(HOST:CONTAINER),或访问模式(HOST:CONTAINER:ro)。
这种情况下的主机是指我的由docker-machine创建的虚拟机,对吗?还是我的本地macbook文件系统?将VM上的路径挂载到容器?
在 web 下,我声明:
volumes:
- ./src:/var/www/html
这是将我的macbook pro上的本地macbook文件系统 ./ src 文件夹映射到我的Web容器。如果我的理解是正确的,不应该将 VM 上的 ./ src 文件夹映射到 / var / www / html 在网络容器内?!从理论上讲,我认为我应该首先将我的本地mac文件系统文件夹 ./ src 复制到我的VM,然后我做这个卷声明。似乎docker-compose一下子神奇地做了所有这一切? 混淆
最后,我们可以看到我正在创建一个仅限数据的容器来保存我的mysql数据。我已宣布:
volumes:
- /var/lib/mysql
不应该在我的HOST boot2docker VM上创建 / var / lib / mysql 文件夹,然后我可以导航到VM上的这个文件夹,是/否?当我使用docker-machine ssh到我的机器,然后导航到 / var / lib 时,有 NO mysql文件夹?!为什么没有创建?我的配置有问题吗? :/
提前致谢!关于我在这里做错的任何解释都将不胜感激!
答案 0 :(得分:12)
好的,这里有几点需要解决。
让我们从docker卷开始(尝试不考虑你的macbook或vagrant机器。请注意docker使用不同的文件系统,此时它可能驻留在哪里) : 也许想象它就像这样,它本身的每个卷都只是Docker使用的内部文件系统的一部分。 容器可以使用这些容量,就像它们是小型硬盘和#34;它们可以由它们安装并在它们之间共享(或者同时由其中两个安装,比如将一些ftp服务器的超快版本安装到两个客户端或其他任何地方:P)。
原则上你可以通过Dockerfile的VOLUME指令声明这些卷(仍然不考虑你的计算机/流浪者本身,只是码头工人;))。 标准示例,运行一个webserver容器,如下所示:
FROM: nginx
VOLUME /www
现在进入/ www的所有内容理论上都可以从容器中安装和卸载,也可以安装到多个容器中。 现在单独使用Nginx很无聊,所以我们想让php运行nginx存储的文件以产生更多有趣的内容。 =>我们需要将该卷安装到某个php-fpm容器中。 在我们的撰写文件中我们做了这个
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=>瞧!由nginx / web容器中的VOLUME指令声明的每个文件夹都将在php中显示。这里需要注意的重要一点是,nginx&s; / www中的任何内容都将覆盖/ www中的php。 如果你把:ro,php甚至不能写入该文件夹:)
现在接近你的问题,有第二种方式来声明卷,这不需要在Dockerfile中声明它们。这可以通过从主机安装卷来完成(在这种情况下你的vagrant / boo2docker thingy)。我们先讨论这个问题,好像我们先在本机Linux上运行一样。
如果你要做类似的事情:
volumes:
- /home/myuser/folder:/folder
你的docker-compose.yml中的,这意味着/ home / myuser /文件夹现在将被挂载到docker中。它将覆盖docker在/ folder中的任何内容,就像/ www也可以从声明它的东西访问它。现在是Docker守护程序正在运行的Linux机器。
理论上这么多:),实际上你可能只需要以下建议就可以了解你的内容:):
boot2docker / docker-machine / kitematic以及所有这些事情处理问题的方法很简单,他们首先只是将流浪汉机器中的卷安装到docker容器中,而且它们只是将这个东西安装到你的Mac文件系统,希望它能全部解决:P
现在对于实际问题我们所有人在Mac上使用这个(或者只是试图帮助他们的同事进入甜蜜的Docker:P世界)都面临着权限。我的意思是考虑一下(root或其他一些用户处理容器中的文件,用户流浪者可能会处理vagrant主机中的文件,然后你的Mac用户" skalfyfan"处理Mac中的那些文件。它们都有不同的用户ID和whatnot =>随之而来的很多问题,在某种程度上取决于你在Docker中实际运行的内容.Mysql和Apache特别痛苦,因为它们不在容器中以root身份运行。这意味着,他们经常无法写入Mac文件系统。
在尝试下面的第二种方法之前,只需尝试将容器卷放在Mac主目录下。在大多数情况下,这将解决我在一段时间内发现的问题。 顺便说一句:无需声明卷的完整路径./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
所以你现在已经学会了:
理论上我认为应该要求我复制我的本地mac文件 系统文件夹./src首先到我的VM,然后我做这个卷 宣言。似乎docker-compose一下子神奇地完成了这一切 虽然?
正确,它确实如此:)
最后,我们可以看到我创建了一个仅保留数据的容器 我的mysql数据。我宣布: 卷: - / var / lib / mysql
这个你错了:)正如所解释的,如果你不提供主机文件夹,那么Docker将坚持这条路径。但只有这个容器才会保留在docker文件系统中。根本没有东西写给主人!只有在容器文件夹之前提供主机文件夹时才会发生这种情况!
希望这有助于:)