【容器使用】如何使用 docker 和 tar 命令来操作容器镜像

好的,我们来详细讲解一下如何使用 dockertar 命令来操作容器镜像。

这主要涉及两个核心操作:

  1. 将容器保存/导出为 tar 文件(用于备份、迁移或离线分享)。
  2. tar 文件加载/导入镜像(用于恢复或部署)。

1. 将容器/镜像打包成 tar 文件

有两种主要命令可以实现这个目的:docker exportdocker save。它们有重要区别:

特性 docker save docker export
操作对象 镜像 (Image) 容器 (Container)
输出内容 保存镜像的所有、标签、历史记录 只导出容器当前文件系统的快照
是否包含元数据 (如标签、历史命令、层结构)
典型用途 备份镜像,以便在其他地方恢复 部署一个纯净的应用,不包含构建历史
1.1 使用 docker save 将镜像打包成 tar

这是最常用的方法,用于备份或迁移镜像。

基本语法:

bash 复制代码
docker save -o <输出的tar文件名>.tar <镜像名>:<标签>

操作示例:

  1. 查看本地镜像,确认你要打包的镜像名称和标签。

    bash 复制代码
    docker images
    # 输出示例:
    # REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    # nginx        latest    2b7d6430f78d   2 weeks ago    142MB
    # ubuntu       20.04     6b7dfa7e8fdb   4 weeks ago    77.8MB
  2. nginx:latest 镜像保存为 nginx_backup.tar 文件。

    bash 复制代码
    docker save -o nginx_backup.tar nginx:latest
    • -o--output:指定输出文件的路径和名称。
  3. 你也可以将多个镜像打包到一个 tar 文件中。

    bash 复制代码
    docker save -o my_images.tar nginx:latest ubuntu:20.04
  4. 使用 gzip 压缩以减小文件体积(推荐)。

    bash 复制代码
    docker save nginx:latest | gzip > nginx_backup.tar.gz
1.2 使用 docker export 将容器打包成 tar

这个方法用于导出某个容器的文件系统状态。

基本语法:

bash 复制代码
docker export -o <输出的tar文件名>.tar <容器名或容器ID>

操作示例:

  1. 查看正在运行的容器,找到你要导出的容器 ID 或名称。

    bash 复制代码
    docker ps
    # 如果容器已停止,可以查看所有容器
    docker ps -a
  2. 假设有一个容器 ID 为 a1b2c3d4,将其导出为 my_container.tar

    bash 复制代码
    docker export -o my_container.tar a1b2c3d4

2. 从 tar 文件加载/导入镜像

同样,根据你使用的打包方法,也有两种对应的加载命令。

2.1 使用 docker load 导入由 save 创建的 tar 文件

这是恢复镜像的标准方法。

基本语法:

bash 复制代码
docker load -i <镜像tar文件>

操作示例:

  1. nginx_backup.tar 文件加载镜像。

    bash 复制代码
    docker load -i nginx_backup.tar
    • -i--input:指定要加载的 tar 文件。
  1. 如果文件是 .tar.gz 格式,也可以直接加载。

    bash 复制代码
    docker load -i nginx_backup.tar.gz
  2. 查看加载的镜像,确认是否成功。

    bash 复制代码
    docker images

    加载的镜像会保留其原来的名称和标签。

2.2 使用 docker import 导入由 export 创建的 tar 文件

这个方法会将一个文件系统快照导入为一个新的镜像

基本语法:

bash 复制代码
docker import <容器tar文件> [新镜像名]:[新标签]

操作示例:

  1. my_container.tar 文件创建一个新的镜像,并命名为 my_imported_image:v1

    bash 复制代码
    docker import my_container.tar my_imported_image:v1
  2. 查看新创建的镜像。

    bash 复制代码
    docker images
  3. 运行这个新镜像来启动一个容器。

    bash 复制代码
    docker run -it my_imported_image:v1 /bin/bash

    注意:由 export/import 创建的镜像不包含任何原始命令历史或元数据,你可能需要在 docker run 时指定要运行的命令(如 /bin/bash)。


操作流程总结

场景一:备份和恢复一个镜像(最常用)
  1. 备份: docker save -o my_app.tar my_app:prod
  2. my_app.tar 文件拷贝到另一台机器。
  3. 恢复: docker load -i my_app.tar
  4. 运行: docker run -d my_app:prod
场景二:将一个容器的当前状态固化为新镜像
  1. 对容器进行了一些修改(例如安装了软件)。
  2. 导出: docker export -o container_snapshot.tar my_container
  3. 导入为镜像: docker import container_snapshot.tar my_new_image:latest
  4. 基于新镜像运行: docker run -it my_new_image:latest /bin/bash

重要提示

  • 权限: 操作 docker 命令通常需要 sudo 权限或加入 docker 用户组。
  • 空间: 确保磁盘有足够空间存放 tar 文件,尤其是镜像较大时。
  • 命令区分: 牢记 save/load 针对的是镜像 ,而 export/import 针对的是容器。混淆它们会导致操作失败或丢失元数据。
  • 压缩: 使用 gzip 压缩(生成 .tar.gz)可以显著减少文件大小,节省传输时间和存储空间。docker load 可以直接读取压缩文件。
相关推荐
safestar20123 小时前
Elasticsearch深度实战:从分布式原理到生产环境踩坑全记录
运维·搜索引擎·全文检索·es
j***29483 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
小兔薯了4 小时前
7. LNMP-wordpress
android·运维·服务器·数据库·nginx·php
福尔摩斯张4 小时前
Linux进程间通信(IPC)机制深度解析与实践指南
linux·运维·服务器·数据结构·c++·算法
❥ღ Komo·4 小时前
K8s集群搭建全流程详解
云原生·容器·kubernetes
不过普通话一乙不改名4 小时前
Linux 网络发包的极致之路:从普通模式到 AF_XDP ZeroCopy
linux·运维·网络
x***13395 小时前
如何在Linux中找到MySQL的安装目录
linux·运维·mysql
8***84825 小时前
macOs安装docker且在docker上部署nginx+php
nginx·macos·docker
p***92485 小时前
服务器部署,用 nginx 部署后页面刷新 404 问题,宝塔面板修改(修改 nginx.conf 配置文件)
运维·服务器·nginx
HarrySunCn5 小时前
Rocky服务器部署前端静态项目的注意点
运维·服务器