当前位置: 首页 > 知识库问答 >
问题:

Mac上的Docker机器:无法看到Docker主机/Docker-Machine上挂载的卷?卷物理存储在哪里?

田信然
2023-03-14

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

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

我想我遗漏了主机和卷概念的一些关键内容,因为它们引用了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 Compose file文档在此:http://docs.Docker.com/Compose/compose-file/

它将卷-挂载路径声明为卷,可选地指定主机上的路径(主机:容器)或访问模式(主机:容器:RO)。

在网页下,我声明:

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

共有1个答案

谷星文
2023-03-14

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

让我们从什么是docker卷开始(在这一点上,尽量不去想你的macbook或vagrant machine。只需记住docker使用的是一个不同的文件系统,在这一点上它可能驻留在哪里):也许可以这样想象,docker中的每一个卷本身就是docker使用的内部文件系统的一部分。容器可以使用这些卷,就像它们是“小硬盘”一样,可以由它们挂载,也可以在它们之间共享(或者由它们中的两个同时挂载,就像将某个ftp服务器的超快版本挂载到两个客户机或其他什么:p)。

原则上,您可以声明这些卷(仍然不考虑您的计算机/Vagrant本身,只考虑dockers;))通过DockerFile的卷指令。标准示例,运行一个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中声明卷。这可以通过从主机挂载卷来完成(在本例中是您的vagrant/boo2docker工具)。让我们先像在原生Linux上运行一样来讨论这个问题。

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

在docker-compose.yml中,这意味着/home/myuser/folder现在将挂载到docker中。它将覆盖docker在/folder中的任何内容,并且就像/www一样,也可以从声明它的东西访问它。现在是运行docker守护进程的Linux机器。

理论就讲到这里了:),事实上,你可能只需要以下建议就可以让你的东西运转起来:):

boot2docker/docker-machine/kitematic和所有这些东西处理这个问题的方式很简单,它们首先只是将vagrant机器中的一个卷挂载到docker容器中,并且它们也只是将这个东西挂载到Mac文件系统中,希望它都能解决问题:p

现在,我们所有人在Mac上使用这个(或者只是试图帮助他们的同事进入sweet sweet Docker:p)的实际问题是权限问题。我的意思是想一想(root或其他用户处理容器中的文件,vagrant用户可能处理vagrant主机中的文件,然后你的Mac用户“skalfyfan”处理Mac中的文件。他们都有不同的用户ID和whatnot=>随之而来的许多问题,这在一定程度上取决于你在Docker中实际运行的内容。Mysql和Apache特别痛苦,因为他们不在容器中以root身份运行。这意味着,他们经常在写入Mac文件系统时遇到麻烦。

在尝试下面的第二种方法之前,只需尝试将容器卷放在Mac主目录下。这将解决MySQL在大多数情况下的问题,正如我一直以来所发现的那样。顺便说一句:不需要声明卷的完整路径。/folder很好,可以相对于docker-compose.yml所在的位置阅读!

只需将compose-yml放入Mac用户文件夹中,这才是最重要的。没有chmod 777-r:p会在这里帮助您,它只需要在您的主文件夹下:)

不过,有些应用程序(例如Apache)仍然会让你很难。在容器中运行的任何用户id与Mac用户id不同的事实将使你的生活陷入地狱。为了解决这个问题,您需要调整用户id以及用户组,使其与您的Mac权限不发生冲突。在Mac上您想要的组是staff,例如,工作的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数据。我已经声明:volumes:-/var/lib/mysql

 类似资料:
  • 问题内容: 我在一台Macbook Pro笔记本电脑上运行 docker-machine(0.5.0) 和 docker-compose(1.5.0) 以启动我的容器。 这意味着我正在使用docker-machine创建我的virtualbox boot2docker驱动的HOST计算机,它将运行我的docker守护程序并托管我的所有容器。 我认为我缺少关于HOSTS和VOLUME概念的关键内容,

  • 问题内容: 我刚刚检查了/ var / lib / docker / volumes文件夹,发现该文件夹正以名为Docker UUID的文件夹爆炸,每个文件夹都包含一个config.json文件,其内容与 哪里 是指向主机上的文件夹的路径,该主机已通过-v开关挂载到Docker容器上。我有这样的文件夹可以追溯到我对Docker进行实验的开始,即大约3周前。 有问题的容器很久以前就已停止并且dock

  • 问题内容: 我已经能够成功使用以下卷在Docker容器之间共享文件夹 但是我的问题是,这与在Dockerfile中使用命令之间有什么区别 我正在使用带有命令的图像,并且想知道如何与主机共享它。我已经使用上面的命令完成了此操作,但我不知道是否同时需要和和。 问题答案: 该命令将在您的容器中安装一个目录,并将在该目录中创建或编辑的所有文件存储 在容器文件结构外部的 主机磁盘上,绕过联合文件系统。 这个

  • 问题内容: 我正在运行一个Jenkins集群,其中在Master和Slave中,它们都作为Docker容器运行。 主机是在MacOS上运行的最新的boot2docker VM。 为了使Jenkins能够使用Docker执行部署,我将docker.sock和docker客户端从主机安装到Jenkins容器,如下所示: 在将卷装载到Jenkins容器中运行的Docker容器时,我遇到了问题。例如,如果

  • 问题内容: 我最近创建了一个在Windows上的boot2docker上运行的mongodb docker实例。 不幸的是,在尝试kitematic的过程中,我意外地从mongo容器中删除了该卷,并且无法再访问我的数据。 mongo实例似乎创建了一个新卷,而旧卷现在仍悬空(孤立)并且未安装在任何容器中。 有什么办法可以恢复吗? 问题答案: 感谢您的答复,它使我处于正确的轨道,我设法使用以下命令启动