学习如何使用Dockerfile定义镜像内容,构建高效、安全的Docker镜像。
Dockerfile 是一个文本文件,包含了一系列的指令,用于自动化构建Docker镜像。每个指令在镜像中创建一个新的层。
通过Dockerfile,您可以:
docker build 命令构建镜像| 指令 | 描述 | 示例 |
|---|---|---|
FROM |
指定基础镜像,必须是Dockerfile的第一条指令 | FROM ubuntu:20.04 |
RUN |
在镜像构建过程中执行命令 | RUN apt-get update && apt-get install -y nginx |
COPY |
从构建上下文复制文件到镜像中 | COPY . /app |
ADD |
类似COPY,但支持URL和自动解压 | ADD https://example.com/file.tar.gz /tmp/ |
WORKDIR |
设置工作目录 | WORKDIR /app |
ENV |
设置环境变量 | ENV NODE_ENV production |
EXPOSE |
声明容器运行时监听的端口 | EXPOSE 80 |
CMD |
指定容器启动时执行的命令 | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT |
配置容器启动时运行的命令 | ENTRYPOINT ["/app/start.sh"] |
VOLUME |
创建挂载点 | VOLUME /data |
USER |
指定运行后续指令的用户 | USER nobody |
LABEL |
为镜像添加元数据 | LABEL version="1.0" |
ARG |
定义构建时的变量 | ARG APP_VERSION=1.0 |
Docker客户端将Dockerfile所在目录的所有文件发送给Docker守护进程
Docker引擎按顺序读取并解析Dockerfile中的指令
每个指令创建一个新的镜像层,层是只读的
所有指令执行完毕后,生成最终的Docker镜像
为生成的镜像打上标签,方便识别和管理
多阶段构建允许在单个Dockerfile中使用多个FROM指令,每个FROM指令开始一个新的构建阶段。这样可以:
在这个例子中,构建阶段使用完整的Golang镜像来编译应用,运行阶段使用极小的Alpine镜像,最终镜像只包含编译好的二进制文件和必要的证书,大小显著减小。
创建.dockerignore文件排除不必要的文件,减小构建上下文大小和最终镜像大小。
将多行命令按字母顺序排序,提高可读性和维护性。
避免使用latest标签,选择特定的版本标签确保构建的一致性。
合并多个RUN指令,减少镜像层数。
创建并使用非root用户运行应用程序,提高安全性。
问题: 修改了源代码但构建时仍然使用缓存中的旧文件。
解决方案:
--no-cache 选项重新构建docker system prune 清理缓存问题: 构建的镜像体积过大,影响部署和传输效率。
解决方案:
问题: 每次构建都需要下载依赖包,耗时较长。
解决方案:
恭喜!您已经掌握了使用Dockerfile构建镜像的核心知识。现在可以开始创建高效、安全的Docker镜像了。