背景说明

EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

解决方案

指令缺失

Dockfile文件内容

  1. FROM busybox
  2. RUN echo hello
  3. CMD sleep 60

镜像构建并运行

  1. [root@vm1 expose]# docker build . -t expose:v1
  2. [root@vm1 expose]# docker run -d expose:v1
  3. a6c3fab5c2a585e8e92a609df6561b4f8feeffdb7553acee4d9910303feffc58
  4. [root@vm1 expose]# docker ps
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. a6c3fab5c2a5 expose:v1 "/bin/sh -c 'sleep 6…" 3 seconds ago Up 2 seconds

可以看到PORTS部分无输出

指令补充

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