对于已经建立的docker容器,需要新增容器对主机的端口映射,主要分为三种:

一:通过修改配置文件修改docker容器端口映射

1.使用docker ps -a命令找到要修改容器的CONTAINER ID

2.运行以下命令,进入该容器目录



docker inspect【CONTAINER ID】| grep Id
cd /var/lib/docker/containers



2.停止容器



docker stop [容器id]



3.停止主机docker服务



systemctl stop docker



4.进入2得到的文件夹内,修改hostconfig.json 和 config.v2.json



vi hostconfig.json

比如新增一个 80 端口,在PortBindings下边添加以下内容,端口配置之间用英文字符逗号隔开

"80/tcp": [ 
{
 "HostIp": "0.0.0.0",
 "HostPort": "80"
 }
]
接着修改vi config.v2.json, 找到ExposedPorts和Ports  仿照之前内容添加端口映射
"ExposedPorts":  {
    "2000/tcp":   {}
},

"Ports":{
   "2000/tcp":[
        {
         "HostIp": "0.0.0.0",
         "HostPort":  "2000"
         }
]
},



5.保存之后重启docker服务和容器



systemctl start docker
docker start [docker id]



二:把运行中的容器生成新的镜像,再新建容器

1.提交一个运行中的容器为镜像



docker commit [containerid] [new_imagename]



2.运行新建的镜像并添加端口映射



docker run -d -p 8000:80  [imagename] /bin/sh



三:修改主机iptables端口映射

docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。

如果我们有一个容器的8000端口映射到主机的9000端口,先查看iptabes设置了什么规则:



sudo iptables -t nat -vnL



结果中有一条:



Chain DOCKER (2 references)
pkts bytes target prot opt in     out     source        destination         
 98  5872 RETURN  all  --  docker0 *     0.0.0.0/0     0.0.0.0/0           
237 14316 DNAT    tcp  --  !docker0 *    0.0.0.0/0    0.0.0.0/0    tcp dpt:9000 to:172.17.0.3:8000



我们可以看到docker创建了一个名为DOKCER的自定义的链条Chain。而我开放8000端口的容器的ip是172.17.0.3。

也可以通过inspect命令查看容器ip



docker inspect [containerId] |grep IPAddress



我们想再增加一个端口映射,比如8081->81,就在这个链条是再加一条规则:



sudo iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:81



加错了或者想修改:先显示行号查看



sudo iptables -t nat -vnL DOCKER --line-number



删除规则3



sudo iptables -t nat -D DOCKER 3