Docker “与”的区别是什么;揭露;及;出版「;在码头?

Docker “与”的区别是什么;揭露;及;出版「;在码头?,docker,Docker,我正在用Dockerfiles做实验,我想我理解大部分逻辑。但是,在这种情况下,我看不到“公开”和“发布”端口之间的区别 我首先看到的所有教程都包括Dockerfile中的EXPOSE命令: ... EXPOSE 8080 ... $ docker build -t an_image - < Dockerfile 然后,他们从该Dockerfile生成一个映像: ... EXPOSE 8080 ... $ docker build -t an_image - < Dockerf

我正在用Dockerfiles做实验,我想我理解大部分逻辑。但是,在这种情况下,我看不到“公开”和“发布”端口之间的区别

我首先看到的所有教程都包括Dockerfile中的
EXPOSE
命令:

...
EXPOSE 8080
...
$ docker build -t an_image - < Dockerfile
然后,他们从该Dockerfile生成一个映像:

...
EXPOSE 8080
...
$ docker build -t an_image - < Dockerfile
或使用发布所有端口

$ docker run -d -P an_image
如果要发布Dockerfile中的端口,那么在Dockerfile中公开该端口有什么意义?有没有必要先公开一个端口,然后再发布它?实际上,我希望在创建映像时指定Dockerfile中使用的所有端口,然后不再使用它们,只需通过以下方式运行它们:

$ docker run -d an_image

这可能吗?

基本上,您有三种选择:

  • 既不指定
    EXPOSE
    也不指定
    -p
  • 仅指定
    EXPOSE
  • 指定
    EXPOSE
    -p
  • 1) 如果既不指定
    EXPOSE
    也不指定
    -p
    ,则只能从容器内部访问容器中的服务

    2) 如果
    EXPOSE
    a port,则容器中的服务不能从Docker外部访问,只能从其他Docker容器内部访问。因此,这有利于容器间的通信

    3) 如果
    公开
    -p
    端口,则容器中的服务可以从任何地方访问,甚至可以从Docker外部访问

    两者分开的原因是因为:

    • 选择主机端口取决于主机,因此不属于Dockerfile(否则将取决于主机)
    • 如果容器中的服务可以从其他容器访问,通常就足够了
    《公约》明确规定:

    EXPOSE
    指令公开用于链接的端口

    它还向您指出了如何进行,这基本上就是我提到的容器间通信


    PS:如果您执行
    -p
    ,但不执行
    公开
    ,Docker将执行隐式
    公开
    。这是因为如果一个港口向公众开放,它也会自动向其他Docker集装箱开放。因此
    -p
    包括
    公开
    。这就是我没有将其列为第四个案例的原因。

    请参阅官方文档参考:

    如果您使用
    -p
    运行容器,则
    EXPOSE
    允许您在映像生成时定义私有(容器)和公共(主机)端口,以便在容器运行时公开

    $ docker help run
    ...
      -P, --publish-all                    Publish all exposed ports to random ports
    ...
    
    公共端口和协议是可选的,如果未指定公共端口,docker将在主机上选择一个随机端口,以在Dockerfile上公开指定的容器端口

    一个好的做法是不要指定公共端口,因为它只限制每个主机一个容器(第二个容器将抛出一个已经在使用的端口)

    您可以在
    docker run
    中使用
    -p
    来控制暴露的容器端口可连接的公共端口

    无论如何,如果不使用
    EXPOSE
    (在docker运行时使用
    -p
    )或
    -p
    ,则不会暴露任何端口


    如果您总是在
    docker run
    中使用
    -p
    ,则不需要
    暴露
    ,但如果您使用
    暴露
    ,则
    docker run
    命令可能更简单,
    暴露
    在您不关心主机上将暴露哪个端口的情况下非常有用,或者,如果您确定只有一个容器将被加载。

    大多数人使用docker compose与网络。各国:

    Docker网络功能支持创建网络,而无需在网络中公开端口,有关详细信息,请参阅此功能的概述)


    这意味着,如果使用网络在容器之间进行通信,则无需担心暴露端口。

    可以使用Dockerfile或 --向docker运行公开标志。公开端口是记录以下内容的一种方法: 使用端口,但实际上不映射或打开任何端口。暴露端口 是可选的

    来源:

    简短回答:
    • EXPOSE
      是记录的一种方式
    • --publish
      (或
      -p
      )是一种将主机端口映射到正在运行的容器端口的方法

    请注意:

    • EXPOSE
      Dockerfiles
      文档化)相关
    • --publish
      docker run…
      执行/运行时
    公开和发布端口 在Docker网络中,有两种不同的机制直接涉及网络端口:公开端口和发布端口。这适用于默认网桥网络和用户定义的网桥网络


    • 您可以使用docker文件中的
      expose
      关键字或
      --expose
      标志向docker run公开端口。公开端口是记录使用了哪些端口的一种方法,但实际上并不映射或打开任何端口。公开端口是可选的

    • 您可以使用
      --publish
      --publish all
      标志将端口发布到
      docker run
      。这会告诉Docker要在容器的网络接口上打开哪些端口。发布端口时,它将映射到主机上的可用高阶端口(高于
      30000
      ),除非您在运行时在主机上指定要映射到的端口。生成映像时(在Dockerfile中),无法在主机上指定要映射到的端口,因为无法保证运行映像的主机上的端口可用

    发件人:

    2019年10月更新:上述内容
    docker run --rm -it testexpose bash
    
    root@fb8f7dd1322d:/# mini_httpd -p 80
    root@fb8f7dd1322d:/# mini_httpd -p 8080
    root@fb8f7dd1322d:/# mini_httpd -p 8090