我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的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>
将开始运行容器。本教程解释端口重定向。
如果“现有”指的是“正在运行”,那么(目前)不可能添加端口映射。
然而,如果你需要在一个运行的容器中公开一个服务,而不需要停止/重新启动它,你可以动态地添加一个新的网络接口,例如管道。
如果你不适应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
编辑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;
}
推荐文章
- 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)?
- 守护进程的错误响应:已被集装箱使用"
- 如何找到可用的端口?