相关文章推荐
骑白马的红茶  ·  docker - Docker:通过 ...·  1 年前    · 
难过的板凳  ·  %E5%BD%A9%E7%A5%A8%E6% ...·  1 年前    · 

如题,看过Dockerfile常识的肯定都知道这个EXPOSE指令是暴露容器的端口。

docker  run 的时候指定  -P  或者 -p 将容器的端口映射到宿主机上。这样外界访问宿主机就可以获取到容器提供的服务了。

-P命令可以结合这个dockerfile文件中的EXPOSE暴露的端口。会将容器中的EXPOSE端口随机映射到宿主机的端口。

实际操作一下。

例如dockerfile中这么写。没错,这两句足够了。

然后是运行起来的结果,可以看到容器的80映射到宿主机的32776了。(-P大P是随机映射的。)

docker  build  -t  nginx:test  .

这样我们访问宿主机每次都是需要访问不一样的端口,这不是我们想要的。这也显得EXPOSE除了提醒外不起啥很有用的作用。

EXPOSE的一种其他的玩法

其实这个题目一直是困扰我的问题,直到有一天它被解开了。

如果我们将容器的端口直接占用宿主机的端口,启动容器就相当于宿主机对应端口被占用。从而访问宿主机的端口就直接访问容器的对应端口提供的服务,那EXPOSE不就显得很有用了吗。(不要说:那直接跑在宿主机不就得了。那用docker干吗)

没错。是存在这个解的。

docker  run  运行容器的时候 指定参数 --net=host 便是问题的解。

我们先把刚才容器停掉。然后用我说的 --net=host运行这个容器。可以看到PORTS啥也没写。因为使用的是宿主机的网络端口、不存在映射的关系。

你用docker  inspect  containerID 查,也是没有宿主机的端口映射信息的。

先来查看 -P参数run起来的容器inspect信息来进行对比。可以看到80端口映射到了宿主机的32777(不要问为啥不是32776)

再来看一下--net=host  run起来的容器inspect情况。可以看到Ports啥也没有

综上得出结论:

EXPOSE在dockerfile中暴露出容器将要提供服务所开放的端口。run的时候直接 docker run -d --net=host  image:tag 这样可以不手动-p指定端口映射关系,更简洁了,从而使EXPOSE发挥最大的作用。而不是简单的随机映射宿主机&&起到注释作用。

而这么做不灵活点在于宿主机的端口被EXPOSE固定。如果宿主机端口被其他进程占用,就port already in use了。

EXPO SE &amp;lt;端口1&amp;gt; [&amp;lt;端口2&amp;gt;...] 大家都知道以上代码是 Dockerfile 来声明端口的命令,但是你真的了解过它吗?现在我带大家来深入了解我们的 EXPO SE 命令。 首先,我们最应该明确的一点就是, EXPO SE 命令只是声明了容器应该打开的端口并没有实际上将它打开!也就是说,如果你不用-p或者-P 指定要映射的端口,你的容器是不会映射端口出去的,从而我们知道我们是... EXPO SE Dockerfile 的一条指令,它用于声明容器运行时所监听的网络端口。当其他人阅读该 Dockerfile 时,可以很清楚地了解该容器所需要打开哪些端口。 EXPO SE 并不会真正将宿主机上的端口暴露出来,它只是一个元数据,方便用户了解容器的网络设置。通过本文的介绍,我们可以清楚地了解到 EXPO SE 指令的作用、语法格式以及与 Docker 端口映射的关系。在编写 Dockerfile 时,正确使用 EXPO SE 指令可以让其他人更好地了解容器的网络设置,避免出现运行时不必要的困扰。 WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录 ENV:用来在构建镜像过程 设置环境变量 ADD:将宿主机目录下的文件拷贝进镜像,并且ADD命令会自动处理URL和解压tar压缩包 COPY:类似ADD,拷贝文件和目录到镜像。 VOLUME:容器数据卷,用于数据保存和和持久化工作 CMD:指定一个容器启动时要运行的命令。( Dockerfile 可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run之 语法 : EXPO SE <端口1> [<端口2>…] 上代码是 Dockerfile 来声明端口的命令。首先,应该明确的一点, EXPO SE 命令只是声明了容器应该打开的端口并没有实际上将它打开。也就是说,如果不用 -p 或者 -P 指定要映射的端口,容器是不会映射端口出去,不会通过宿主机被访问到。 从而得出结论是没有办法在 Dockerfile 里面进行端口映射的。 2. – expo se dockerfile EXPO SE Dockerfile 里面的 expo se ,是标记信息,不能直接打开端口,方便运维人员在使用容器时,知道要打开哪些端口。使用时 docker run -itd -P xxx:xxx ,大写 -P,会映射在 Dockerfile 文件 使用 EXPO SE 定义的端口,不需要手动 -p : 这种形式。 Docker 里面 expo se 和publish(run -p)的区别 这里主要记录的是我最近使用 docker 发... 一、 Dockerfile 介绍 Docker 通过读取 Dockerfile 里面的内容可以自动 build image, Dockerfile 是一个包含了 build 过程 需要执行的所有命令的文本文件。也可以理解为Dockfile是一种被 Docker 程序解释的脚本,由一条一条的指令组成,每条指令对应Linux系统下面的一条命令,由 Docker 程序将这些 Dockerfile 指令翻译成真正的Linux命令。 原文:http://dockone.io/article/455 如果你已经构建了一些多容器的应用程序,那么肯定需要定义一些网络规则来设置容器间的通信。有多种方式可以实现:可以通过-- expo se 参数在运行时暴露端口,或者在 Dockerfile 里使用 EXPO SE 指令。还可以在 Docker run的时候通过-p或者-P参数来发布端口。或者通过--link链接容器。虽然这些方式几乎都能达... 制作 Docker image 有两种方式:一是使用 Docker container,直接构建容器,再导出成 image 使用;二是使用 Dockerfile ,将所有动作写在文件 ,再 build 成 image。 Dockerfile 的方式非常灵活,推荐使用。 rhel7.3,并安装了 Docker 一、使用 Dockerfile 构建镜像(http服务) 1、首先载入镜像,接下来会... Docker 容器启动后,需要宿主机和容器端口进行映射,以便容器内服务对外暴露,这可以在启动是通过 docker run -p host:port ...指定,也可以在镜像构建时通过 dockerfile EXPO SE 指令指定,本文本来具体对 EXPO SE 指令进行解析。 EXPO SE 语法 EXPO SE <port> [<port>/<protocol>...] ​ EXPO SE 语义   · EXPO SE 指令声明 Docker 容器在运行时侦听的网络端口。 EXPO SE &lt;端口1&gt; [&lt;端口2&gt;...] 所以, EXPO SE 的作用:只是说明 docker 容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明。第二种作用: Dockerfile 声明了 EXPO SE 端口之后,我们使用-P命令进行随机映射的时候,会映射到 EXPO ...