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


当前回答

我的容器有这样的情况:

127.0.0.1:8050->8000

我用一个iptalbes规则解决了这个问题

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。使用docker inspect命令查找CONTAINER_IP。

要删除iptables规则,使用以下命令:

iptables -t nat -D DOCKER 1

其他回答

不确定是否可以应用端口映射运行的容器。您可以在运行容器时应用端口转发,这与创建新容器不同。

$ docker run -p <public_port>:<private_port> -d <image>  

将开始运行容器。本教程解释端口重定向。

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

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

如果你运行docker run <NAME>,它将生成一个新映像,这很可能不是你想要的。

如果你想改变当前的图像,请执行以下操作:

Docker ps a

获取目标容器的id,然后转到:

cd /var/lib/docker/containers/<conainerID><and then some:)>

停止容器:

docker stop <NAME>

更改文件

vi config.v2.json

"Config": {
    ....
    "ExposedPorts": {
        "80/tcp": {},
        "8888/tcp": {}
    },
    ....
},
"NetworkSettings": {
....
"Ports": {
     "80/tcp": [
         {
             "HostIp": "",
             "HostPort": "80"
         }
     ],

然后更改文件

vi hostconfig.json

"PortBindings": {
     "80/tcp": [
         {
             "HostIp": "",
             "HostPort": "80"
         }
     ],
     "8888/tcp": [
         {
             "HostIp": "",
             "HostPort": "8888"
         } 
     ]
 }

重新启动docker,它应该可以工作。

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

正如@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是集装箱端口。

集装箱岸吊法

如果有人正在使用portainer,我发现这个解决方案是“Gui友好和安全的”

去Portainer的集装箱 停止容器 选择“复制/编辑” 添加所需的端口并进行部署。 当被问到是替换还是取消时,选择替换。 享受生活