linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
  • Ansible

    • Ansible: 基本操作
    • Ansible: 安装
    • Ansible: 简介
    • YAML: 文件格式
    • Playbook

      • Playbook: 介绍
      • Playbook: 操作
    • 模块

      • Yum模块常用参数
    • 实战

      • Ansible 实战
  • Anaconda

    • Anaconda命令
  • Iptables

    • Iptable: 防火墙
    • iptables 用法
  • Systemd

    • 系统服务配置
    • 系统服务启动文件
    • 性能优化

      • Linux 系统监控
      • Linux 系统性能优化
      • Linux 系统故障诊断
      • Linux 系统日志管理
  • Network

    • 用一张图解释 8 种流行的网络协议
    • 反子网掩码
    • 交换机端口模式
    • eNSP 软件
    • 华为交换机配置命令
    • eNSP静态路由实验
  • Commands

    • 命令别名:alias
    • 多类型资源统计工具: dstat
    • history配置
    • unzip命令
    • Linux用户到期登录时间和随机密码
    • 常用 Command
    • ssh

      • ssh-keygen
      • linux ssh命令
  • CI/CD

    • Jenkins CI/CD 管道
  • Kubernetes

    • Docker系列学习

      • 01. 什么是Docker
      • 02. Docker安装
      • 03. 使用Docker镜像
      • 04. 利用commit理解镜像构成
      • 05. 操作Docker容器
      • 06. 使用Dockerfile定制镜像
      • 07. Dockerfile指令详解
      • 08. Dockerfile多阶段创建
      • 09. 访问仓库
      • 10. 修改docker的启动项
      • 11. Nexus3.x的私有仓库
      • 12. docker-hub加速器
      • 13. 数据管理
      • 14. 使用网络
  • Shell编程

    • Shell 编程基础
    • Shell 脚本执行消耗的时间
    • Shell 自动生成简介

04. 利用commit理解镜像构成

  • 简介
  • 镜像构成
    • 修改容器内容
    • 保存为新镜像
    • 使用新镜像
  • commit 命令的局限性
    • 1. 黑箱操作
    • 2. 镜像臃肿
  • 最佳实践
    • 使用 Dockerfile
    • commit 的适用场景

简介

Docker 镜像采用分层存储架构,每一层都基于前一层进行增量修改。通过 docker commit 命令,我们可以:

  • 理解镜像的分层结构
  • 将容器的修改保存为新镜像
  • 了解镜像构建的基本原理

注意: 实际环境中应该使用 Dockerfile 来构建镜像,而不是 commit 命令。

镜像构成

Docker 镜像和容器都采用分层存储结构:

  • 镜像层: 只读层,用于存储应用程序和依赖
  • 容器层: 可写层,运行时的文件变更都记录在这里

下面通过定制一个 Web 服务器镜像来理解这个过程:

docker run --name webserver -d -p 80:80 nginx
# 启动 Nginx 容器
docker container ls     #查看正在运行的容器

访问说明:

  • 本机运行: 访问 http://localhost
  • 虚拟机/云服务器: 使用对应的 IP 地址

修改容器内容

使用 docker exec 命令进入容器并修改内容:

docker exec -it webserver bash
echo '<h1>Welcome you come in my wanglh</h1>' > /usr/share/nginx/html/index.html            #修改主页内容
exit

# 查看修改内容
docker diff webserver

命令说明:

  • -i: 保持标准输入打开
  • -t: 分配伪终端
  • bash: 指定要运行的命令

文件变更:

  • C: 表示文件被修改
  • A: 表示新增文件
  • D: 表示删除文件

保存为新镜像

使用 docker commit 命令将修改后的容器保存为新镜像:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
docker commit \
--author "To wanglh <wlh_richard@163.com>" \
--message "修改默认主页内容" \
webserver \
nginx:v2  #回车

# 查看新镜像
docker image ls

# 查看镜像历史
docker history nginx:v2

参数说明:

  • --author: 指定作者信息
  • --message: 记录修改说明
  • webserver: 容器名
  • nginx:v2: 新镜像的名称和标签

使用新镜像

基于新镜像启动容器:

docker run --name web2 -d -p 81:80 nginx:v2

commit 命令的局限性

1. 黑箱操作

使用 commit 方式构建镜像的问题:

  • 操作过程不透明
  • 无法重现完整的构建过程
  • 维护困难,容易导致镜像不一致

2. 镜像臃肿

容易导致镜像臃肿的原因:

  • 所有操作都会产生新的层
  • 即使删除文件也会增加层大小
  • 临时文件和缓存也会被保存

最佳实践

使用 Dockerfile

  • 使用 Dockerfile 构建镜像
  • 保证构建过程可重复
  • 便于版本控制和维护

commit 的适用场景

  • 调试环境保存
  • 事故现场保存
  • 临时测试用途
最近更新时间:
Prev
03. 使用Docker镜像
Next
05. 操作Docker容器