我正在尝试创建一个充当完整虚拟机的 Docker 容器。我知道我可以使用 Dockerfile 中的 EXPOSE 指令来公开端口,并且可以使用 -p
标志和 docker run
来分配端口,但是一旦容器实际运行,就是有打开/映射其他端口的命令吗?
例如,假设我有一个运行 sshd 的 Docker 容器。其他人使用容器 ssh 并安装 httpd。有没有办法把容器上的80端口暴露出来,映射到宿主机上的8080端口,这样人们就可以访问容器中运行的web服务器,而不需要重启呢?
原文由 reberhardt 发布,翻译遵循 CC BY-SA 4.0 许可协议
您无法通过 Docker 执行此操作,但您可以从主机访问容器的未公开端口。
如果您有一个容器在其端口 8000 上运行某些东西,您可以运行
要获取容器的 IP 地址,请运行 2 个命令:
在内部,当您运行映像时,Docker 会调用 iptables,因此可能对此进行一些变体。
要在本地主机的端口 8001 上公开容器的端口 8000:
解决此问题的一种方法是使用所需的端口映射设置另一个容器,并比较 iptables-save 命令的输出(不过,我必须删除一些其他强制流量通过 docker 代理的选项)。
注意:这是颠覆 docker,所以应该意识到它可能会产生蓝烟。
或者
另一种选择是查看(新?发布 0.6.6?) -P 选项 - 它将使用随机主机端口,然后将它们连接起来。
或者
在 0.6.5 中,您可以使用 LINKs 功能来调出一个与现有容器对话的新容器,并通过一些额外的中继到该容器的 -p 标志? (我还没有使用链接。)
或者
使用 docker 0.11?您可以使用
docker run --net host ..
将您的容器直接附加到主机的网络接口(即 net 没有命名空间),因此您在容器中打开的 所有 端口都被公开。