【Docker系列二】 Docker 镜像

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

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

博客目录

镜像的概念

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

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

镜像的拉取与推送

1. 镜像的拉取

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

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

bash 复制代码
docker pull ubuntu

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

bash 复制代码
docker pull ubuntu:18.04

2. 镜像的推送

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

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

  1. 登录 Docker Hub

    bash 复制代码
    docker login
  2. 为镜像打标签

    bash 复制代码
    docker tag my-app my-dockerhub-username/my-app:1.0
  3. 推送镜像

    bash 复制代码
    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 应用的镜像:

Dockerfile 复制代码
# 使用官方的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命令:

bash 复制代码
docker build -t my-python-app .

2. 镜像的优化

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

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

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

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

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

    Dockerfile 复制代码
    # 第一阶段:构建应用
    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选项为镜像指定标签:

bash 复制代码
docker build -t my-app:1.0 .

2. 镜像版本控制

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

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

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

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

    bash 复制代码
    docker build -t my-app:$(git rev-parse --short HEAD) .

3. 镜像的更新与回滚

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

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

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

    bash 复制代码
    docker-compose pull my-app:1.0
    docker-compose up -d

总结

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

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

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

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

相关推荐
郭逍遥32 分钟前
GZCTF平台搭建及题目上传
笔记·学习·ubuntu·docker·容器
小参宿42 分钟前
告别流媒体会员!如何用Docker搭建可远程控制的家庭音乐服务器
服务器·docker·容器
m0_748257181 小时前
SQL2000在win10上安装的方法
运维·服务器
{⌐■_■}1 小时前
【PostgreSQL】pg各版本选用取舍逻辑与docker安装postgres:15
数据库·docker·postgresql
demonlg01121 小时前
Jenkins 共享库(Shared Libraries)使用说明文档
java·运维·python·jenkins·运维开发·devops
IT 小旋风1 小时前
Linux centos7 虚拟用户访问脚本
linux·运维·服务器
惟肖肖肖2 小时前
tortoiseSVN、source insignt、J-flash使用
运维·服务器
ai问道武曲2 小时前
ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
linux·运维·服务器·ubuntu·ssh
今天又在摸鱼2 小时前
docker入门
java·spring cloud·docker
雾岛LYC听风3 小时前
3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride
运维·c#·自动化