当前位置: 首页 > java >正文

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

1、定义与作用

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

  • 核心目标:
    确保应用在不同环境中(开发、测试、生产)的行为一致,实现“一次构建,随处运行”。

  • 作用:

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

2、核心特性

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

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

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

dockerfile示例:

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示例:

# 使用官方的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示例:

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

bash示例:

# 启动一个容器
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示例:

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示例:

docker pull nginx:latest

4、常用Docker镜像命令

在这里插入图片描述

5、Docker镜像的应用场景

(1)、开发环境一致性

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

(2)、CI/CD流水线

  • 流程:
    1. 构建镜像并推送至仓库。
    2. 在CI/CD工具(如Jenkins、GitLab CI)中自动部署镜像。
      yaml示例:(GitLab CI 配置片段)
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配置)
apiVersion: apps/v1
kind: Deployment
spec:template:spec:containers:- name: frontendimage: registry.example.com/frontend:1.0- name: backendimage: registry.example.com/backend:2.0

6、进阶特性与最佳实践

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

  • 目的:减少镜像体积,提升安全性。
    dockerfile示例:
# 第一阶段:编译代码
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示例
trivy image my-app:latest  # 检查镜像漏洞

7、其他问题

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

bash示例:

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

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

bash示例:

docker image prune -a   # 删除所有未被容器使用的镜像

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

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

8、总结

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

逆风前行,Dare To Be!!!

http://www.xdnf.cn/news/2082.html

相关文章:

  • 19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划
  • 【10分钟读论文】Power Transmission Line Inspections电力视觉水文
  • 链表相交.
  • Java 日志:掌握本地与网络日志技术
  • 一文了解智慧教育顶刊TLT的研究热点
  • Linux进程地址空间
  • py语法基础理解
  • femap许可常见问题及解决方案
  • Vue 3 父子组件通信案例详解:Props 与 Emits 实战
  • 一洽 全力辅助商户平台在线咨询解决方案
  • 自定义异常处理(全局异常处理)
  • Vue多地址代理端口调用
  • Promethues 普罗米修斯
  • 小刚说C语言刷题——1565成绩(score)
  • 某地农产品交易中心钢网架自动化监测项目
  • 筛法求莫比乌斯函数
  • 4月25日星期五今日早报简报微语报早读
  • ZYNQ-GPIO之MIO中断
  • 【计算机视觉】CV实战项目 - 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection
  • 管家婆财贸ERP BB103.收款单按明细核算部门项目
  • Java真的不难(五十五)Stream流的进阶用法
  • 题解:CF2106G2 Baudelaire (hard version)
  • html+servlet项目中的echart图表
  • 期刊论文发表,对重复率和AI率要求多少才合格?
  • 【MySQL数据库入门到精通-07 函数-字符串函数、数值函数、日期函数和流程函数】
  • 微差压传感器、呼吸传感器
  • C++开发未来发展与就业前景:从底层基石到未来引擎
  • 无限debugger实现原理
  • 皖维 大病救助办理手续说明
  • 分层设计数据仓库的架构和设计高效数据库系统的方法