首页 文章

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

提问于
浏览
11

我在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创建的VM,对吗?还是我的本地macbook文件系统?将VM上的路径挂载到容器?

在网上我声明:

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

这是将我的macbook pro上的本地macbook文件系统./src文件夹映射到我的Web容器 . 如果我的理解是正确的,不应该将我的 VM 上的./src文件夹映射到Web容器中的/ 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文件夹?!为什么没有创建?我的配置有问题吗? :/

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

1 回答

  • 12

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

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

    原则上你可以通过Dockerfile的VOLUME指令声明这些卷(仍然不考虑你的计算机/流浪者本身,只是码头 Worker ;)) . 标准示例,运行一个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中,都将覆盖/ 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主目录下 . 在大多数情况下,这将解决我在一段时间内发现的问题 . 顺便说一句: No need to declare full paths to volumes ./folder is fine and read relative to the place your docker-compose.yml resides!

    只需将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文件系统中 . 什么都没有写入主机!只有在容器文件夹之前提供主机文件夹时才会发生这种情况!

    希望这有助于:)

相关问题