Docker Mac在 Mac 上运行:无法在 docker host/docker-machine 上看到已安装的卷?卷物理存储在哪里?

Docker Machine on Mac: Cannot see mounted Volumes on docker host/docker-machine? Where are volumes physically stored?

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

这意味着我正在使用 docker-machine 来创建我的 virtualbox boot2docker 驱动主机 machines,它将 运行 我的docker 守护进程并托管我所有的容器。

我认为我遗漏了关于 HOSTS 和 VOLUME 概念的一些重要内容,因为它们引用了 Docker 和文档。

这是我的 docker-compose.yml 文件(网络只是构建 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/

它为卷声明 - 将路径装载为卷,可选择指定主机上的路径 machine (HOST:CONTAINER),或访问模式 (HOST:CONTAINER:ro) .

本例中的 HOST 是指由 docker-machine 创建的虚拟机,对吗?或者我的本地 mac 图书文件系统?将我的 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 上的这个文件夹,yes/no?当我使用 docker-machine ssh 进入我的 machine,然后导航到 /var/lib 时,有 没有 mysql 文件夹?!为什么不创建它?我的配置有问题吗? :/

提前致谢!任何关于我在这里做错的解释都将不胜感激!

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

让我们从什么是 docker 卷开始(此时尽量不要考虑您的 macbook 或 vagrant 机器。请注意 docker 使用不同的卷文件系统,此时它可能位于何处): 也许可以这样想象,Docker 中的每个卷本身都只是 docker 使用的内部文件系统的一部分。 容器可以使用这些卷,就像它们是 "small harddrives" 一样,可以由它们安装并在它们之间共享(或者同时由它们中的两个安装,例如安装一些 [=86= 的超快速版本) ] 服务器到两个客户端或其他任何 :P ).

原则上您可以通过 Docker 文件的 VOLUME 指令声明这些卷(仍然不考虑您的 computer/vagrant 本身,只是 dockers ;))。 标准示例,运行 一个网络服务器容器,如下所示:

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 甚至无法写入该文件夹 :)

现在接近您的问题,还有第二种声明卷的方法,不需要在 Docker 文件中声明它们。这可以通过从主机安装卷来完成(在本例中是你的 vagrant/boo2docker 东西)。让我们讨论这个问题,就好像我们先 运行 讨论原生 Linux 一样。

如果你要输入类似的内容:

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

在您的 docker-compose.yml 中,那么这将意味着 /home/myuser/folder 现在将安装到 docker 中。它将覆盖 docker 在 /folder 中的任何内容,就像 /www 也可以从声明它的东西访问一样。现在 Linux 机器上 docker 守护程序 运行 正在运行。

理论就这么多 :),事实上,您可能只需要以下建议就可以开始工作 :):

boot2docker/docker-machine/kitematic 和所有这些事情处理这个问题的方式很简单,他们首先只是将 vagrant 机器中的一个卷挂载到 docker 容器,然后他们也简单地挂载把这个东西放到你的 Mac 文件系统中,希望一切顺利 :P

现在对于实际问题,我们所有人在 Mac 上使用这个(或者只是想帮助他们的同事进入甜蜜的世界 Docker :P)都面临着权限。我的意思是考虑一下(root 或其他一些用户处理容器中的文件,用户 vagrant 可能处理 vagrant 主机中的文件,然后你的 Mac 用户 "skalfyfan" 处理 Mac 中的那些文件. 他们都有不同的用户 ID 等等 => 许多问题随之而来,并且在某种程度上取决于你在 Docker 中的实际 运行ing。Mysql 和 Apache 尤其痛苦,因为它们在容器中不是 运行 root。这意味着,它们经常无法写入 Mac 文件系统。

在尝试下面的第二种方法之前,只需尝试将容器卷放在 Mac 主目录下。随着时间的推移,这将解决大多数情况下 MySQL 的问题。 顺便说一句:无需声明卷的完整路径 ./folder 就可以了,并且相对于 docker-compose.yml 所在的位置进行阅读!

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

仍有一些应用程序(例如 Apache)仍然会给您带来困难。容器中任何 运行 的用户 ID 与您的 Mac 用户 ID 不同的事实会让您的生活变得一团糟。为了解决这个问题,您需要以不与您的 Mac 权限冲突的方式调整用户 ID 和用户组。你想要在 Mac 上的组是 staff,一个有效的 UID 例如 1000。 因此,您可以将其放在 Docker 文件的末尾:

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

RUN usermod -u 1000 mysql
RUN usermod -G staff mysql

正如您现在了解到的那样:

In theory I think I should be required to COPY my local mac file system folder ./src to my VM first, and then I do this volume declaration. It seems docker-compose is magically doing it all at once though?

没错,就是这样:)

Lastly, we can see that I'm creating a data-only container to persist my mysql data. I've declared: volumes: - /var/lib/mysql

这一个你错了 :) 如前所述,如果你不提供主机文件夹,那么 Docker 将保留此路径。但仅针对此容器,所有容器都将保留在 docker 文件系统中。什么都没有写给主机!仅当您在容器文件夹之前提供主机文件夹时,才会始终发生这种情况!

希望这对您有所帮助:)