背景说明
EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
解决方案
指令缺失
Dockfile文件内容
FROM busybox
RUN echo hello
CMD sleep 60
镜像构建并运行
[root@vm1 expose]# docker build . -t expose:v1
[root@vm1 expose]# docker run -d expose:v1
a6c3fab5c2a585e8e92a609df6561b4f8feeffdb7553acee4d9910303feffc58
[root@vm1 expose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6c3fab5c2a5 expose:v1 "/bin/sh -c 'sleep 6…" 3 seconds ago Up 2 seconds
指令补充
Dockfile文件内容
FROM busybox
RUN echo hello
EXPOSE 8000
CMD sleep 60
镜像构建并运行
[root@vm1 expose]# docker build . -t expose:v2
Sending build context to Docker daemon 2.048kB
Step 1/4 : from busybox
---> beae173ccac6
Step 2/4 : RUN echo hello
---> Using cache
---> 02b6d8b92584
Step 3/4 : EXPOSE 8000
---> Running in 133c7d09dbf5
Removing intermediate container 133c7d09dbf5
---> 7406669f4021
Step 4/4 : CMD sleep 60
---> Running in 14b9cc37cbb8
Removing intermediate container 14b9cc37cbb8
---> 2e304c63e11b
Successfully built 2e304c63e11b
Successfully tagged expose:v2
[root@vm1 expose]# docker run -d expose:v2
793e301dfdc130a6e58162b11ce79784796fb71296123b430e0ee23cad39ebee
[root@vm1 expose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
793e301dfdc1 expose:v2 "/bin/sh -c 'sleep 6…" 2 seconds ago Up 1 second 8000/tcp nifty_noether
可以看到PORTS部分输出8000/tcp