我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的Docker容器?


当前回答

在Fujimoto Youichi的例子中,test01是一个容器,而test02是一个图像。

在运行docker之前,你可以删除原来的容器,然后重新给容器分配相同的名称:

$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01

(使用-P将端口暴露给随机端口,而不是手动分配)。

其他回答

如果你不适应Docker深度配置,iptables将是你的朋友。

iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}

iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}

iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}

这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。

如果“现有”指的是“正在运行”,那么(目前)不可能添加端口映射。

然而,如果你需要在一个运行的容器中公开一个服务,而不需要停止/重新启动它,你可以动态地添加一个新的网络接口,例如管道。

我对这个问题也很感兴趣。

正如@Thasmo提到的,端口转发只能通过docker run(和docker create)命令指定。 其他命令,docker start没有-p选项,docker port只显示当前转发。

要添加端口转发,我总是遵循以下步骤,

停止运行容器 Docker停止test01 提交容器 Docker提交test01 test02 注意:上面的test02是我从test01容器构建的一个新映像。 从已提交的映像重新运行 Docker运行-p 8080:8080 -td test02

其中第一个8080是本地端口,第二个8080是集装箱端口。

对于Windows和Mac用户,还有另一种非常简单友好的方法来更改映射端口:

下载kitematic 进入容器的“设置”页面,在“端口”页签中,可以直接在那里修改已发布的端口。 再次启动容器

如何将端口映射分配到现有的Docker容器?

这很简单。有两件事,一个是本地服务器端口,如800,8080等在你的机器上,第二个是你的容器端口,你想映射。Docker端口映射

 docker run -p 8080:8080 <Image ID> 

要获得图像Id,您可以使用

docker ps