Dockerfile中的expose到底有啥用

Stella981
• 阅读 1347

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

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

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

实际操作一下。

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

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

Dockerfile中的expose到底有啥用

docker  build  -t  nginx:test  .

Dockerfile中的expose到底有啥用

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

EXPOSE的一种其他的玩法

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

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

没错。是存在这个解的。

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

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

Dockerfile中的expose到底有啥用

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

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

Dockerfile中的expose到底有啥用

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

Dockerfile中的expose到底有啥用

综上得出结论:

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker多容器连接
Docker提供了多个容器之间访问的方法,最简单的方式是直接使用端口映射p参数指定映射的端口或者P映射所有端口,多个容器直接通过网络端口进行访问。但网络端口映射方式并不是Docker中连接多个容器的唯一方式,还可以使用Docker的连接系统(link)连接多个容器,当容器连接到一起时,接受者容器就可以看到源容器的信息。建立容器
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这