【问题标题】:what is the difference between publishing 8080:80 and 8080:8080 in a docker run?在 docker run 中发布 8080:80 和 8080:8080 有什么区别?
【发布时间】:2019-02-09 21:41:43
【问题描述】:

我正在尝试运行 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。

提前致谢

【问题讨论】:

    标签: docker jenkins


    【解决方案1】:

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

    【讨论】:

    • @YashRao,这个命令显示你的 linux 机器上运行的端口和进程:netstat -tulpn
    • @JRichardsz docker run -p 8080:80 和 docker run -p 8080:8080 有什么区别?
    • @YashRao 这意味着您正在使用端口转发。 Docker 有自己的网络命名空间,因此它有自己的端口,从 1 到 65535 现在在情况 1 (8080:8080) 因为 jenkins 默认在端口 8080 上运行,并在主机的端口 8080 上转发现在在情况 2 (8080:80 ) jenkins 正在容器的 80 端口上运行,并在主机的 8080 端口上转发,因此在 case2 中,您可能需要检查容器中 jenkins 是否在 80 端口上运行,这在这种情况下似乎不太可能。
    【解决方案2】:

    当您说 8080:80 时,这意味着来自端口 8080 的任何请求都将被转发到在您的 docker 容器内的端口 80 上运行的服务。 同样 8080:8080 意味着对端口 8080 的任何请求都将转发到容器内在端口 8080 上运行的服务

    你也可以认为是——

     Port for Outside World: Actual Port of service in container
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      没有 Docker

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

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

      使用 Docker

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

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

      因为例如 APP_B8080 仅在 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 内部端口开始。

      你只需要研究一下你的詹金斯使用的内部容器端口是什么,并将其放入 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 ...吗?
      【解决方案4】:

      语法如下所示。 More details 关于 -p 标志。

      docker run -p [ip-on-host:]port-on-host:port-in-container image-name
      

      在您的情况下,-p 8080:80 表示将所有流量引导到容器中的端口 80。如果您通过netstat -lntp|grep 8080 检查主机上的端口状态,则有一个由docker-proxy 管理的进程正在侦听主机上的端口8080。它将管理主机上的端口8080和容器中的端口80之间的所有流量路由。

      【讨论】:

      • 容器中存在端口 80。我通过在容器中发布 80 端口和主机上的 8081 端口创建了一个 GitLab 容器
      • 詹金斯图片中的@YashRao gitlab?您的帖子中没有提到 Gitlab。也许你可以更新你的帖子?
      猜你喜欢
      • 2012-03-16
      • 2015-01-06
      • 2018-01-27
      • 1970-01-01
      • 2015-04-06
      • 2017-09-21
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多