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

742

我不确定是否理解有误,但似乎只能通过从镜像创建新的容器来设置端口映射。是否存在一种方式可以将端口映射分配给现有的Docker容器?


4
使用iptables可能会像这个答案所示的方式操作在运行中的Docker容器上公开端口 - Choldrim
6
我猜测这是故意设计的。Docker试图强制使您的操作“可重现”,容器是一种“记录系统”。任何不影响容器的手动步骤都可能会轻易丢失。换句话说:您希望容器代表所有必要的配置才能运作。因此,如果您想打开一个新端口,则需要创建一个新容器。 - Lance Kind
4
这是一个老问题,我不会回答它,但我想说的是,也许你和点赞这个问题和答案的人完全误解了docker的概念。Docker适用于无状态应用程序,可以多次扩展或缩小。在不能重新创建的生产环境中,您永远不应该将某些东西持久化到容器内,如果需要持久化,请映射目录。Docker不是像“轻量级虚拟机”那样的东西,也许你要找的是linuxcontainers.org,lxd基于docker概念,但考虑了“轻量级虚拟机”的概念。 - Edgar Carvalho
如果有帮助的话,可以使用“Kitematic”工具向已运行的容器添加端口映射。这意味着必须有Docker命令来完成完全相同的事情,只需要进行一些谷歌搜索即可 :) 祝好运 - Yaffah
15个回答

7

使用PORTAINER的方法

如果有人在使用Portainer,则我发现此解决方案“用户友好且安全”。

  1. 进入Portainer中的容器
  2. 停止容器
  3. 选择“复制/编辑”enter image description here
  4. 添加所需端口并部署。
  5. 当询问是否替换或取消时,选择替换。List item
  6. 享受生活

该方法是在以下YouTube视频中使用的,该视频解释了使用Docker进行VPN绑定(使用Portainer)。https://www.youtube.com/watch?v=vUyHGF1HMsw - MrMesees

6
  1. 停止 Docker 引擎和容器。
  2. 进入 /var/lib/docker/containers/${container_id} 目录并编辑 hostconfig.json 文件。
  3. 修改想要更改的 PortBindings.HostPort
  4. 启动 Docker 引擎和容器。

3

我有一个容器的情况:

127.0.0.1:8050->8000

我用一条iptables规则解决了这个问题:

iptables -t nat -I DOCKER 1 -p tcp --dport ${HOST_PORT} -j DNAT --to-destination ${CONTAINER_IP}:${CONTAINER_PORT}

在这个例子中,HOST_PORT为8050,CONTAINER_PORT为8000。要找到CONTAINER_IP,请使用docker inspect命令。
要删除iptables规则,请使用以下命令:
iptables -t nat -D DOCKER 1

-1

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

  1. 下载Kitematic

  2. 进入容器的设置页面,在“端口”选项卡上,您可以直接修改发布的端口。

  3. 重新启动容器


6
我尝试了这个方法,Kinematic应用了端口映射。但是为了应用它们,它重新创建了我原始镜像中的容器。因此,如果你担心丢失在容器本身中所做的更改,请不要使用此方法。 - VeganHunter
1
我更喜欢这个,虽然它没有回答问题,而且它创建了一个新的容器。但至少它能工作,而且这个SO结果在我的搜索中出现了。+1 - 2b77bee6-5445-4c77-b1eb-4df3e5

-11
如何为现有的Docker容器分配端口映射?
非常简单。有两个要素,一个是本地服务器端口,例如800、8080等,在您的计算机上;另一个是您想要映射的容器端口。Docker端口映射
 docker run -p 8080:8080 <Image ID> 

要获取图像ID,您可以使用以下代码:

docker ps

2
这并没有回答问题,因为 OP 问的是是否可以重新分配一个 已存在 的容器一个新的端口。使用 run 会创建一个新的容器。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接