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

云原生--核心组件-容器篇-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/163387.html

相关文章:

  • 考研系列-计算机组成原理第四章、指令系统
  • 012组合数学——算法备赛
  • [创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论
  • 前端职业发展:如何规划前端工程师的成长路径?
  • RAG技术解析:以Text2SQL为例看检索增强生成的全流程应用
  • 第1章 基础知识
  • brew 安装openjdk查看其版本
  • 一文了解TOGAF 认证考试,如何选择科目?
  • ROS 快速入门教程05
  • 如何保证线程安全(含典型手段与应用场景)
  • Maven插件下载失败?三步解决SSL握手错误与镜像配置
  • 【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • 72.评论日记
  • CMCC RAX3000M CH EC 算力版刷机(中国移动 RAX3000M 算力版)刷机
  • 大模型的使用
  • 2025年暨南大学 ACM校赛分析与题解
  • 二、UI自动化测试02--元素定位方法
  • 【赵渝强老师】快速上手TiDB数据库
  • 线程池(四):并发编程常见问题解析
  • java基础之枚举和注解
  • NdrpConformantVaryingArrayUnmarshall函数分析--重要
  • 【家政平台开发(79)】解锁家政新金融:家政平台与金融服务融合之道
  • 基于大模型的急性肠套叠全流程预测与诊疗方案研究报告
  • Java 变量入门指南
  • 什么是WebSocket?NGINX如何支持WebSocket协议?
  • 数据可视化大屏——大数据分析系统
  • C#进阶学习(十四)反射的概念以及关键类Type
  • 【Linux C/C++开发】使用hash算法进行性能优化
  • 【读论文】面向小目标的轻型变电设备缺陷检测算法
  • 力扣刷题Day 30:两数相加(2)