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

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

相关推荐
liux352817 分钟前
基于kubeadm部署Kubernetes 1.26.4 集群指南
云原生·容器·kubernetes
HalvmånEver21 分钟前
Linux:线程同步
linux·运维·服务器·线程·同步
岁杪杪27 分钟前
关于运维:LINUX 零基础
运维·服务器·php
Zfox_34 分钟前
CANN GE 深度解析:图编译器与执行引擎的后端优化策略、OM 文件结构与 Stream 调度机制
容器·节点小宝
tianyuanwo1 小时前
企业级NTP客户端配置指南:基于内部NTP服务器的实践
运维·服务器·ntp客户端
芷栀夏1 小时前
CANN开源实战:基于DrissionPage构建企业级网页自动化与数据采集系统
运维·人工智能·开源·自动化·cann
寄存器漫游者1 小时前
Linux 软件编程 - IO 编程
linux·运维·spring
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
gaize12132 小时前
Moltbot(Clawdbot) 专属轻量服务器
运维·服务器
鸽芷咕2 小时前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann