Dockerfile 是一个包含了一系列用于构建 Docker 镜像的指令的文本文件。通过 Dockerfile,你可以自定义你的镜像内容,包括安装软件、设置环境变量、添加文件等。
1. Dockerfile 基础
1.1 指令概览
以下是一些常用的 Dockerfile 指令:
FROM
:设置基础镜像。RUN
:执行命令。CMD
:容器启动时执行的命令。ENTRYPOINT
:容器启动时执行的入口点。COPY
:从构建上下文复制文件到镜像。ADD
:从构建上下文添加文件到镜像,可以解压缩。ENV
:设置环境变量。WORKDIR
:设置工作目录。USER
:设置用户。VOLUME
:定义挂载点。EXPOSE
:声明端口。
1.2 示例
# 使用官方的基础镜像
FROM ubuntu:20.04
# 设置环境变量
ENV DEBIAN_FRONTEND noninteractive
# 更新软件包列表并安装软件
RUN apt-get update && apt-get install -y \
nginx \
mysql \
php
# 设置工作目录
WORKDIR /var/www/html
# 复制当前目录下的文件到容器内
COPY . /var/www/html
# 声明容器运行时监听的端口
EXPOSE 80
# 定义启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
2. 实战案例
2.1 构建 Python Web 应用的镜像
# 使用官方的 Python 3.8 镜像
FROM python:3.8
# 设置工作目录
WORKDIR /app
# 复制 requirements.txt 并安装依赖
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用文件
COPY . /app
# 声明端口
EXPOSE 8000
# 定义启动命令
CMD ["python", "app.py"]
2.2 构建 Node.js 应用的镜像
# 使用官方的 Node.js 14 镜像
FROM node:14
# 设置工作目录
WORKDIR /usr/src/app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用文件
COPY . .
# 声明端口
EXPOSE 8080
# 定义启动命令
CMD [ "node", "server.js" ]
2.3 构建 Java 应用的镜像
# 使用官方的 OpenJDK 11 镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制应用文件
COPY . /app
# 定义环境变量
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# 定义启动命令
CMD ["java", "${JAVA_OPTS}", "-jar", "app.jar"]
2.4 使用多阶段构建优化镜像
# 构建阶段
FROM maven:3.6.3-jdk-11 AS build
WORKDIR /app
COPY src ./src
COPY pom.xml .
RUN mvn -f pom.xml clean package
# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar ./app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
3. 构建和运行
3.1 构建镜像
在包含 Dockerfile 的目录下运行以下命令:
docker build -t my-image .
3.2 运行容器
使用以下命令运行容器:
docker run -d -p 4000:80 my-image
4. 最佳实践
- 最小化基础镜像:使用更小的基础镜像可以减少镜像体积,加快构建速度。
- 利用缓存:合理安排 Dockerfile 结构,使得层的变化最小化,充分利用缓存。
- 多阶段构建:使用多阶段构建可以减小最终镜像的体积,分离构建依赖和运行环境。
- 清理不必要的文件:在构建过程中及时清理不必要的文件和缓存,减小镜像体积。
- 明确指令:使用明确的指令,避免使用别名,如使用
yum install
而不是yum -y install
。
通过以上内容,你应该能够理解 Dockerfile 的基本结构和指令,并能够编写自己的 Dockerfile 来构建 Docker 镜像。