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

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

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

docker inspect【CONTAINER ID】| grep Id
cd /var/lib/docker/containers
  1. 停止容器
docker stop [容器id]
  1. 停止主机 docker 服务
systemctl stop docker
  1. 进入 2 得到的文件夹内,修改 hostconfig.json 和 config.v2.json
vi hostconfig.json

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

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

接着修改 vi config.v2.json , 找到 ExposedPortsPorts 仿照之前内容添加端口映射

"ExposedPorts":  {
    "2000/tcp":   {}
},

"Ports":{
   "2000/tcp":[
        {
            "HostIp": "0.0.0.0",
            "HostPort":  "2000"
        }
    ]
},
  1. 保存之后重启 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
最后更新于 2022-10-22