Docker:MacOSX 向主机公开容器端口

Docker: MacOSX Expose Container ports to host machine

在我的工作中,我使用 docker 和选项 --net=host 工作得很好,将 docker 容器端口转发到机器。这允许我通过示例添加使用某些端口的 g运行t 任务:

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

有人遇到同样的问题吗?如何处理这个?

Bind container ports to the host”中提到的一种解决方法是使用 -P:

(or --publish-all=true|false) to docker run which is a blanket operation that identifies every port with an EXPOSE line in the image’s Dockerfile or --expose <port> commandline flag and maps it to a host port somewhere within an ephemeral port range.
The docker port command then needs to be used to inspect created mapping.

因此,如果您的应用可以使用 docker port <CONTAINER> 检索映射端口,您可以根据需要添加任意数量的容器并以这种方式获取映射端口(不需要 "explicit -p command for each port")。

不确定 docker for mac 以后是否可以支持双向连接 https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-host-and-container-in-the-future/19871

我有两个解决方案:

  1. 你可以写一个简单的包装器脚本,然后将你想要公开的端口传递给脚本
  2. 使用 vagrant 启动虚拟 machine 并控制网络。

您的问题很可能是您正在使用 docker 工具箱或 dhingy/dlite 或任何其他提供 完整 linux VM ,然后将 docker 托管到 运行 您在此虚拟机中的容器。当然,这个虚拟机在主机上有自己的网络堆栈和自己的 IP,这就是你的工具会遇到问题的地方。容器的暴露端口没有暴露给OSX host localhost,而是OSX Docker-VM-ip.

优雅地解决这些问题

从容器

向OSXlocalhost公开端口
  1. 首先,use/install docker-for-mac https://docs.docker.com/engine/installation/mac/ 而不是 dockertoolbox 或其他。它基于一个特殊的 xhyve 栈,它重用了你的主机网络栈
  2. 当您现在执行 docker run -p 3306:3306 percona 时,它将在 osx-host-localhost 上绑定 3306,因此所有其他试图附加到 localhost:3306 的 osx-工具都将起作用(非常有用) 就像您使用 brew install mysql 或类似的
  3. 安装 mysql 时一样
  4. 如果您在使用 docker 容器的 OSX 上遇到代码共享的性能问题,请检查 http://docker-sync.io - 它与 docker-for-[=69= 兼容](提示:我对这个有偏见)

从 OSX-host 导出端口到容器

您实际上并没有特别导出任何东西,而是让它们可以从所有容器(OSX-host-localhost 的所有端口)作为一个整体访问

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

所以你创建了一个虚拟环回 ip,这样你就可以在没有容器的情况下使用 10.254.254.254:9000 访问你的 OSX-host 端口 - 这是可移植的,基本上可以为你提供像你一样开发所需的一切习惯了


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

第二个则相反,如果容器中的某些东西想要附加到主机上的端口。