我不确定我是否在这里误解了一些东西,但似乎只能通过从图像创建一个新容器来设置端口映射 . 有没有办法将端口映射分配给现有的Docker容器?
如果您只想更改正在运行的容器的端口,请执行以下操作:
sudo docker stop NAME
sudo docker run -d -p 81:80 NAME
在哪里:
“-d”到background / deamon docker“-p”启用端口映射“81”外部(公开)端口,用于访问浏览器“80”内部docker容器监听端口
作为response @Fujimoto-Youichi的补充
您也可以在创建容器时使用 $ docker run -P CONTAINER 随机映射端口,但要注意安全性!
$ docker run -P CONTAINER
-P eq to --publish-all:“它将所有暴露的端口发布到随机端口”,
然后运行 docker inspect CONTAINER 到fin端口映射,如下图所示:
docker inspect CONTAINER
.
了解 docker run -P 的更多信息docker run
docker run -P
您可以通过直接编辑 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json 处的 hostconfig.json 文件来更改端口映射
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
hostconfig.json
您可以通过 docker inspect <container_name> 命令确定[hash_of_the_container],"Id"字段的值是哈希值 .
docker inspect <container_name>
1) stop the container 2) change the file 3) restart your docker engine (to flush/clear config caches) 4) start the container
因此,您无需使用此方法创建图像 . 您也可以在此处更改重启标志 .
附:您可以访问https://docs.docker.com/engine/admin/以了解如何根据主机正确重启docker引擎 . 我使用 sudo systemctl restart docker 重新启动在Ubuntu 16.04上运行的docker引擎
sudo systemctl restart docker
我也对这个问题感兴趣 .
如上所述@Thasmo,只能使用 docker run 命令指定端口转发 .其他命令 docker start 没有 -p 选项, docker port 仅显示当前转发 .
docker run
docker start
-p
docker port
要添加端口转发,我始终按照以下步骤操作:
docker stop test01
docker commit test01 test02
NOTE: 以上, test02 是我正在从 test01 容器构建的新图像 .
test02
test01
从提交的图像
docker run -p 8080:8080 -td test02
第一个8080是本地端口,第二个8080是集装箱端口 .
如果你对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”,它将生成一个新图像 .
如果要更改当前图像,请执行以下操作
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它应该工作
如果“现有”是指“正在运行”,那么(目前)不可能添加端口映射 .
但是,您可以动态添加新的网络接口,例如, Pipework,如果需要在正在运行的容器中公开服务而不停止/重新启动它 .
在Fujimoto Youichi的例子中, test01 是一个容器,而 test02 是一个图像 .
在执行 docker run 之前,您可以删除原始容器,然后再次为容器指定相同的名称:
$ docker stop container01 $ docker commit container01 image01 $ docker rm container01 $ docker run -d -P --name container01 image01
(使用 -P 将端口暴露给随机端口而不是手动分配) .
-P
不确定是否可以将端口映射应用于正在运行的容器 . 您可以在运行与创建新容器不同的容器时应用端口转发 .
$ docker run -p <public_port>:<private_port> -d <image>
将开始运行容器 . This tutorial解释了端口重定向 .
编辑hostconfig.json似乎现在无法正常工作 . 它只会以暴露但未发布到主机的端口结束 . 承诺和重新创建容器对我来说不是最好的方法 . 没人提到 docker network ?
docker network
The best solution would be using reversed proxy within the same network
docker network create my_network
docker network connect my_network my_existing_container
docker run -d --name nginx --network my_network -p 9000:9000 nginx
(可选)删除nginx中的default.conf
docker exec nginx rm /etc/nginx/conf.d/default.conf
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; } }
将配置复制到nginx容器 .
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
docker restart nginx
Advantages :要发布新端口,您可以根据需要安全地停止/更新/重新创建nginx容器,而无需触及业务容器 . 如果nginx需要零停机时间,则可以添加更多反向代理服务加入同一网络 . 此外,容器可以加入多个网络 .
编辑:
要反向代理非http服务,配置文件有点不同 . 这是一个简单的例子:
upstream my_service { server my_existing_container:9000; } server { listen 9000; proxy_pass my_service; }
对于Windows和Mac用户,现在有另一种非常简单友好的方式来更改映射端口:
下载kitematic进入容器的设置页面,在ports选项卡上,可以直接修改已发布的端口 . 再次启动容器
我们使用像ssh这样的方便工具来轻松实现这一目标 .
我使用的是ubuntu主机和基于ubuntu的docker镜像 .
内部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" " 来获得这个) .
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
在这里,我将本地8888端口映射回主机8888.您可以根据需要更改端口 .
如果你还需要一个端口,你可以杀死ssh并使用新端口再添加一行-R .
我用netcat测试了这个 .
12 回答
如果您只想更改正在运行的容器的端口,请执行以下操作:
在哪里:
作为response @Fujimoto-Youichi的补充
您也可以在创建容器时使用
$ docker run -P CONTAINER
随机映射端口,但要注意安全性!然后运行
docker inspect CONTAINER
到fin端口映射,如下图所示:.
了解
docker run -P
的更多信息docker run您可以通过直接编辑
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
处的hostconfig.json
文件来更改端口映射您可以通过
docker inspect <container_name>
命令确定[hash_of_the_container],"Id"字段的值是哈希值 .因此,您无需使用此方法创建图像 . 您也可以在此处更改重启标志 .
附:您可以访问https://docs.docker.com/engine/admin/以了解如何根据主机正确重启docker引擎 . 我使用
sudo systemctl restart docker
重新启动在Ubuntu 16.04上运行的docker引擎我也对这个问题感兴趣 .
如上所述@Thasmo,只能使用
docker run
命令指定端口转发 .其他命令
docker start
没有-p
选项,docker port
仅显示当前转发 .要添加端口转发,我始终按照以下步骤操作:
NOTE: 以上,
test02
是我正在从test01
容器构建的新图像 .从提交的图像
第一个8080是本地端口,第二个8080是集装箱端口 .
如果你对Docker深度配置IPtables不满意,那么你的另一种方式就是你的朋友 .
这只是一个技巧而不是推荐的方式,这适用于我的场景,因为我无法阻止容器,我希望也会帮助你 .
我不能相信一页中有多少错误的答案 . 如果您执行“docker run”,它将生成一个新图像 .
如果要更改当前图像,请执行以下操作
docker ps -a
取容器ID并转到
停止容器
更改文件
并更改文件
重新启动你的docker它应该工作
如果“现有”是指“正在运行”,那么(目前)不可能添加端口映射 .
但是,您可以动态添加新的网络接口,例如, Pipework,如果需要在正在运行的容器中公开服务而不停止/重新启动它 .
在Fujimoto Youichi的例子中,
test01
是一个容器,而test02
是一个图像 .在执行
docker run
之前,您可以删除原始容器,然后再次为容器指定相同的名称:(使用
-P
将端口暴露给随机端口而不是手动分配) .不确定是否可以将端口映射应用于正在运行的容器 . 您可以在运行与创建新容器不同的容器时应用端口转发 .
将开始运行容器 . This tutorial解释了端口重定向 .
编辑hostconfig.json似乎现在无法正常工作 . 它只会以暴露但未发布到主机的端口结束 . 承诺和重新创建容器对我来说不是最好的方法 . 没人提到
docker network
?The best solution would be using reversed proxy within the same network
docker network create my_network
docker network connect my_network my_existing_container
docker run -d --name nginx --network my_network -p 9000:9000 nginx
(可选)删除nginx中的default.conf
docker exec nginx rm /etc/nginx/conf.d/default.conf
将配置复制到nginx容器 .
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
docker restart nginx
Advantages :要发布新端口,您可以根据需要安全地停止/更新/重新创建nginx容器,而无需触及业务容器 . 如果nginx需要零停机时间,则可以添加更多反向代理服务加入同一网络 . 此外,容器可以加入多个网络 .
编辑:
要反向代理非http服务,配置文件有点不同 . 这是一个简单的例子:
对于Windows和Mac用户,现在有另一种非常简单友好的方式来更改映射端口:
我们使用像ssh这样的方便工具来轻松实现这一目标 .
我使用的是ubuntu主机和基于ubuntu的docker镜像 .
内部docker已安装openssh-client .
外部docker(主机)安装了openssh-server服务器 .
当需要映射出新端口时,
在 - 的里面docker运行以下命令
172.17.0.1是docker接口的ip(你可以通过在主机上运行
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
来获得这个) .在这里,我将本地8888端口映射回主机8888.您可以根据需要更改端口 .
如果你还需要一个端口,你可以杀死ssh并使用新端口再添加一行-R .
我用netcat测试了这个 .