如何将端口映射分配给现有Docker容器?
我不确定我是否误解了这里的某些内容,但似乎只有通过从映像创建新容器才能设置端口映射。是否有方法将端口映射分配给现有Docker容器?不确定是否可以将端口映射应用于正在运行的容器。您可以在运行与创建新容器不同的容器时应用端口转发如何将端口映射分配给现有Docker容器?,docker,port,lxc,linux-containers,Docker,Port,Lxc,Linux Containers,我不确定我是否误解了这里的某些内容,但似乎只有通过从映像创建新容器才能设置端口映射。是否有方法将端口映射分配给现有Docker容器?不确定是否可以将端口映射应用于正在运行的容器。您可以在运行与创建新容器不同的容器时应用端口转发 $ docker run -p <public_port>:<private_port> -d <image> $docker运行-p:-d 将开始运行容器。解释端口重定向 如果“现有”是指“正在运行”,那么(当前)不可能添加端
$ docker run -p <public_port>:<private_port> -d <image>
$docker运行-p:-d
将开始运行容器。解释端口重定向 如果“现有”是指“正在运行”,那么(当前)不可能添加端口映射
但是,您可以使用动态添加新的网络接口,例如,如果您需要在运行的容器中公开服务,而无需停止/重新启动它。我也对这个问题感兴趣 如上所述,只能使用
docker run
(和docker create
)命令指定端口转发。其他命令,
docker start
没有-p
选项,docker port
仅显示当前转载
要添加港口转运,我始终遵循以下步骤
docker stop test01
docker commit test01 test02
docker stop test01
docker commit test01 test02
注意:上面的test02
是我从test01
容器构建的一个新映像docker run -p 8080:8080 -td test02
其中,第一个8080是本地端口,第二个8080是集装箱端口。在Fujimoto Youichi的示例中,
test01
是集装箱,而test02
是图像
在执行docker run
之前,您可以删除原始容器,然后再次为容器指定相同的名称:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(使用
-p
将端口公开给随机端口,而不是手动分配)。您可以通过在以下位置直接编辑hostconfig.json
文件来更改端口映射:
/var/lib/docker/containers/[hash_the_container]/hostconfig.json
或/var/snap/docker/common/var-lib-docker/containers/[hash_the_the_container]/hostconfig.json
,我相信,如果您将docker作为快照安装的话
您可以通过docker inspect
命令来确定[hash\u\u the\u container],并且“Id”字段的值就是hash
docker Stop
)docker Start
)另外,您可以访问以了解如何根据主机正确重启docker引擎。我使用了
sudo systemctl restart docker
来重新启动在Ubuntu 16.04上运行的docker引擎。对于Windows和Mac用户,还有另一种非常简单友好的方法来更改映射端口:
如果您对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}
这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。编辑hostconfig.json现在似乎不起作用。它仅以该端口公开而不是发布到主机结束。提交和重新创建容器对我来说不是最好的方法。没有人提到docker网络
最好的解决方案是在同一网络中使用反向代理
docker网络创建我的网络
docker网络连接我的网络我的现有容器
docker run-d--名称nginx--网络我的网络-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重启nginx
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
如果您运行
docker run
,它将生成一个新的映像,这很可能不是您想要的
如果要更改当前图像,请执行以下操作:
docker ps-a
获取目标容器的id并转到:
cd /var/lib/docker/containers/<conainerID><and then some:)>
并更改文件
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
重新启动docker,它应该可以工作。我们可以使用ssh等方便的工具轻松完成这项工作 我使用的是ubuntu主机和基于ubuntu的docker镜像
ssh -R8888:localhost:8888 <username>@172.17.0.1
ssh-R8888:localhost:8888@172.17.0.1
172.17.0.1是docker接口的ip
(您可以通过运行
ifconfig docker0 | grep“inet addr”| cut-