Docker 运行 -p ?/? (这两个端口号是什么,代表什么)

Docker run -p ?/? (what are this two port numbers and what they represents )

我使用了命令 "docker run -p 8080/8080 --name my_local_image ...." 但它失败了,说无法在本地找到图像“8080/8080:latest”

8080/8080 = 这两个端口到底代表什么?

-p 选项用于公开用于图像实例的端口。第一个是主机端口,“:”fullcolon 之后的第二个参数是它应该映射到的容器端口。有关详细信息,请阅读 doc

您在使用 docker 运行 启动实例时收到的错误告诉我们您在命令中提供的图像名称在您使用的机器上本地不可用,它您使用“/”而不是“:”提供端口的方式也可能存在问题。因此,为了安全起见,请先使用 docker pull 从 repo 中提取最新图像,然后再使用 运行它具有正确的语法。

--expose=[]: Expose a port or a range of ports inside the container. These are additional to those exposed by the EXPOSE instruction

-P : Publish all exposed ports to the host interfaces

-p=[] : Publish a container's port or a range of ports to the host format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort Both hostPort and containerPort can be specified as a range of ports. When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range, for example: -p 1234-1236:1234-1236/tcp When specifying a range for hostPort only, the containerPort must not be a range. In this case the container port is published somewhere within the specified hostPort range. (e.g., -p 1234-1236:1234/tcp) (use 'docker port' to see the actual mapping)

--link="" : Add link to another container (:alias or )

将“-p 8080/8080”替换为“-p 8080:8080

  • 第一个端口:Docker主机(你可以使用这个端口访问你的容器)从外部访问容器。
  • 第二个:是您的应用程序使用的端口。

示例:我想运行 tomcat服务器在docker容器中,tomcat的默认端口是8080 我想在端口 9000 上公开我的 docker 所以我必须写:

docker run -p 9000:8080 --name myTomcatContainer tomcat 

因此,通过此配置,我可以使用以下方式从外部访问 Tomcat: http://host-ip:9000

在这里已经很好的答案中添加一点,我喜欢用在城市中找到朋友公寓的类比来解释端口号。

在这个类比中,

  • 房东OS==小区所在小区

  • 您的申请==公寓大楼

  • 暴露端口应用==小区内的特定公寓

如果您要查找某人的地址,您会找到用户所在的社区(在本例中为 URL,如果在本地开发,很可能 http://localhost

但是你需要公寓大楼的街道号码,该号码是 5000:8080 之类的第一个数字,因此你的应用程序在主机上公开 OS在5000端口,朋友街道地址是5000,localHost street.

但是一旦你到了公寓大楼,你仍然需要知道敲哪扇门。您已经到达公寓大楼(您的应用程序),但您的朋友具体住在哪里?那是第二个数字,5000:8080.

所以你朋友的网络地址是 URL 主机 OS 端口的组合(如果你在本地开发,这是你的计算机,如果不是,它是任何服务器应用程序 运行 开启)并且端口在应用程序中公开。

请注意,一个公寓大楼通常有不止一间公寓,但它们仍位于同一地址,因此您的应用程序很可能会公开多个端口,例如 5000:80815000:9000.

也有可能不同楼的两套公寓会有相同的户号,所以我们可以有5000:8080,也可以有8080:8080,这种情况和前面的情况都不冲突在网络流量中。

这张图片是我提到的最后一个案例的例子