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

【Docker系列二】 Docker 镜像

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 镜像的概念
    • 镜像的拉取与推送
      • 1. 镜像的拉取
      • 2. 镜像的推送
    • 镜像的构建与优化
      • 1. 镜像的构建
      • 2. 镜像的优化
    • 镜像的版本管理
      • 1. 镜像标签
      • 2. 镜像版本控制
      • 3. 镜像的更新与回滚
    • 总结

镜像的概念

Docker 镜像是 Docker 容器的基石,它是一个轻量级、独立的可执行软件包,包含了运行应用程序所需的所有内容:代码、运行时环境、库、环境变量和配置文件。镜像是一个只读模板,用于创建 Docker 容器。当容器启动时,Docker 会在镜像的基础上创建一个可写层,容器中的所有修改都发生在这个可写层中,而镜像本身保持不变。

镜像采用分层存储的结构,每一层都是一个只读的文件系统层。这种分层结构使得镜像的构建、存储和传输更加高效。多个镜像可以共享相同的基础层,从而减少存储空间的占用和镜像下载的时间。
在这里插入图片描述

镜像的拉取与推送

1. 镜像的拉取

Docker 镜像是从镜像仓库中拉取的,最常用的镜像仓库是 Docker Hub。Docker Hub 是一个公共的镜像仓库,包含了大量的官方和社区维护的镜像。要拉取一个镜像,可以使用docker pull命令。

例如,拉取官方的 Ubuntu 镜像:

docker pull ubuntu

默认情况下,docker pull会拉取镜像的最新版本(即latest标签)。如果需要拉取特定版本的镜像,可以在镜像名称后指定标签。例如,拉取 Ubuntu 18.04 版本:

docker pull ubuntu:18.04

2. 镜像的推送

在本地构建或修改了镜像后,可以将其推送到镜像仓库中,以便在其他环境中使用。要推送镜像,首先需要在 Docker Hub 或其他镜像仓库中创建一个仓库,然后使用docker tag命令为镜像打上标签,最后使用docker push命令推送镜像。

例如,假设在本地构建了一个名为my-app的镜像,并希望将其推送到 Docker Hub 上的my-dockerhub-username/my-app仓库中:

  1. 登录 Docker Hub

    docker login
    
  2. 为镜像打标签

    docker tag my-app my-dockerhub-username/my-app:1.0
    
  3. 推送镜像

    docker push my-dockerhub-username/my-app:1.0
    

推送完成后,其他人就可以通过docker pull命令拉取这个镜像了。

镜像的构建与优化

1. 镜像的构建

Docker 镜像是通过Dockerfile文件构建的。Dockerfile是一个文本文件,包含了一系列指令,用于定义如何构建镜像。常见的指令包括:

  • FROM:指定基础镜像。
  • RUN:在镜像中执行命令。
  • COPY:将文件或目录从主机复制到镜像中。
  • ADD:类似于COPY,但支持自动解压和 URL 下载。
  • ENV:设置环境变量。
  • EXPOSE:声明容器运行时监听的端口。
  • CMD:指定容器启动时执行的命令。

以下是一个简单的Dockerfile示例,用于构建一个运行 Python 应用的镜像:

# 使用官方的Python 3.8镜像作为基础镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到镜像的/app目录中
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 声明容器运行时监听的端口
EXPOSE 80

# 设置环境变量
ENV NAME World

# 指定容器启动时执行的命令
CMD ["python", "app.py"]

要构建镜像,可以使用docker build命令:

docker build -t my-python-app .

2. 镜像的优化

