如题,看过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
<端口1> [<端口2>...]
大家都知道以上代码是
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
<端口1> [<端口2>...]
所以,
EXPO
SE
的作用:只是说明
docker
容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明。第二种作用:
Dockerfile
中
声明了
EXPO
SE
端口之后,我们使用-P命令进行随机映射的时候,会映射到
EXPO
...