云原生--核心组件-容器篇-3-Docker核心之-镜像

1、定义与作用

  • 定义:

    Docker镜像是一个只读的模板,包含运行应用程序所需的所有内容,包括代码、依赖库、环境变量、配置文件等。简单来说,Docker镜像是一个轻量级、独立、可执行的软件包,它包含了运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。可以看作是应用程序或服务的"快照"。

  • 核心目标:

    确保应用在不同环境中(开发、测试、生产)的行为一致,实现"一次构建,随处运行"。

  • 作用:

    • 环境一致性:避免因环境差异导致的"在我的机器上能运行"问题。
    • 快速部署:通过镜像快速创建容器,缩短应用部署时间。
    • 版本管理:通过标签(Tag)管理不同版本(如 nginx:latest, python:3.9-slim)。

2、核心特性

(1)、分层存储(Union File System)

镜像由多个只读层(Layer)叠加而成,每一层都是基于前一层进行修改的结果。每一层都对应为Dockerfile中的一条指令(如RUN, COPY)。

  • 优势:
    • 高效存储:多个镜像可共享相同的基础层(如多个镜像共享FROM ubuntu层)。
    • 快速构建:仅需更新修改的层,而非整个镜像。

dockerfile示例:

java 复制代码
FROM ubuntu:20.04        # 基础层
RUN apt-get update     # 第二层
COPY . /app            # 第三层

(2)、只读性(不可变)

  • 镜像本身不可修改
    若需更新,需通过Dockerfile重新构建新镜像。
  • 容器可写层
    容器启动时,在镜像顶层添加一个可写层(Writable Layer),所有修改(如文件写入)仅在此层生效,原始镜像不变。

(3)、版本管理

  • 标签(Tag)
    通过标签区分不同版本,如nginx:latest(最新版)、nginx:1.21(特定版本)。
  • 多标签支持
    一个镜像可同时拥有多个标签(如my-app:1.0和my-app:stable)。

(4)、轻量高效

  • 资源占用低
    镜像仅包含应用运行所需的最小文件系统,远小于传统虚拟机镜像。
  • 快速拉取
    由于分层存储和缓存机制,镜像下载仅需获取未缓存的层。

(5)、可移植性

镜像是自包含应用运行必须的所有产物,因此可以在任何支持Docker的环境中运行,无论是在开发者的笔记本电脑上还是在生产服务器上。

3、镜像的生命周期

(1)、构建镜像

  • 方法1:Dockerfile构建
    • 步骤:
      1. 编写Dockerfile(定义镜像构建步骤)。
      2. 运行docker build 命令构建镜像。

Dockerfile示例:

java 复制代码
# 使用官方的Python基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到工作目录
COPY . /app
# 安装应用所需的依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露应用运行的端口
EXPOSE 8000
# 定义容器启动时执行的命令
CMD ["python", "app.py"]说明:
Dockerfile是一个文本文件,包含了一系列的指令,用于描述如何构建镜像。

bash示例:

java 复制代码
docker build -t my-python-app:1.0 .
  • 方法2:基于容器提交(docker commit)
    可以将一个运行中的容器的状态保存为一个新的镜像。
    • 步骤:
      1. 运行容器并修改其内容。
      2. 使用docker commit将容器提交为新镜像。

bash示例:

java 复制代码
# 启动一个容器
docker run -it ubuntu bash
# 在容器中进行一些操作,如安装软件等
apt-get update
apt-get install -y vim
# 退出容器
exit
# 将容器保存为镜像
docker commit <容器ID> my-ubuntu-with-vim 

(2)、存储与管理

  • 本地存储:
    镜像存储在Docker守护进程的镜像仓库中,可通过docker images查看。
  • 远程仓库:
    • Docker Hub:公共仓库,存储官方和社区镜像。
    • 私有仓库:如企业内部的Harbor、AWS ECR,用于存储敏感或私有镜像。

(3)、分发与共享

  • 推送镜像:

