第二章-镜像深度解析: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%以上!

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

相关推荐
JoyCong19985 小时前
ToDesk个人版、专业版、游戏版、设计版、性能版、团队版权益介绍
大数据·运维·游戏·远程工作·远程操作
tryCbest6 小时前
Docker 从零到精通:知识与跨平台使用指南
docker·容器
Elastic 中国社区官方博客7 小时前
ES95:面向 Elasticsearch 时间序列指标的自适应压缩
大数据·运维·elasticsearch·搜索引擎·架构·全文检索
mqiqe8 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
mennekes8 小时前
数据中心安全配电设备如何选择?
运维·人工智能·科技·安全·制造
开始学AI9 小时前
Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案
运维·docker·容器
晨枫阳10 小时前
@changesets/cli是什么?哪些情况下需要使用?怎么使用
linux·运维·ubuntu
做前端的娜娜子10 小时前
Docker 常用命令全梳理:从镜像拉取到容器编排
docker·容器·掘金·金石计划
天远Date Lab10 小时前
零信任架构实战:基于天远行驶证核查构建自动化车队准入网关
运维·人工智能·架构·自动化
不会就选b11 小时前
Linux之网络基础(二)
linux·运维·网络