构建高效的 Docker 镜像对于提高容器的启动速度和减少资源占用非常重要。以下是一些常见的镜像优化策略:

  • 使用合适的基础镜像:选择轻量级的基础镜像(如alpineslim版本)可以减少镜像的大小。例如,使用python:3.8-slim而不是python:3.8

  • 减少层数:每个RUNCOPYADD指令都会创建一个新的镜像层。通过合并多个命令到一个RUN指令中,可以减少层数。例如:

    RUN apt-get update && apt-get install -y \
        package1 \
        package2 \
        && rm -rf /var/lib/apt/lists/*
    
  • 清理不必要的文件:在构建过程中,删除不必要的临时文件和缓存可以减少镜像的大小。例如,在安装软件包后删除/var/lib/apt/lists/*目录。

  • 使用多阶段构建:多阶段构建允许在构建过程中使用多个临时镜像,最终只将必要的文件和依赖项复制到最终镜像中。例如:

    # 第一阶段:构建应用
    FROM python:3.8 as builder
    WORKDIR /app
    COPY . /app
    RUN pip install --no-cache-dir -r requirements.txt
    
    # 第二阶段:生成最终镜像
    FROM python:3.8-slim
    WORKDIR /app
    COPY --from=builder /app /app
    CMD ["python", "app.py"]
    

镜像的版本管理

1. 镜像标签

镜像标签是用于标识镜像版本的一种方式。每个镜像可以有多个标签,通常用于表示不同的版本或构建环境。例如,一个镜像可以有latest1.01.1等标签。

在构建镜像时,可以通过-t选项为镜像指定标签:

docker build -t my-app:1.0 .

2. 镜像版本控制

镜像版本控制是确保应用程序在不同环境中一致运行的重要手段。以下是一些常见的版本控制策略:

  • 语义化版本控制:使用语义化版本号(如1.0.0)来标识镜像的不同版本。通常,主版本号表示不兼容的 API 更改,次版本号表示向后兼容的功能新增,修订号表示向后兼容的问题修正。

  • 环境标签:为不同环境(如开发、测试、生产)使用不同的标签。例如,my-app:devmy-app:testmy-app:prod

  • Git 提交哈希:将 Git 提交哈希作为镜像标签的一部分,以确保每次构建的镜像都可以追溯到特定的代码版本。例如:

    docker build -t my-app:$(git rev-parse --short HEAD) .
    

3. 镜像的更新与回滚

在实际应用中,可能需要更新或回滚镜像版本。以下是一些常见的操作:

  • 更新镜像:拉取最新版本的镜像并重新启动容器。

    docker pull my-app:1.1
    docker-compose up -d
    
  • 回滚镜像:如果新版本的镜像出现问题,可以回滚到之前的版本。

    docker-compose pull my-app:1.0
    docker-compose up -d
    

总结

Docker 镜像是 Docker 技术的核心,它通过分层存储和只读模板的方式,为容器提供了高效、一致的运行环境。通过拉取和推送镜像,开发者可以轻松地在不同环境中共享和部署应用程序。通过编写Dockerfile和优化镜像构建过程,可以创建高效、轻量级的镜像。镜像的版本管理则确保了应用程序在不同环境中的一致性和可追溯性。掌握 Docker 镜像的相关知识,对于现代软件开发和运维至关重要。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img


http://www.kler.cn/a/600010.html

相关文章:

  • Spring-Mybatis框架常见面试题
  • Java面试第十三山!《设计模式》
  • 快速部署Samba共享服务器作为k8s后端存储
  • Android adb调试应用程序
  • 解锁应急管理新境界:AR眼镜与指挥平台的完美融合
  • 常见框架漏洞:Thinkphp(TP)篇
  • 【Git流程最佳实践】 开发较大功能时应使用project branch
  • WordPress二次开发中常用到的一些变量和函数
  • [C++面试] 你了解transform吗?
  • 嵌入式驱动开发方向的基础强化学习计划
  • fuctioncall使用经验
  • QA:备份产品的存储架构采用集中式和分布式的优劣?
  • ai-by-hand-excel: 用 Excel 手搓各种 AI 算法和模型
  • 大型语言模型(LLM)推理框架的全面分析与选型指南(2025年版)
  • 【深度学习】Self-Attention机制详解:Transformer的核心引擎
  • LeetCode 942 增减字符串匹配
  • UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
  • 【Rust】一文掌握 Rust 的详细用法(Rust 备忘清单)
  • Leetcode 刷题笔记 图论part05
  • Cocos Creator Shader入门实战(六):使用setProperty动态设置材质属性,以及材质常用接口