jjzjj

mysql - Mac 上的 Docker 机器 : Cannot see mounted Volumes on docker host/docker-machine? 卷物理存储在哪里?

coder 2023-05-06 原文

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

这意味着我正在使用 docker-machine 创建我的虚拟机 boot2docker 驱动的主机机器,它将运行我的 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 Compose 文件文档在这里:http://docs.docker.com/compose/compose-file/

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

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

在网络下我声明:
volumes:
  - ./src:/var/www/html

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

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

最佳答案

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

让我们从 docker 卷是什么开始(此时尽量不要考虑您的 macbook 或 vagrant 机器。请注意,docker 使用不同的文件系统,此时它可能驻留在何处):
也许可以这样想象,Docker 中的每个卷本身只是 Docker 使用的内部文件系统的一部分。
容器可以使用这些卷,就像它们是“小硬盘”,可以由它们挂载并在它们之间共享(或由其中两个同时挂载,例如将某些 ftp 服务器的超快速版本挂载到两个客户端)或其他任何:P)。

原则上,您可以通过 Dockerfile 的 VOLUME 指令声明这些卷(仍然不考虑您的计算机/流浪者本身,只是 docker ;))。
标准示例,运行一个网络服务器容器,如下所示:

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 东西)。让我们先像在 native Linux 上运行一样讨论这个问题。

如果你要输入类似的东西:
volumes:
 - /home/myuser/folder:/folder

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

理论就这么多了:),事实上,您可能只需要以下建议即可让您的工作顺利进行:):

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

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

在尝试下面的第二种方法之前,只需尝试将容器卷放在 Mac 主目录下。随着时间的推移,这将在大多数情况下解决 MySQL 的问题。
顺便说一句:无需声明卷的完整路径 ./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 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 文件系统中。什么都没有写给主机!只有在容器文件夹之前提供主机文件夹时,才会发生这种情况!

希望这有帮助:)

关于mysql - Mac 上的 Docker 机器 : Cannot see mounted Volumes on docker host/docker-machine? 卷物理存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575351/

有关mysql - Mac 上的 Docker 机器 : Cannot see mounted Volumes on docker host/docker-machine? 卷物理存储在哪里?的更多相关文章

  1. ruby-on-rails - 如何在 mac os snow leopard 中升级 ruby​​ 和 rails - 2

    我想将我的MacSnowLeopardruby​​从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai

  2. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  6. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  7. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  8. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  9. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  10. ruby-on-rails - rails:为#<StateMachine::Machine:0xba3014ec> 调用了 protected 方法 `around_validation' - 2

    我正在尝试实现state_machinegem,在我的rails项目中,我安装了gem,然后我将“state”列添加到我的account_entries模型中:defchangeadd_column:account_entries,:state,:stringend然后在我的account_entries模型中,我添加了状态机初始方法,如下所示:state_machine:state,:initial=>:submitteddoend然后在我看来我显示时间进入状态:account_entry.state但是当我尝试从我的应用程序创建一个account_entry时,我得到了这个错误:p

随机推荐