在使用 Dockerfile 构建镜像时,Dockerfile 是一个文本文件,包含了构建镜像所需的步骤和指令。通过定义这些指令,Docker 可以自动化地生成自定义的 Docker 镜像。以下是构建 Docker 镜像的基本流程和一些常用指令的解释:
构建镜像的步骤
- 编写 Dockerfile:首先需要编写一个 Dockerfile 文件,定义你想要的镜像的构建步骤和指令。
-
运行
docker build
命令:在包含 Dockerfile 的目录中运行docker build
命令。Docker 会按照 Dockerfile 中的指令逐步构建镜像。 -
查看生成的镜像:构建完成后,可以使用
docker images
查看生成的镜像,并使用该镜像启动容器。
常用 Dockerfile 指令
-
FROM
- 作用: 指定构建新镜像所基于的基础镜像。
-
示例:
FROM ubuntu:20.04
表示使用 Ubuntu 20.04 作为基础镜像。
-
RUN
- 作用: 在镜像内执行命令并提交执行后的结果到镜像层。
-
示例:
RUN apt-get update && apt-get install -y nginx
安装 nginx 到镜像中。
-
COPY
- 作用: 将文件从构建上下文(Dockerfile 所在目录)复制到镜像中的指定路径。
-
示例:
COPY ./app /usr/src/app
将本地的app
目录复制到容器中的/usr/src/app
路径下。
-
ADD
-
作用: 功能类似于
COPY
,但还支持自动解压归档文件(如.tar
)。同时,还可以从 URL 复制文件。 -
示例:
ADD https://example.com/file.tar.gz /app/
会下载文件并自动解压到/app/
路径下。
-
作用: 功能类似于
-
CMD
-
作用: 为容器指定默认的执行命令。每个 Dockerfile 只能有一个
CMD
指令,多个会覆盖。 -
示例:
CMD ["nginx", "-g", "daemon off;"]
表示启动容器时运行 nginx。 -
注意:
CMD
的命令可以被docker run
命令行中指定的命令覆盖。
-
作用: 为容器指定默认的执行命令。每个 Dockerfile 只能有一个
-
ENTRYPOINT
-
作用: 为容器指定一个主进程(入口点),与
CMD
类似,但ENTRYPOINT
更加固定,命令行参数会附加到ENTRYPOINT
后。 -
示例:
ENTRYPOINT ["nginx", "-g", "daemon off;"]
固定了容器启动时运行 nginx。
-
作用: 为容器指定一个主进程(入口点),与
-
ENV
- 作用: 设置环境变量,这些变量会在容器内使用。
-
示例:
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
设置环境变量。
-
WORKDIR
- 作用: 设置容器内的工作目录,后续指令会在该目录下执行。
-
示例:
WORKDIR /usr/src/app
设定/usr/src/app
为工作目录。
-
EXPOSE
- 作用: 声明容器暴露的端口,但不实际打开端口。用于文档化或帮助容器运行时映射端口。
-
示例:
EXPOSE 80
声明容器服务会运行在端口 80 上。
-
VOLUME
- 作用: 声明容器内的某个目录为挂载点,通常用于数据持久化。
-
示例:
VOLUME /data
指定/data
为挂载点。
-
LABEL
- 作用: 为镜像添加元数据标签,方便后续管理和查询。
-
示例:
LABEL version="1.0"
为镜像添加版本标签。
-
USER
- 作用: 指定容器中运行进程的用户。
-
示例:
USER www-data
指定使用www-data
用户运行进程。
示例 Dockerfile
# 基础镜像
FROM ubuntu:20.04
# 设置环境变量
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# 设置工作目录
WORKDIR /usr/src/app
# 复制应用程序文件
COPY ./target /usr/src/app
# 安装依赖
RUN apt-get update && apt-get install -y python3-pip
RUN pip3 install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 8080
# 运行应用程序
CMD ["python3", "app.py"]
示例requirements.txt
django==3.2
requests==2.25.1
numpy==1.19.5
示例app.py
print("Hello, World!")
执行命令:
docker build -t mypython:v1 .
这个 Dockerfile 定义了一个基于 Ubuntu 的镜像,安装了 Python 依赖,并在容器启动时运行 app.py
。