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

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

相关推荐
一条咸鱼¥¥¥1 小时前
【运维经验】服务器设置磁盘阵列
运维·服务器
hweiyu001 小时前
Linux 命令:fdisk
linux·运维·服务器
宠..2 小时前
创建文本框控件
linux·运维·服务器·开发语言·qt
哦你看看2 小时前
K8S-Pod资源对象
java·容器·kubernetes
T***u3332 小时前
后端文件存储架构设计
运维
zhongtianhulian2 小时前
江苏设备管理平台哪家好
大数据·运维·python
翼龙云_cloud2 小时前
阿里云渠道商:什么是无影云电脑?
运维·阿里云·云计算·电脑
weixin_307779132 小时前
Jenkins Branch API插件详解:多分支项目管理的核心引擎
java·运维·开发语言·架构·jenkins
HalvmånEver2 小时前
Linux:进程创建(进程控制一)
linux·运维·服务器·学习·进程·fork