Dockerfile
文章目录
- 1. 前言
- 2. Dockerfile 指令
- 3. 编写Dockerfile
- 4. 最佳实践
1. 前言
Dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。通过编写Dockerfile ,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。
Dockerfile 的基本几个包含以下几个部分:
- 基础镜像:使用FROM指令可以指定基础镜像,在此基础镜像基础上,我们可以来开发自己的镜像。基础镜像一般包含了基础操作系统(ubuntu/centos)以及一些预装的工具与软件
- 维护者信息:包含维护者名字,版本和时间
- 镜像操作指令:使用一系列指令来描述构建的过程
- 容器启动指令:使用CMD或ENTRYPOINT指令来定义容器启动时要执行的命令
镜像的构建分为三个步骤:
- 编写dockerfile 文件
- 使用
docker build
来构建镜像 docker run
启动与运行镜像
2. Dockerfile 指令
Dockerfile 使用#
进行注释,一个Dockerfile文件就是以下指令编写而成的一个文件:
指令 | 描述 | 格式 |
---|---|---|
FROM | 指定基础镜像,当前新镜像是基于哪个镜像的 | FROM <image>[:<tag>] [AS <name>] |
MAINTAINER | 镜像维护者的姓名和邮箱地址,已被官方弃用,可以使用LABEL maintainer="…"来替代 | MAINTAINER <name> |
LABEL | 用于向 Docker 镜像添加元数据(Metadata)。这些元数据是键值对形式的标签,用于描述镜像的各个方面,例如维护者信息、版本、描述、构建日期等,可以通过docker inspect 查看标签信息 | LABEL <key>=<value> <key>=<value> <key>=<value> … |
USER | 指定后续指令(RUN, CMD, ENTRYPOINT)以哪个用户身份运行。为了安全,应避免使用 root 用户。 | |
RUN | 容器构建时需要运行的命令,最佳实践:将多个RUN命令用 && 连接成一个,以减少镜像层数 | RUN <command> |
EXPOSE | 当前容器对外保留出的端口 | EXPOSE <port> [<port>/<protocol>…] |
WORKDIR | 指定在创建容器后,终端默认登录的进来工作目录 | WORKDIR /path/to/workdir |
ENV | 用来在构建镜像过程中设置环境变量 | ENV <key>=<value> … |
ARG | 设置仅在构建过程中的临时变量。容器运行时无法访问 | ARG <name>[=<default value>] |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 | ADD [–chown=<user>:<group>] <src>… <dest> |
COPY | 类似ADD,拷贝文件和目录到镜像中,但不解压 | COPY [–chown=<user>:<group>] <src>… <dest> |
VOLUME | 容器数据卷,用于数据保存和持久化工作 | VOLUME <path> |
CMD | 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效 | CMD command param1 param2 |
ENTRYPOINT | 指定一个容器启动时要运行的命令,多个指令时不容易被覆盖 | ENTRYPOINT [“executable”, “param1”, “param2”] |
ONBUILD | 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发 |
3. 编写Dockerfile
创建Dockerfile
文件,并编写,下面提供一个最简单的镜像
# 用来注释
# 第一部分 基础镜像
FROM alpine# 第二部分 维护者信息
LABEL maintiner="Peter·Pan爱编程" \name="demo"# 第三部分 镜像操作指令
RUN echo dockerfiletest# 第四部分 镜像启动指令
CMD ["echo successfully"]
用户可以从Docker Hub中找到更多的基础镜像
使用下面指令可以编译镜像
sudo docker build -t myalpine:v1.0 -f ./Dockerfile .
编译完成后,使用docker images
能找到镜像:
使用docker run
运行镜像
sudo docker run -it --rm --name myalpine myalpine:v1.0 /bin/sh
4. 最佳实践
- 用多阶段构建:如上例所示,可以极大地减小最终镜像的大小。
- 合理排序指令:将最不可能变化的指令(如COPY requirements.txt和RUN install)放在前面,充分利用 Docker 的构建缓存,加速构建过程。多个RUN指令尽量使用
&&
来进行合并处理,减小镜像的大小 - .dockerignore:创建一个 .dockerignore 文件来排除不需要的文件(如.git, node_modules, .env),避免它们被复制到镜像中,增加大小并可能引发问题。
- 选择合适的基础镜像:优先选择官方、轻量级(如-slim, -alpine)的镜像。
- 一个容器一个进程:保持容器的单一职责,使其更易于管理、扩展和调试。