Mac上的Docker Machine:在docker主机/ docker-machine上看不到挂载的卷?卷物理存储在哪里?

skå*_*fan 11 mysql volumes docker docker-compose docker-machine

我在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" 
Run Code Online (Sandbox Code Playgroud)

Docker撰写卷的文件文档在这里:http://docs.docker.com/compose/compose-file/

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

在这种情况下主机是指我的由docker-machine创建的VM,对吗?还是我的本地macbook文件系统?将VM上的路径挂载到容器?

网上我声明:

volumes:
  - ./src:/var/www/html
Run Code Online (Sandbox Code Playgroud)

这是将我的macbook pro上的本地macbook文件系统./src文件夹映射到我的Web容器.如果我的理解是正确的,不应该将我的VM上的./src文件夹映射到Web容器中的/ var/www/html吗?!从理论上讲,我认为我应该首先将我的本地mac文件系统文件夹./src复制到我的VM,然后我做这个卷声明.似乎docker-compose一下子神奇地做了所有这一切?困惑

最后,我们可以看到我正在创建一个仅限数据的容器来保存我的mysql数据.我宣布:

volumes:
   - /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

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

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

Arm*_*aun 12

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

让我们从docker卷开始(尝试不考虑你的macbook或vagrant机器.请注意Docker使用不同的文件系统,此时它可能驻留在哪里):也许想象一下就像这样,Docker中的每个卷本身就是Docker使用的内部文件系统的一部分.容器可以使用这些卷,就像它们是"小硬盘"一样,可以由它们安装并在它们之间共享(或者同时由两个它们安装,就像将一些ftp服务器的超快版本安装到两个客户端一样或者其他:P).

原则上你可以通过Dockerfile的VOLUME指令声明这些卷(仍然不考虑你的计算机/流浪者本身,只是码头工人;)).标准示例,运行一个webserver容器,如下所示:

FROM: nginx
VOLUME /www
Run Code Online (Sandbox Code Playgroud)

现在,进入/ www的所有内容理论上都可以从容器中安装和卸载,也可以安装到多个容器中.现在单独使用Nginx很无聊,所以我们想让php运行nginx存储的文件以产生更多有趣的内容.=>我们需要将该卷安装到某个php-fpm容器中.在我们的撰写文件中,我们会这样做

web:
  image: nginx
php:
  image: php-fpm
  volumes_from:
    - web
Run Code Online (Sandbox Code Playgroud)

瞧瞧!由nginx/web容器中的VOLUME指令声明的每个文件夹都将在php中显示.这里要注意的重要一点,无论是在nginx的/ www中,都将覆盖/ www中的任何php.如果你把:ro,php甚至无法写入该文件夹:)

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

如果你要做类似的事情:

volumes:
 - /home/myuser/folder:/folder
Run Code Online (Sandbox Code Playgroud)

在您的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 Code Online (Sandbox Code Playgroud)

要么

RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
Run Code Online (Sandbox Code Playgroud)

所以你现在学到了:

从理论上讲,我认为我应该首先将我的本地mac文件系统文件夹./src复制到我的VM,然后我做这个卷声明.似乎docker-compose一下子神奇地做了所有这一切?

对,它确实:)

最后,我们可以看到我正在创建一个仅限数据的容器来保存我的mysql数据.我已声明:卷: - /var/lib/mysql

这个你错了:)正如所解释的,如果你没有给一个主机文件夹,那么Doc​​ker将坚持这条路径.但只有这个容器才会保留在docker文件系统中.什么都没有写入主机!只有在容器文件夹之前提供主机文件夹时才会发生这种情况!

希望这有助于:)