Dokcer网络(一):端口映射和端口暴露

本文涉及的范围是在一个容器和其宿主机之间。

1.端口映射

端口映射的主要目的是建立容器的某个端口和宿主机的某个端口之间的映射,映射建立之后可以使得宿主机相应的端口的流量转发到容器的相应端口。要注意的一点是,如果容器有多个端口需要映射,那么不能映射到宿主机的同一个端口上。

端口映射是在启动容器的时候执行的,docker run -p(小写)或者docker run -P(大写)

1.1 docker run -p(小写)后面的参数有四种格式,列举如下:

  • docker run -p container_port 将容器的某个端口映射到宿主机的所有接口的(接口可以认为是IP地址)一个随机端口上。
  • docker run -p host_port:container_port 将容器的某个端口映射到宿主机的所有接口的一个具体端口上。
  • docker run -p host_ip:host_port:container_port 将容器的某个端口映射到宿主机的一个具体IP地址的具体端口上。
  • docker run -p host_ip::container_port 将容器的某个端口映射到宿主机的一个具体IP地址的一个随机端口上。

可以通过命令docker port 容器名字或者ID查看映射后的端口信息,能够看到容器的端口与宿主机的哪一个端口建立了映射关系。

1.2docker run -P(大写)不需要额外的参数,其作用是将容器内部暴露所有的端口分别映射到宿主机的所有接口的一个随机端口上。例如,容器内部暴露80和443两个端口,宿主机有192.168.0.1和192.168.0.2两个接口地址,docker run -P(大写)会将80端口映射到192.168.0.1的2345(也可能是其他值)端口和192.168.0.2的2345端口上,将443端口映射到192.168.0.1的2346(也可能是其他值)端口和192.168.0.2的2346端口上。

2.端口暴露

首先言明,如果只进行端口暴露而不进行端口映射的话,那么发往宿主机的流量是不会转发到容器中的。端口暴露的常见场景是镜像或者Dockerfile文件中自带了一个或一组暴露的端口,这么做主要是提醒用户,容器中的服务监听了哪些端口。端口暴露还可以为其他的命令提供所需的信息,也就是和其他的命令结合起来使用。端口暴露可以通过在Dockerfile文件中使用EXPOSE指令,也可以在docker run命令启动容器时使用--expose选项。
举一个端口暴露和端口映射结合使用的例子docker run -dit --name port_test --expose 80 --expose 443 -P nginx:latest 注意此处使用的是大写的P,该命令的作用是拉取最新的nginx镜像,并启动一个名为port_test的容器,然后容器暴露80和443两个端口,分别映射到宿主机的所有接口的一个随机端口上。


版权声明:本文为qwe1765667234原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。