在 docker run 中发布 8080:80 和 8080:8080 有什么区别?

Yas*_*Rao 4 jenkins docker

我正在尝试运行 jenkins 容器。我使用了“docker run --restart always --name myjenkins -p 8080:80 jenkins”,但无法在浏览器的http://localhost:8080上访问 jenkins 。如果我使用 docker run --restart always --name myjenkins -p 8080:8080 jenkins,我可以访问 jenkins url。

提前致谢

JRi*_*dsz 10

没有 Docker

imagenro1

  • 每个应用程序必须使用不同的端口。

  • 您可以直接使用其端口访问您的应用程序(当然如果可用):

使用 Docker

在此处输入图片说明

  • 应用程序可以使用任何端口,因为每个端口“都是不同的世界”

  • 无法使用其内部端口访问您的 docker 应用程序:

因为例如,8080APP_B是唯一可见的内部APP_B容器。任何机构都无法访问此应用程序。

为了访问您的 docker 应用程序,您必须明确建立以下关系:

<->容器端口内的Linux 主机端口。

在此处输入图片说明

为此,您可以使用-p参数

  • docker run -d -p 8080: 8080 APP_A ...
  • docker run -d -p 8081: 8080 APP_B ...
  • docker run -d -p 8082: 8080 APP_C ...

在此之后,您可以使用其新端口访问您的 docker 应用程序:

使用 docker-compose 和 docker network 时的一个常见错误是当 docker 应用程序需要连接到另一个 docker 应用程序时使用 localhost 而不是 ip。如您所见,您需要使用ip 或域 + 外部端口而不是localhost:8080


在 docker run 中发布 8080:80 和 8080:8080 有什么区别?

  • 对于8080:80,您希望您的应用程序使用或从容器内的80内部端口开始。
  • 对于8080:8080,您希望您的应用程序使用或从容器内的8080内部端口开始。

您只需要研究 jenkins 使用的内部容器端口是什么并将其放入 docker run -p ...

  • 不应该是 `docker run -d -p 8080:8080 APP_A ... // docker run -d -p 8081:8080 APP_B ... // docker run -d -p 8082:8080 APP_C ...` ? (2认同)

小智 8

8080:80 是指在容器中您正在使用端口 80,并且您正在将该端口转发到主机的 8080 端口。因此,您在容器内的端口 80 上运行 Jenkins,在场景 2 中的任何位置,您都在容器内的端口 8080 上运行 Jenkins,并将其暴露在主机上的同一端口上。例如,如果我在容器中运行 mysql,我可能会使用 8080:3306,因此 mysql 将在端口 3306 上运行但暴露在主机的 8080 上,但如果将其选择为 8080:80 for mysql 它可能无法工作,因为根据代码在 mysql 中,它在端口 3306 而不是端口 80 上绑定自己。您的 Jenkins 情况也是如此。