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

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

相关推荐
用户0328472220705 小时前
如何搭建本地yum源(上)
运维
武子康6 小时前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造