在Docker中构建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder
1、Dockerfile 常用指令
FROM FROM <image>:<tag> 指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest
MAINTAINER MAINTAINER <name> 指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL
LABEL LABEL <key>=<value> ... 功能是为镜像指定标签。也可以使用LABEL来指定镜像作者
RUN RUN <command> 构建镜像时运行的Shell命令,比如构建的新镜像中我们想在/usr/local目录下创建一个java目录
ADD ADD <src>... <dest> 拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url。然后自动下载和解压
COPY COPY <src>... <dest> 拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压
EXPOSE EXPOSE <port> [<port>/<protocol>...] 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP
ENV ENV <key>=<value> ... 设置容器内环境变量
CMD CMD ["executable","param1","param2"] 启动容器时执行的Shell命令。在Dockerfile中只能有一条CMD指令。如果设置了多条CMD,只有最后一条会生效
ENTRYPOINT ENTRYPOINT ["executable", "param1", "param2"] 启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT,只有最后一条会生效
WORKDIR WORKDIR param 为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录
VOLUME VOLUME ["param"] 指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时
2、构建镜像
Dockerfile文件编写好以后,真正构建镜像时需要通过docker build命令。
docker build命令用于使用Dockerfile创建镜像。
# 使用当前目录的 Dockerfile 创建镜像
docker build -t mycentos:7 .
# 通过 -f Dockerfile 文件的位置创建镜像
docker build -f /home/ruoyi/docker/Dockerfile -t mycentos:7 .
-f:指定要使用的 Dockerfile 路径;
–tag, -t:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。
3、Dockerfile 试验
接下来我们通过基础镜像centos:7,在该镜像中安装jdk和tomcat以后将其制作为一个新的镜像mycentos:7
创建目录,编写Dockerfile文件
执行命令:vi Dockerfile,写入信息。
# 指明构建的新镜像是来自于`centos:7`基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="yaohj.vip"
# 设置工作目录
WORKDIR /usr/local
# 新镜像构建成功以后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷贝文件到镜像中并解压
ADD jdk-8u111-linux-x64.tar.gz /usr/local/java
ADD apache-tomcat-8.5.27.tar.gz /usr/local/tomcat
# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 8080
# 设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_111
ENV PATH $PATH:$JAVA_HOME/bin
# 启动容器时启动 tomcat
CMD ["/usr/local/tomcat/apache-tomcat-8.5.27/bin/catalina.sh", "run"]
构建镜像
docker build -f /文件所属目录/Dockerfile -t mycentos:test
启动镜像
docker run -di --name mycentos -p 8080:8080 mycentos:test
进入容器
docker exec -it mycentos7 /bin/bash
镜像构建历史
docker history mycentos:7