7.1 基础镜像
基础镜像在创建Docker镜像中扮演重要角色,因为它们提供了构建的起点,并定义了运行你应用程序的环境。正确选择和配置基础镜像会显著影响最终镜像的性能、体积和安全性。在这节课里,我们会讨论如何选择和配置Docker的基础镜像。
基础镜像(或基础层)就是Docker镜像,它被用作创建新Docker镜像的初始层。它可能包括一个最小的操作系统、所需的工具和库,甚至可能是空的(scratch镜像)。选择基础镜像决定了你的容器中默认可用的资源和包。
选择基础镜像
在选择基础镜像时,需要考虑几个因素:
- 镜像大小: 较小的镜像下载更快,占用更少的磁盘空间,并且可以加速应用程序的部署。
- 支持与更新: 使用带有定期更新的官方镜像可以提供更高的安全性、漏洞修复以及运行的稳定性。
- 兼容性: 基础镜像应该包括你的应用程序需要正确运行的必要库和依赖。
流行的基础镜像
1. Alpine Linux
这是一个非常小巧的镜像,约5 MB大小。它非常适合需要最小操作系统的应用。不过开发者需要注意,Alpine中缺少许多标准库,因此有些应用可能需要额外配置。
FROM alpine:3.12
2. Debian/Ubuntu
这些是功能更全面的镜像,包含大量工具和库,非常适合需要更完整环境或熟悉Linux标准库的复杂应用程序。
FROM ubuntu:20.04
3. Official Language Images
官方的编程语言镜像,例如Node.js、Python、Ruby等等。这些镜像已经包含了相应语言的开发和运行环境,简化了配置流程。
FROM node:14
7.2 配置基础镜像
选择基础镜像后,需要根据你的应用需求对其进行配置。配置包括安装必要的包、复制应用文件和设置环境。
示例: 基于 Alpine Linux 的基础镜像配置
# 使用基础镜像 Alpine Linux
FROM alpine:3.12
# 安装必要的软件包
RUN apk add --no-cache python3 py3-pip
# 设置工作目录
WORKDIR /app
# 复制应用文件
COPY . .
# 安装依赖
RUN pip3 install -r requirements.txt
# 指定运行应用程序的命令
CMD ["python3", "app.py"]
在这个示例中,使用了基础镜像 alpine:3.12,安装了必要的包,复制了应用文件并安装了依赖。最终命令 alpine:3.12
指定了如何运行应用程序。
示例: 基于 Ubuntu 的基础镜像配置
# 使用基础镜像 Ubuntu
FROM ubuntu:20.04
# 更新并安装必要的软件包
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制应用文件
COPY . .
# 安装依赖
RUN pip3 install -r requirements.txt
# 指定运行应用程序的命令
CMD ["python3", "app.py"]
这个 Dockerfile 使用了镜像 ubuntu:20.04 并安装了 Python 和 pip。然后它复制应用文件并安装依赖,与之前的示例类似。
7.3 最佳实践
如何正确选择和配置基础镜像:
1. 选择最小镜像:从最小的镜像开始,这些镜像符合你的应用需求。这会减少最终镜像的大小并提高安全性。
2. 不安装额外的包:只安装应用真正需要的依赖。这会减小镜像大小并降低潜在漏洞的数量。
3. 清理包管理器的缓存:安装包后删除临时文件和缓存,让镜像更轻量化。
RUN apt-get update && apt-get install -y python3 python3-pip && rm -rf /var/lib/apt/lists/*
4. 使用多阶段构建:它允许将构建和运行阶段分开,有助于创建更轻量且更安全的镜像。
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 最终阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
5. 定期更新镜像:使用最新版本的基础镜像,以包含最新的安全修复和更新。
GO TO FULL VERSION