问题

我正在尝试创建一个像full-on虚拟机一样的Docker容器.我知道我可以在Dockerfile中使用EXPOSE指令暴露端口,我可以使用-p标志与docker run分配端口,但一旦容器实际运行,是否有命令打开/映射附加端口存在?

例如,假设我有一个运行sshd的Docker容器.还有人使用容器ssh进入并安装httpd.有没有办法在容器上公开端口80并将其映射到主机上的端口8080,以便人们可以访问在容器中运行的Web服务器,而不重新启动它?

  最佳答案

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

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

 wget http://container_ip:8000
 

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

 docker ps

docker inspect container_name | grep IPAddress
 

在内部,当您运行图像时,Docker shell将调用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,因此应该认识到它很可能产生蓝烟

要么

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

要么

使用0.6.5,您可以使用链接功能来创建一个新的容器,该容器与现有容器会谈,并附加一些转发到该容器的-p标志? (我还没有使用链接)

要么

使用docker 0.11?您可以使用docker run --net host ..将容器直接附加到主机的网络接口(即,net不是name-间隔),从而暴露在容器中打开的所有端口.

  相同标签的其他问题

docker