Docker:MacOSX 向主机公开容器端口
Docker: MacOSX Expose Container ports to host machine
在我的工作中,我使用 docker 和选项 --net=host
工作得很好,将 docker 容器端口转发到机器。这允许我通过示例添加使用某些端口的 g运行t 任务:
- 在 9001 端口提供我的覆盖率报告的任务
- 我的应用程序的本地部署版本在端口 9000 中提供服务
- 直播重载35729端口
- 用于单元测试运行请使用 9876 端口
当我开始在 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
我有两个解决方案:
- 你可以写一个简单的包装器脚本,然后将你想要公开的端口传递给脚本
- 使用 vagrant 启动虚拟 machine 并控制网络。
您的问题很可能是您正在使用 docker 工具箱或 dhingy/dlite 或任何其他提供 完整 linux VM ,然后将 docker 托管到 运行 您在此虚拟机中的容器。当然,这个虚拟机在主机上有自己的网络堆栈和自己的 IP,这就是你的工具会遇到问题的地方。容器的暴露端口没有暴露给OSX host localhost
,而是OSX Docker-VM-ip
.
优雅地解决这些问题
从容器
向OSXlocalhost
公开端口
- 首先,use/install docker-for-mac https://docs.docker.com/engine/installation/mac/ 而不是 dockertoolbox 或其他。它基于一个特殊的 xhyve 栈,它重用了你的主机网络栈
- 当您现在执行
docker run -p 3306:3306 percona
时,它将在 osx-host-localhost
上绑定 3306,因此所有其他试图附加到 localhost:3306 的 osx-工具都将起作用(非常有用) 就像您使用 brew install mysql
或类似的 安装 mysql 时一样
- 如果您在使用 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
第二个则相反,如果容器中的某些东西想要附加到主机上的端口。
在我的工作中,我使用 docker 和选项 --net=host
工作得很好,将 docker 容器端口转发到机器。这允许我通过示例添加使用某些端口的 g运行t 任务:
- 在 9001 端口提供我的覆盖率报告的任务
- 我的应用程序的本地部署版本在端口 9000 中提供服务
- 直播重载35729端口
- 用于单元测试运行请使用 9876 端口
当我开始在 Mac 中使用 Docker 时,我遇到的第一个问题是:选项 --net=host
不再起作用。
我研究了并且我明白为什么这是不可能的(Docker in Mac 运行s 在自己的虚拟机中)和我的临时解决方案它使用 -p
选项来公开端口,但这限制了我添加越来越多使用端口的任务,因为我需要 运行 显式 -p
命令用于我需要公开的每个端口。
有人遇到同样的问题吗?如何处理这个?
“Bind container ports to the host”中提到的一种解决方法是使用 -P
:
(or
--publish-all=true|false
) todocker run
which is a blanket operation that identifies every port with anEXPOSE
line in the image’s Dockerfile or--expose <port>
commandline flag and maps it to a host port somewhere within an ephemeral port range.
Thedocker 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
我有两个解决方案:
- 你可以写一个简单的包装器脚本,然后将你想要公开的端口传递给脚本
- 使用 vagrant 启动虚拟 machine 并控制网络。
您的问题很可能是您正在使用 docker 工具箱或 dhingy/dlite 或任何其他提供 完整 linux VM ,然后将 docker 托管到 运行 您在此虚拟机中的容器。当然,这个虚拟机在主机上有自己的网络堆栈和自己的 IP,这就是你的工具会遇到问题的地方。容器的暴露端口没有暴露给OSX host localhost
,而是OSX Docker-VM-ip
.
优雅地解决这些问题
从容器
向OSXlocalhost
公开端口
- 首先,use/install docker-for-mac https://docs.docker.com/engine/installation/mac/ 而不是 dockertoolbox 或其他。它基于一个特殊的 xhyve 栈,它重用了你的主机网络栈
- 当您现在执行
docker run -p 3306:3306 percona
时,它将在osx-host-localhost
上绑定 3306,因此所有其他试图附加到 localhost:3306 的 osx-工具都将起作用(非常有用) 就像您使用brew install mysql
或类似的 安装 mysql 时一样
- 如果您在使用 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
第二个则相反,如果容器中的某些东西想要附加到主机上的端口。