在实时 Docker 容器上公开端口

新手上路,请多包涵

我正在尝试创建一个充当完整虚拟机的 Docker 容器。我知道我可以使用 Dockerfile 中的 EXPOSE 指令来公开端口,并且可以使用 -p 标志和 docker run 来分配端口,但是一旦容器实际运行,就是有打开/映射其他端口的命令吗?

例如,假设我有一个运行 sshd 的 Docker 容器。其他人使用容器 ssh 并安装 httpd。有没有办法把容器上的80端口暴露出来,映射到宿主机上的8080端口,这样人们就可以访问容器中运行的web服务器,而不需要重启呢?

原文由 reberhardt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 538
2 个回答

您无法通过 Docker 执行此操作,但您可以从主机访问容器的未公开端口。

如果您有一个容器在其端口 8000 上运行某些东西,您可以运行

wget http://container_ip:8000

要获取容器的 IP 地址,请运行 2 个命令:

 docker ps
docker inspect container_name | grep IPAddress

在内部,当您运行映像时,Docker 会调用 iptables,因此可能对此进行一些变体。

要在本地主机的端口 8001 上公开容器的端口 8000:

 iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

解决此问题的一种方法是使用所需的端口映射设置另一个容器,并比较 iptables-save 命令的输出(不过,我必须删除一些其他强制流量通过 docker 代理的选项)。

注意:这是颠覆 docker,所以应该意识到它可能会产生蓝烟。

或者

另一种选择是查看(新?发布 0.6.6?) -P 选项 - 它将使用随机主机端口,然后将它们连接起来。

或者

在 0.6.5 中,您可以使用 LINKs 功能来调出一个与现有容器对话的新容器,并通过一些额外的中继到该容器的 -p 标志? (我还没有使用链接。)

或者

使用 docker 0.11?您可以使用 docker run --net host .. 将您的容器直接附加到主机的网络接口(即 net 没有命名空间),因此您在容器中打开的 所有 端口都被公开。

原文由 SvenDowideit 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我要做的:

  • 提交实时容器。
  • 使用新映像再次运行容器,并打开端口(我建议安装共享卷并打开 ssh 端口)
 sudo docker ps
sudo docker commit <containerid> <foo/live>
sudo docker run -i -p 22 -p 8000:80 -m /data:/data -t <foo/live> /bin/bash

原文由 bosky101 发布,翻译遵循 CC BY-SA 3.0 许可协议

logo
Stack Overflow 翻译
子站问答
访问
宣传栏