在Mac上的Docker机器:在Docker主机/ docker-machine上无法看到已安装的卷? 卷的物理存储位置在哪里?

我在一台Macbook Pro笔记本电脑上运行docker-machine(0.5.0)docker-compose(1.5.0)来运行我的容器。

这意味着我使用docker-machine来创build我的virtualbox boot2docker驱动的HOST机器,它将运行我的docker守护进程并托pipe所有的容器。

我想我错过了关于HOSTS和VOLUME的概念,因为它们涉及到Docker和文档。

这是我的docker-compose.yml文件(网站只是build立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/

它声明了卷 – 将path装载为卷,可选地在主机(HOST:CONTAINER)上指定path,或者访问模式(HOST:CONTAINER:ro)。

在这种情况下,主机是指由我的虚拟机创build的docker-machine,是否正确? 或者我的本地macbook文件系统? 在我的虚拟机上安装一个path到一个容器?

networking下我声明:

 volumes: - ./src:/var/www/html 

这是我的本地macbook文件系统./src文件夹映射到我的web容器。 如果我的理解是正确的,不应该将我的VM上的./src文件夹映射到Web容器中的/ var / www / html ?! 理论上,我认为我应该要求我的本地mac文件系统文件夹./src复制到我的虚拟机,然后我做这个卷声明。 看起来docker撰写者是神奇地一下子全部完成了吗? 困惑

最后,我们可以看到,我正在创build一个只保存数据的容器来保存我的mysql数据。 我已经声明:

 volumes: - /var/lib/mysql 

不应该在我的HOST boot2docker虚拟机上创build一个/ var / lib / mysql文件夹,然后我可以导航到VM上的这个文件夹,是/否? 当我使用docker-machine ssh进入我的机器,然后导航到/ var / lib时 ,根本没有 mysql文件夹?! 为什么没有创build? 我的configuration有问题吗? :/

提前致谢! 任何解释,我在这里做错了将不胜感激!

好的,有几点需要在这里解决。

让我们从docker的数量开始吧(在这一点上,不要考虑你的macbook或stream浪机器,只要注意docker使用不同的文件系统,这里可能就存在这个事实):可能想象一下就像这样,Docker中的每个卷都只是Docker使用的内部文件系统的一部分。 容器可以使用这些卷,就像它们是可以由它们安装的“小硬盘”,也可以在它们之间共享(或者同时由它们中的两个安装,比如将一个超快速的版本的某些ftp服务器安装到两个客户机或者别的:P)。

原则上,你可以通过Dockerfile的VOLUME指令声明这些卷(还没有考虑你的计算机/stream浪者本身,就是dockers;))。 标准示例,像这样运行一个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的/ www,无论任何PHP在/ WWW。 如果你把:RO,PHP甚至不能写入该文件夹:)

现在接近你的问题,还有第二种方法来声明卷,这不需要在Dockerfile中声明它们。 这可以通过从主机安装卷(在这种情况下你的stream浪汉/ boo2docker thingy)来完成。 让我们来讨论一下,就好像我们先在本地Linux上运行一样。

如果你要把这样的东西:

 volumes: - /home/myuser/folder:/folder 

在你的docker-compose.yml中,那么这将意味着/ home / myuser /文件夹现在被装载到docker中。 它将覆盖docker在/文件夹中的任何内容,就像/ www也可以从声明它的东西中访问。 现在运行Docker守护进程的Linux机器。

这么多的理论:),其实你可能只是需要以下build议让你的东西:):

boot2docker / docker-machine / kitematic和所有这些事情处理这个问题的方法很简单,他们首先在stream浪者机器上将一个卷装入到docker容器中,然后他们也可以将这个东西挂载到你的Mac文件系统,希望能够解决这个问题

现在为了解决这个实际问题,我们所有人都在使用这个(或者只是试图帮助他们的同事进入甜蜜的可爱的Docker:P的世界),在Mac上面对的是权限。 我的意思是想一想(根或其他用户处理容器中的文件,用户vagrant可能会处理stream浪主机中的文件,然后你的Mac用户“skalfyfan”在Mac中处理这些文件。他们都有不同的用户ID和whatnot = >很多问题会随之而来,有时候取决于你在Docker中运行的是什么,Mysql和Apache是​​非常痛苦的,因为它们不能在容器中作为root运行,这意味着在写入Mac文件时经常遇到麻烦系统。

在尝试下面的第二种方法之前,只需将您的容器卷放在您的Mac主目录下即可。 在大多数情况下,这将解决MySQL的问题,因为我已经发现了一段时间。 顺便说一句: 不需要声明完整的path./folder是好的,并阅读相对于你的docker-compose.yml居住的地方!

只需将compose-yml放在Mac用户文件夹中,这就是最重要的。 没有chmod 777 -R:P将帮助你在这里,它只需要在你的主文件夹:)

还有一些应用程序(例如Apache)仍然会给你一个难题。 无论在容器中运行的用户标识与Mac用户标识不同,都会让你的生活变得糟糕。 为了解决这个问题,您需要调整用户ID以及用户组,以不与您的Mac权限相冲突的方式进行调整。 在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先复制到我的虚拟机,然后我做这个卷声明。 看起来docker撰写者是神奇地一下子全部完成了吗?

对,它是这样:)

最后,我们可以看到,我正在创build一个只保存数据的容器来保存我的mysql数据。 我已经声明:volumes: – / var / lib / mysql

这个你错了:)如上所述,如果你不给一个主机文件夹,那么Doc​​ker将坚持这个path。 但是只有这个容器,所有的东西都会留在docker文件系统中。 根本没有东西写入主机! 如果您在容器文件夹之前放置一个主文件夹,这总是会发生的!

希望这有助于:)