一、Dockerfile简介
Dockerfile是由一系列指令和参数构成的脚本,用于定义Docker镜像的内容和构建步骤,它包含了从基础镜像开始,逐步构建最终镜像所需的所有操作,如安装软件包、复制文件、设置环境变量等,每条指令都会创建一个新的镜像层,并对该层进行提交。
二、基本结构
1、基础镜像信息:使用FROM
指令指定基础镜像,这是构建新镜像的起点。FROM centos:7
表示基于CentOS 7镜像进行构建。

2、维护者信息:通过MAINTAINER
指令指定镜像的维护者姓名和邮箱地址,方便在构建或使用镜像过程中遇到问题时进行联系。
3、镜像操作指令:包括RUN
、CMD
、ENTRYPOINT
、EXPOSE
、ENV
、ADD
、COPY
、WORKDIR
、VOLUME
、USER
等指令,用于描述对镜像的各种操作。
4、容器启动时执行指令:通常使用CMD
或ENTRYPOINT
指令来指定容器启动时要运行的命令,其中CMD
命令可被docker run
之后的参数替换,而ENTRYPOINT
命令不会被覆盖,且可以追加命令。
三、常用指令详解
1、FROM:指定基础镜像,是Dockerfile中第一条指令,可以从官方仓库拉取基础镜像,也可以使用自定义的基础镜像。
2、RUN:用于在构建镜像的过程中运行命令,如安装软件包、执行脚本等,有两种格式,shell格式和exec格式。
3、CMD:指定容器启动时要运行的命令,有shell格式和exec格式两种语法,但只能有一个有效的CMD指令,若指定了多个,只有最后一个生效。

4、ENTRYPOINT:与CMD
类似,指定容器启动时执行的命令,但不会被docker run
命令行中的参数覆盖,通常与CMD
配合使用。
5、EXPOSE:声明容器运行时对外暴露的端口,但不会自动映射到宿主机端口,需结合docker run p
或P
选项使用。
6、ENV:用于设置环境变量,可在后续的RUN
指令中使用这些环境变量。
7、ADD:将本地文件或目录添加到镜像中,会自动解压tar压缩包并处理URL资源,功能类似于COPY
,但会将归档文件自动解压缩。
8、COPY:将本地文件或目录复制到镜像中,不会自动解压tar压缩包。
9、WORKDIR:指定工作目录,后续的RUN
、CMD
、ENTRYPOINT
、ADD
、COPY
等指令都会在该目录下执行。
10、VOLUME:为容器创建挂载点或声明卷,用于数据持久化和共享,避免重要数据因容器重启而丢失。
11、USER:指定该镜像以何种用户去执行。
四、实战案例
以下是一个使用Dockerfile构建自定义CentOS镜像的示例:
- 使用centos:7作为基础镜像
- FROM centos:7
- 维护者信息
- MAINTAINER yourname <youremail@example.com>
- 设置环境变量
- ENV MYPATH /usr/local
- 设置工作目录
- WORKDIR $MYPATH
- 安装vim和nettools
- RUN yum y install vim nettools
- 暴露80端口
- EXPOSE 80
- 容器启动时输出环境变量路径
- CMD echo $MYPATH
- 容器启动时输出结束信息
- CMD echo "end"
- 容器启动后进入bash命令行
- CMD /bin/bash
五、FAQs
1、Q:为什么有时需要自己编写Dockerfile而不是直接使用官方镜像?
A: 官方镜像可能无法满足特定的业务需求,如需要安装特定的软件、配置特定的环境等,自己编写Dockerfile可以根据具体需求定制镜像,使其更符合项目的要求。
2、Q:如何确保Dockerfile构建的镜像安全性?
A: 在编写Dockerfile时,应尽量使用官方的基础镜像,并遵循最小权限原则,只安装必要的软件和库,及时更新基础镜像以获取最新的安全补丁,可以使用一些安全工具对构建的镜像进行扫描和检测。