方法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 把運行中的容器生成新的鏡像,然後運行新的鏡像
- 提交一個運行中的容器爲鏡像
docker commit containerid heropoo/example
2.運行heropoo/example
鏡像並添加8080映射容器80端口
docker run -d -p 8000:80 heropoo/example /bin/sh