第二章-镜像深度解析:Docker的‘千层蛋糕‘魔法

2.1 镜像是个"千层蛋糕"

Docker镜像就像一个千层蛋糕,每一层都有特定的作用:

  • 底层:操作系统基础层(比如Ubuntu 20.04),提供运行环境;
  • 中间层:各种软件和依赖(比如Python 3.9、Node.js 16);
  • 顶层:你的应用程序和配置文件。

这种分层结构有个神奇的特性:只读共享。多个镜像可以共享相同的底层,节省存储空间。比如Ubuntu基础层被10个不同的镜像使用,硬盘上只存一份。

2.2 Dockerfile:镜像的"菜谱"

想制作自己的镜像,就要写一份"菜谱"------Dockerfile。它是一个文本文件,包含一系列指令,告诉Docker如何一步步构建镜像。

一个典型的Dockerfile长这样:

dockerfile 复制代码
# 使用Python 3.9作为基础镜像(第一层)
FROM python:3.9-slim

# 设置工作目录(容器内的路径)
WORKDIR /app

# 复制当前目录下的requirements.txt到容器的/app目录(第二层)
COPY requirements.txt .

# 安装Python依赖(第三层)
RUN pip install -r requirements.txt

# 复制项目代码到容器(第四层)
COPY . .

# 暴露端口5000
EXPOSE 5000

# 容器启动时执行的命令
CMD ["python", "app.py"]

每一条指令都会创建一个新的镜像层,层层叠加,最终形成完整的镜像。

2.3 镜像瘦身五大妙招

镜像太大不仅占用硬盘,还会拖慢部署速度。这里分享几个实用的瘦身技巧:

2.3.1 选用精简基础镜像

基础镜像选得好,瘦身成功一半。常见的精简镜像:

  • alpine:基于Alpine Linux,体积只有几MB,但软件包较少;
  • slim:官方提供的精简版,比如python:3.9-slim,比完整版小很多。

2.3.2 合并RUN指令

每条RUN指令都会创建一层,合并可以减少层数:

dockerfile 复制代码
# ❌ 不推荐:两条RUN指令,创建两层
RUN apt-get update
RUN apt-get install -y python3

# ✅ 推荐:一条RUN指令,只创建一层
RUN apt-get update && apt-get install -y python3

2.3.3 清理缓存垃圾

安装软件时会产生缓存,记得及时清理:

dockerfile 复制代码
# 安装完软件后清理apt缓存
RUN apt-get update && apt-get install -y python3 \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

2.3.4 使用.dockerignore

就像.gitignore一样,.dockerignore可以排除不必要的文件,减小构建上下文:

复制代码
# .dockerignore文件内容
.git
__pycache__
*.log
.env
node_modules

2.3.5 多阶段构建

对于编译型语言(如Go、Java),可以使用多阶段构建,只保留运行时需要的文件:

dockerfile 复制代码
# 第一阶段:编译
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# 第二阶段:运行(只保留编译后的可执行文件)
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

掌握了这些技巧,你的镜像就能轻松瘦身50%以上!

下一章,我们将学习容器的进阶操作技巧。

相关推荐
xywww1682 小时前
大模型 API 选型实战:GPT、Gemini、Claude 接入时该看哪些指标?
运维·服务器·人工智能·python·gpt·langchain
梦想的颜色5 小时前
【Docker原理】Docker 容器一文打尽:生命周期、环境管控、迁移备份、日志进程排查、垃圾清理
运维·docker·容器·容器生命周期·容器日志排查·容器迁移备份·容器进程管理
donoot7 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理
ITKEY_8 小时前
macOS brew 安装的nginx 文件在哪里?
运维·nginx·macos
Elastic 中国社区官方博客8 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
万里侯8 小时前
GitOps 漂移检测:集群里改了配置,Git 还以为一切正常
微服务·容器·k8s
Tim_Van9 小时前
在 CentOS 7 中安装 Chromium 的完整步骤
linux·运维·chrome·centos
孫治AllenSun10 小时前
【Nginx】配置参数和使用案例
运维·nginx
啵啵鱼爱吃小猫咪11 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
Piko61411 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记