我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的Docker容器?
当前回答
我们可以使用方便的工具,如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测试过了。
其他回答
编辑hostconfig。Json现在似乎不工作。它只以暴露该端口而不将其发布到主机而结束。提交和重新创建容器对我来说不是最好的方法。没人提到docker网络吗?
最好的解决方案是在同一网络中使用反向代理
Create a new network if your previous container not in any named ones. docker network create my_network Join your existing container to the created network docker network connect my_network my_existing_container Start a reversed proxy service(e.g. nginx) publishing the ports you need, joining the same network docker run -d --name nginx --network my_network -p 9000:9000 nginx Optionally remove the default.conf in nginx docker exec nginx rm /etc/nginx/conf.d/default.conf Create a new nginx config server { listen 9000; location / { proxy_pass http://my_existing_container:9000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } Copy the config to nginx container. docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf Restart nginx docker restart nginx
优点:要发布新端口,你可以安全地停止/更新/重新创建nginx容器,而不需要触及业务容器。如果你需要nginx的零停机时间,可以添加更多的反向代理服务加入同一个网络。此外,一个容器可以加入多个网络。
编辑:
对于反向代理非http服务,配置文件有点不同。这里有一个简单的例子:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
对于Windows和Mac用户,还有另一种非常简单友好的方法来更改映射端口:
下载kitematic 进入容器的“设置”页面,在“端口”页签中,可以直接在那里修改已发布的端口。 再次启动容器
如果你不适应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容器?
这很简单。有两件事,一个是本地服务器端口,如800,8080等在你的机器上,第二个是你的容器端口,你想映射。Docker端口映射
docker run -p 8080:8080 <Image ID>
要获得图像Id,您可以使用
docker ps
不确定是否可以应用端口映射运行的容器。您可以在运行容器时应用端口转发,这与创建新容器不同。
$ docker run -p <public_port>:<private_port> -d <image>
将开始运行容器。本教程解释端口重定向。
推荐文章
- 从Docker容器获取环境变量
- E: gnupg, gnupg2和gnupg1似乎没有安装,但是这个操作需要其中一个
- 无法启动IIS Express Web服务器,注册URL失败,访问被拒绝
- 如何从docker更改默认docker注册表。IO到我的私人注册表?
- Docker- compose无法连接到Docker Daemon
- 单个命令停止和删除docker容器
- 使用GPU从docker容器?
- 如何使用本地映像作为dockerfile的基本映像?
- 谁能解释一下docker.sock
- 多重from是什么意思
- 通过映像名称停止Docker容器- Ubuntu
- 如果dockerfile的名称不是dockerfile,我如何构建一个dockerfile ?
- 我可以在/etc/hosts中映射主机名*和端口*吗?
- 如何修改Play执行run命令时使用的默认端口(9000)?
- 守护进程的错误响应:已被集装箱使用"