我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的Docker容器?
当前回答
在Fujimoto Youichi的例子中,test01是一个容器,而test02是一个图像。
在运行docker之前,你可以删除原来的容器,然后重新给容器分配相同的名称:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(使用-P将端口暴露给随机端口,而不是手动分配)。
其他回答
编辑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;
}
如果你不适应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}
这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。
我们可以使用方便的工具,如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测试过了。
我的容器有这样的情况:
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注册表中删除图像?
- 创建多个标签码头镜像
- Docker -如何将文件从镜像复制到主机?
- 如何防止docker在系统启动时自动启动容器?
- 什么是Docker映像“层”?
- 无法从docker-compose连接到docker
- Docker错误无法删除Docker容器,冲突:无法删除存储库引用
- 如何让容器在Kubernetes上运行?
- 如何备份docker容器的数据卷?
- Docker入口点运行bash脚本被“拒绝权限”
- 我如何复制Docker作为非根?
- 如何禁用容器上的自动重启?
- 如何传递参数到Dockerfile?
- 如何知道docker是否已经登录到docker注册服务器
- 为什么安装了Docker而没有安装Docker Compose?