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


当前回答

如果你运行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,它应该可以工作。

其他回答

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

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

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

我们可以使用方便的工具,如SSH来轻松完成这一任务。

我使用ubuntu主机和基于docker镜像的ubuntu。

在docker内部安装了openssh-client。 外部docker(主机)安装了openssh-server服务器。

当需要绘制一个新端口时,

在docker中运行以下命令

ssh -R8888:localhost:8888 <username>@172.17.0.1

其中“172.17.0.1”为docker接口的IP (你可以通过跑步得到这个 Ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" " on the host)。

在这里,我有本地8888端口映射回主机8888。您可以根据需要更改端口。

如果您还需要一个端口,您可以终止ssh,并使用新端口向其添加多一行-R。

我已经用netcat测试过了。

如果你不适应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}

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

如果你运行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,它应该可以工作。

集装箱岸吊法

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

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