方法1 修改iptables端口映射

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

比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:

sudo iptables -t nat -vnL

在结果中有一条:

Chain DOCKER
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:80

我们可以看到docker创建了一个名为DOKCER的自定义的链条Chain。而我开放80端口的容器的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

方法2 修改容器配置文件

修改配置前需要先关闭docker容器的配置文件​​/var/lib/docker/containers/[containerId]​​​目录下,​​hostconfig.json​​​和​​config.v2.json​​ 修改好之后,重启容器服务。

docker容器被创建后会在服务器上保存一个文件夹,配置文件也放在此处,解决方法就是找到映射段都得配置文件修改就行了。

修改之前先停掉docker

$ systemcel stop docker

在 /var/lib/docker/containers/[容器ID]/下找到hostconfig.json
找到映射IP的位置,复制一个已映射的IP,修改为自己需要的就好(443是我新增的)

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

相同的目录下找到config.v2.json
该文件中有两处需要修改

"ExposedPorts": {
"443/tcp": {},
"80/tcp": {}
}

 

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

修改完之后启动docker

$ systemctl start docker

 执行成功之后启动容器然后查看容器运行状态就可以看到新增加的端口在映射关系里已存在。

同理也可以去除端口映射。

方法3 把运行中的容器生成新的镜像,然后运行新的镜像

  1. 提交一个运行中的容器为镜像
docker commit containerid heropoo/example

2.运行​​heropoo/example​​镜像并添加8080映射容器80端口

docker run -d -p 8000:80  heropoo/example /bin/sh