Docker:MacOSX将容器端口暴露给主机

在我的工作中,我使用--net=host和选项--net=host像一个将docker集装箱端口转发给机器的魅力一样工作。 这允许我通过示例添加使用特定端口的grunt任务:

  • 在港口9001服务我的覆盖报告
  • 我的应用程序的本地部署版本在端口9000中服务
  • 一只手performance场重新加载港口35729
  • 对于unit testing运行使用9876端口

当我开始在Mac中使用Docker时,我遇到的第一个问题是:选项--net=host不再工作。 我研究,我明白为什么这是不可能的(Mac中的Docker运行在自己的虚拟机),我的一时的解决scheme是使用-p选项来暴露端口,但是这限制了我添加越来越多的使用端口的任务因为我需要运行显式-p命令为每个端口,我需要公开。

任何人有这个相同的问题? 如何处理这个?

你的问题很可能是你正在使用dockertoolbox或dhingy / dlite或其他提供了一个完整的Linux VM ,然后主持docker运行你的容器在这个虚拟机。 当然,这个虚拟机有自己的networking堆栈和主机上的IP,这就是你的工具将会遇到的问题。 容器的暴露端口不会暴露于OSX host localhost ,而是OSX Docker-VM-ip

为了解决这些问题,优雅

从容器公开端口到OSX localhost

  1. 首先,使用/安装docker-for-mac https://docs.docker.com/engine/installation/mac/而不是dockertoolbox或其他。 它基于一个特殊的xhyve堆栈重用您的主机networking堆栈
  2. 当你现在执行docker run -p 3306:3306 percona ,它将在osx-host-localhost上绑定3306,因此试图连接到localhost:3306的每一个其他osx-tool都将工作(非常有用),就像你已经习惯它在你安装mysql时使用brew install mysql或者类似的
  3. 如果你遇到与Docker容器在OSX上的代码共享的性能问题,请检查http://docker-sync.io – 它与docker-for-mac兼容(提示:我偏爱这个)

将OSX主机的端口导出到收件人

你并不真正导出任何东西,而是让它们作为一个整体从所有容器(OSX-host-localhost的所有端口)访问,

如果你想连接到你在OSX主机上提供的端口,例如在xdebug会话期间,你的IDE 在OSX-host-localhost上的端口9000 侦听,运行FPM / PHP的容器应该连接到这个端口 osx-localhost:9000在mac上,你需要这样做: https : //gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c

所以你创build了一个虚拟的loopback ip,这样你就可以使用10.254.254.254:9000从没有容器的地方访问你的OSX主机端口 – 这是可移植的,基本上给你所有你需要开发的东西,就像你用过的


因此,您可以将连接到容器公开的端口连接到在Mac上运行的应用程序,并尝试连接到localhost:port

第二个反过来,如果在容器中的东西要附加到主机端口。

在“将容器端口绑定到主机 ”中提到的一种解决方法是使用-P

(或--publish-all=true|false )到--publish-all=true|false docker run ,这是一个一揽子操作,用图像的Dockerfile中的EXPOSE行标识每个端口,或者--expose <port>命令行标志并将其映射到主机端口一个短暂的港口范围。
然后需要使用docker port命令来检查创build的映射。

因此,如果您的应用程序可以使用docker port <CONTAINER>来检索映射端口,则可以根据需要添加任意数量的容器,并以这种方式获取映射端口(不需要为每个端口-p “explicit -p命令”)。

不知道如果docker的Mac可以支持双向连接以后https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-host-and-container-in -the-未来/ 19871

我有两个解决scheme:

  1. 您可以编写一个简单的包装脚本,并将要公开的端口传递给脚本
  2. 使用vagrant启动一个networking受控的虚拟机。