bash示例:

java 复制代码
docker tag my-python-app:1.0 registry.example.com/my-python-app:1.0
docker push registry.example.com/my-python-app:1.0
  • 拉取镜像:

bash示例:

java 复制代码
docker pull nginx:latest

4、常用Docker镜像命令

5、Docker镜像的应用场景

(1)、开发环境一致性

  • 问题:不同开发者环境配置差异导致的Bug。
  • 解决方案:通过镜像统一开发环境,例如:
    bash示例:
java 复制代码
docker run -it -v $(pwd):/app my-python-dev-env

(2)、CI/CD流水线

  • 流程:
    1. 构建镜像并推送至仓库。
    2. 在CI/CD工具(如Jenkins、GitLab CI)中自动部署镜像。
      yaml示例:(GitLab CI 配置片段)
java 复制代码
build:
  script:
    - docker build -t my-app:$CI_COMMIT_SHA .
    - docker push registry.example.com/my-app:$CI_COMMIT_SHA

(3)、微服务部署

  • 场景:每个微服务独立打包为镜像,通过Kubernetes管理。
    yaml示例:(Kubernetes Deployment配置)
java 复制代码
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: frontend
        image: registry.example.com/frontend:1.0
      - name: backend
        image: registry.example.com/backend:2.0

6、进阶特性与最佳实践

(1)、多阶段构建(Multi-stage Build)

  • 目的:减少镜像体积,提升安全性。
    dockerfile示例:
java 复制代码
# 第一阶段:编译代码
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二阶段:运行时镜像
FROM alpine:3.16
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

(2)、内核无关性

  • 说明:镜像不包含内核,仅包含用户空间文件系统(如/bin, /etc)。
  • 优势:容器直接使用宿主机内核,实现轻量级虚拟化。

(3)、安全扫描

  • 工具:Trivy、Clair等。
    bash示例
java 复制代码
trivy image my-app:latest  # 检查镜像漏洞

7、其他问题

(1)、查看镜像的详细信息

bash示例:

java 复制代码
docker inspect my-image:tag   # 查看元数据和配置
docker history my-image:tag   # 查看层历史

(2)、删除未使用的镜像

bash示例:

java 复制代码
docker image prune -a   # 删除所有未被容器使用的镜像

(3)、镜像与容器的关系

  • 类比:
    • 镜像:类似"类(Class)",定义容器的模板。
    • 容器:类似"对象(Object)",是镜像的运行实例。

8、总结

  • Docker镜像是容器化的核心,通过分层存储和版本管理技术,实现了高效、一致的应用部署。
  • 关键价值:
    • 环境一致性:避免依赖冲突。
    • 快速迭代:通过CI/CD自动化构建和推送。
    • 轻量高效:仅打包必要文件,资源占用低。

逆风前行,Dare To Be!!!

相关推荐
豆芽脚脚1 小时前
docker compose再阿里云上无法使用的问题
阿里云·docker·容器
十行代码九行报错4 小时前
Docker基础学习笔记
笔记·学习·docker
AKAMAI14 小时前
AI需要防火墙,云计算需要重新构想
人工智能·云原生·云计算
Agome9915 小时前
Docker之自定义jkd镜像上传阿里云
阿里云·docker·容器
无能百分百16 小时前
阿里云服务器ECS安装Docker(CentOS 7.x)
docker
小猿姐17 小时前
KubeBlocks for Milvus 揭秘
数据库·云原生
wdxylb19 小时前
云原生俱乐部-RH134知识点总结(2)
linux·云原生
deeper_wind20 小时前
k8s-单主机Master集群部署+单个pod部署lnmp论坛服务(小白的“升级打怪”成长之路)
云原生·容器·kubernetes
zhenshanrenhao1 天前
#买硬盘欲安装k8s记
云原生·容器·kubernetes
bing.shao1 天前
微服务容错与监控体系设计
微服务·云原生·架构