列出容器
docker ps -a
上图可以看到,容器运行时已经映射了2个端口,22223到22,33307到3306。
根据上图可看到containerId 为 72cdd9f1fa32。
通过inspect命令查看容器ip:docker inspect containerId | grep IPAddress
docker inspect 72cdd9f1fa32| grep IPAddress
下面将如何演示如何将宿主的8081端口映射到172.17.0.2的8080端口上去
1、查看NAT表中的PREROUTING链
sudo iptables -t nat --list-rules PREROUTING
如果没有上图第三行,执行以下命令,iptables将满足条件的数据都会转发到DOCKER链
sudo iptables -t nat -A PREROUTING -p tcp -m addrtype --dst-type LOCAL -j DOCKER
2、查看NAT表中的DOCKER链
sudo iptables -t nat --list-rules DOCKER
仿照上图添加一条自己的映射规则,将宿主的8081端口映射到172.17.0.2的8080端口上去
sudo iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:8080
3、查看NAT表中的POSTROUTING链
sudo iptables -t nat --list-rules POSTROUTING
仿照上图中的规则,书写的规则如下:
sudo iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
4、查看FILTER表中的DOCKER链
sudo iptables --list-rules DOCKER
仿照上图中的规则,书写的规则如下:
sudo iptables -t filter -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT
验证端口映射是否成功
在vscode中使用spring boot编写hello world,项目结构如下:
一定要主要controller文件夹位置,放错地方容易404。
右键点击HelloWorldApplication.java,选择Run Java,即可启动服务。
根据上图可以得出docker容器内的访问网址:
http://172.17.0.2:8080/test/hello
我的docker部署在内网IP:192.168.9.151的服务器上。
在另外一台电脑上访问如下网址:
http://192.168.9.151:8081/test/hello
根据上图,可以看到端口映射成功。
移除端口映射
测试完成后想移除端口映射,需要将前面2、3、4部分在iptables上添加的规则移除,将-A换成-D即可。具体命令如下:
sudo iptables -t nat -D DOCKER ! -i docker0 -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:8080
sudo iptables -t nat -D POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
sudo iptables -t filter -D DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT