大道至简,知易行难
广阔天地,大有作为

Docker端口映射

Command Function
EXPOSE Document where a service is available, but not create any mapping to the host. The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.
--expose Expose a port at runtime, but not create any mapping to the host.
-p Create a port mapping rule like -p ip:hostPort:containerPortcontainerPort is required. If no hostPort is specified, Docker will automatically allocate one.
-P Map a dynamically allocated host port to all container ports that have been exposed by the Dockerfile or –expose.
--link Create a link between a consumer and service container, like –-link name:alias. This will create a set of environment variables and add entries into the consumer container’s /etc/hosts file. You must also expose or publish ports.

EXPOSE就是EXPOSE,-p和-P实际才是PUBLISH。

在Dockerfile中使用 EXPOSE指令,或在docker run命令中使用 --expose=1234是等效的( --expose接受一定范围的端口作为参数,例如 --expose=2000-3000)。但是,本质上EXPOSE或–expose仅仅是元数据。Dockerfile的作者仅仅是通过EXPOSE提示镜像打算在哪些端口上提供服务,但Docker容器在启动时如果不指定端口映射(通过-p或-P参数)那么在容器外部是不能访问EXPOSE或–expose暴露的端口的(出于安全考虑);也就是说,由容器的操作人员来指定端口的映射规则。

我们可以造一个镜像来验证:

可以看到只在Config中有ExposedPorts,而HostConfig和NetworkSettings中是没有的。

端口映射主要通过-P和-p参数来实现,一个宿主机端口只能绑定一个容器,其中:
1)-P,将Dockerfile内通过EXPOSE暴露的端口及–expose暴露的端口映射到宿主机的随机端口上;
2)-p,将容器内部开放的网络端口映射到宿主机的一个指定端口上;

我们可以通过如下的方法验证-P参数:

-p有几种用法:

①IP:HOSTPORT:CONTAINERPORT

指定宿主机IP、指定宿主机端口、指定容器端口,映射容器端口到宿主机指定IP的指定端口。例如,将容器的5000端口映射到127.0.0.1的5000端口上:

②IP::CONTAINERPORT

指定宿主机IP、不指定宿主机端口、指定容器端口,映射容器端口到宿主机指定IP的随机端口。例如,将容器的4000端口映射到127.0.0.1的随机端口上:

上述命令会将容器4000端口映射到宿主机127.0.0.1的随机端口上。

③HOSTPORT:CONTAINERPORT

不指定宿主机IP、指定宿主机端口、指定容器端口,将容器指定端口映射到宿主机的指定端口上,并绑定到所有IP地址。例如,将容器的80端口映射到宿主机的8000端口上:

上述命令会绑定到本地所有网络接口的所有IP地址。

总结一下就是:我们可以省略IP或HOSTPORT,但是必须始终指定要暴露的CONTAINERPORT。如果只指定一个CONTAINERPORT,那么Docker将自动绑定所有IP并随机选择hostPort。通常,为了避免冲突我们会让Docker自己分配hostPort,所以经常会通过下面这种写法来随机映射容器的3000端口:

此外,默认-p和-P默认使用的是TCP。如果要使用UDP,那么可以通过:

指定。同样,EXPOSE默认也是TCP,如果要使用UDP,那么可以:

我们可以通过如下的命令查看映射端口配置:

由于docker port只能在容器运行时显示端口映射,我们还可以通过docker inspect查看配置中的端口映射,这些信息位于Config、HostConfig和NetworkSettings中。

以下示例:

会将容器的80端口映射到宿主机的8000端口上。如果在容器中安装httpd服务,那么在宿主机上访问http://IP:HOSTPORT(即访问http://192.168.101.222:8000)就可以访问到容器了:

参考文档:
1、https://blog.csdn.net/a985588764/article/details/103857268
2、https://www.ctl.io/developers/blog/post/docker-networking-rules/

转载时请保留出处,违法转载追究到底:进城务工人员小梅 » Docker端口映射

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址