在我的工作中,我使用docker和选项--net=host
,就像一个将Docker容器端口转发到机器的魅力。这允许我通过示例添加使用某些端口的grunt任务:
当我开始在Mac中使用Docker时,我遇到的第一个问题是:选项--net=host
不再起作用了。
我研究并且理解为什么这是不可能的(Mac中的Docker在自己的虚拟机中运行)和我的瞬间解决方案它使用-p
选项来暴露端口,但这限制了我添加越来越多的任务使用端口,因为我需要为每个需要公开的端口运行显式-p
命令。
有同样问题的人吗?如何处理?
答案 0 :(得分:5)
您的问题很可能是您正在使用dockertoolbox或dhingy / dlite或提供成熟的Linux VM 的任何其他内容,然后托管docker在此VM中运行您的容器。当然,这个VM在主机上有自己的网络堆栈和自己的IP,这就是你的工具会遇到的问题。容器的暴露端口不会暴露给OSX host localhost
,而是OSX Docker-VM-ip
。
优雅地解决这些问题
localhost
docker run -p 3306:3306 percona
它将绑定osx-host-localhost
上的3306,因此每个其他尝试连接到localhost:3306的osx工具都会工作(非常有用)就像你习惯了当你使用brew install mysql
或类似的你并没有真正导出任何东西,你宁愿让它们从所有容器(OSX-host-localhost的所有端口)整体访问
如果您想附加到您在OSX主机上提供的端口,来自容器,例如在xdebug会话期间,您的IDE侦听OSX-host-localhost 上的端口9000 ,并且运行FPM / PHP的容器应该附加到此osx-localhost:9000上mac,你需要这样做:https://gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c
所以你创建了一个虚拟环回ip,所以你可以使用10.254.254.254:9000从无容器访问你的OSX主机端口 - 这是可移植的,基本上为你提供了你曾经需要的所有开发
因此,您可以连接到容器公开的端口,连接到运行在Mac上的应用程序并尝试连接到localhost:port
如果容器中的某些东西想要附加到主机上的端口,那么第二个就是反向。
答案 1 :(得分:2)
“Bind container ports to the host”中提到的一种解决方法是使用-P
:
(或
--publish-all=true|false
)到docker run
这是一个一揽子操作,用于在图像的Dockerfile或EXPOSE
命令行标记中标识--expose <port>
行的每个端口,并将其映射到一个临时端口范围内的主机端口。
然后需要使用docker port
命令检查创建的映射。
因此,如果您的应用可以使用docker port <CONTAINER>
来检索映射端口,您可以根据需要添加任意数量的容器并以此方式获取映射端口(不需要为每个容器提供“显式-p
命令端口“)。
答案 2 :(得分:1)
不确定mac的docker是否可以支持以后的双向连接https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-host-and-container-in-the-future/19871
我有两个解决方案: