端口暴露有4中方式:
1,将指定容器端口映射到主机所有地址的一个动态端口
我们将内网的端口80使用—p暴露
[root@linuxea.com_10_10_240_145 ~]$ docker run --name linuxea -it --network bridge -p 80 --rm linuxea/httpd:v1 httpd -f -h /data/5idocker
而后可以使用curl容器ip访问
[root@linuxea.com_10_10_240_145 ~]$ docker inspect -f {{.NetworkSettings.Networks.linuxea0.IPAddress}} linuxea
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ curl 172.17.0.4
helo www.linuxea.com
如果要使用node ip访问,就需要查看这个随机的暴露端口iptables -t nat -vnL
,如下
这段意思就是当访问1024端口就被转发到172.17.0.4:80端口
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ iptables -t nat -vnL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
1 84 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1024 to:172.17.0.4:80
也可以通过docker ps -a查看
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bfe5d8feb8c linuxea/httpd:v1 "httpd -f -h /data/5…" 13 hours ago Up 13 hours 0.0.0.0:1024->80/tcp linuxea
而后通过10.10.240.145:1025访问
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ curl 10.10.240.145:1024
helo www.linuxea.com
也可以在物理机访问
此时删除容器,防火墙规则也会删除
2,将容器端口映射到指定的主机端口
一般情形,容器监听什么端口,我们就该暴露什么端口
-p hostport:containerport ,本地端口:容器端口
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ docker run --name linuxea -it --network bridge -p 81:80 --rm linuxea/httpd:v1 httpd -f -h /data/5idocker
[root@linuxea.com_10_10_240_145 ~]$ docker port linuxea
80/tcp -> 0.0.0.0:81
而后通过浏览器访问
3,将指定的容器端口映射到主机的指定的动态端口
如果我们想将容器内的端口暴露到指定的端口映射到物理的端口,就可以使用-p ip::containerport
ip::80 其中::中间是随机端口,ip是本机ip,80是容器内端口
[root@linuxea.com_10_10_240_145 /data/mirrors/wwwroot]$ docker run --name linuxea -it --network bridge -p 10.10.240.145::80 --rm linuxea/httpd:v1 httpd -f -h /data/5idocker
查看端口
[root@linuxea.com_10_10_240_145 ~]$ docker port linuxea
80/tcp -> 10.10.240.145:1024
通过浏览器访问
4,将指定的容器端口映射到主机指定的端口
我们不但可以向如上那样使用动态端口,指定固定端口,指定主机动态端口,也可以指定主机固定端口
[root@linuxea.com_10_10_240_145 ~]$ docker run --name linuxea -it --network bridge -p 10.10.240.145:81:80 --rm linuxea/httpd:v1 httpd -f -h /data/5idocker
[root@linuxea.com_10_10_240_145 ~]$ docker port linuxea
80/tcp -> 10.10.240.145:81
通过浏览器访问
注意事项:暴露端口,这个端口在容器内必须是被监听的,也就是存在的,如果容器内不存在这个端口,就算你暴露了也是没有用的。并且-p选项可以使用多次-p 80:80 -p 8080:8080。
而使用了-P大写的P,就可以暴露容器内已经监听的端口。