GVKun编程网logo

Docker 的 save 和 export 命令的区别(docker save -o)

26

在这篇文章中,我们将带领您了解Docker的save和export命令的区别的全貌,包括dockersave-o的相关情况。同时,我们还将为您介绍有关Docker-实现本地镜像的导出、导入(expor

在这篇文章中,我们将带领您了解Docker 的 save 和 export 命令的区别的全貌,包括docker save -o的相关情况。同时,我们还将为您介绍有关Docker - 实现本地镜像的导出、导入(export、import、save、load)、Docker for Windows(三)Docker镜像与容器的区别&常用命令、docker import和docker load的区别是什么?、docker run中-v指令与Dockerfile中volume命令的区别的知识,以帮助您更好地理解这个主题。

本文目录一览:

Docker 的 save 和 export 命令的区别(docker save -o)

Docker 的 save 和 export 命令的区别(docker save -o)

最近在玩 Docker,一种应用程序容器和 Linux 的虚拟技术。它太酷了,创建 Docker 镜像和容器只需要几分钟。所有的工作都是开箱即用的。

在结束我一天的工作之前,我希望能保存下我的工作。但我在 Docker 的 save 和 export 命令之间,我凌乱了。我不知道它们之间有什么区别。所以,我上 StackOverflow 问了一个问题,接着得到 mbarthelemy 很棒的回复。

开源项目 Docker,Red Hat 新的虚拟化选择

dockerlite: 轻量级 Linux 虚拟化

Docker 的搭建 Gitlab CI 全过程详解

Docker 和一个正常的虚拟机有何区别?

Docker 将改变所有事情

以下是我发掘到的内容:

Docker 是如何工作的(简单说明)

Docker 是基于镜像的。镜像类似于已经包含了文件、配置和安装好的程序的虚拟机镜像。同样的,你可以像启动虚拟机一样启动多个镜像实例。运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用 docker commit <container-id> <image-name > 命令可以把一个正在运行的容器变成一个新的镜像。

举个例子:

# 像 Docker 官方的 hello world 例子一样,拉取一个叫 busybox 的镜像
    sudo docker pull busybox

    # 查看本地已经有哪些镜像
    # 我们可以看到 busybox
    sudo docker images

    # 现在让我们来修改下 busybox 镜像的容器
    # 这次,我们创建一个文件夹
    sudo docker run busybox mkdir /home/test

    # 让我们再看看我们有哪些镜像了。
    # 注意每条命令执行后容器都会停止
    # 可以看到有一个 busybox 容器
    sudo docker ps -a

    # 现在,可以提交修改了。
    # 提交后会看到一个新的镜像 busybox-1
    #  <CONTAINER ID> 是刚刚修改容器后得到的 ID
    sudo docker commit <CONTAINER ID> busybox-1

    # 再看看我们有哪些镜像。
    # 我们现在同时有 busybox 和 busybox-1 镜像了。
    sudo docker images

    # 我们执行以下命令,看看这两个镜像有什么不同
    sudo docker run busybox [ -d /home/test ] && echo ''Directory found'' || echo ''Directory not found''
    sudo docker run busybox-1 [ -d /home/test ] && echo ''Directory found'' || echo ''Directory not found''

现在,我们有两个不同的镜像了(busybox 和 busybox-1),还有一个通过修改 busybox 容器得来的容器(多了一个 /home/test 文件夹)。下面来看看,是如何持久化这些修改的。

导出 (Export)

Export 命令用于持久化容器(不是镜像)。所以,我们就需要通过以下方法得到容器 ID:

sudo docker ps -a

接着执行导出:

sudo docker export <CONTAINER ID> > /home/export.tar

 

最后的结果是一个 2.7MB 大小的 Tar 文件(比使用 save 命令稍微小些)。

 

保存 (Save)

 

Save 命令用于持久化镜像(不是容器)。所以,我们就需要通过以下方法得到镜像名称:

 

sudo docker images

 

接着执行保存:

 

sudo docker save busybox-1 > /home/save.tar

 

 

最后的结果是一个 2.8MB 大小的 Tar 文件(比使用 export 命令稍微大些)。

 

它们之间的不同

 

现在我们创建了两个 Tar 文件,让我们来看看它们是什么。首先做一下小清理 —— 把所有的容器和镜像都删除:

 

# 查看所有的容器
    sudo docker ps -a

 

    # 删除它们
    sudo docker rm <CONTAINER ID>

 

    # 查看所有的镜像
    sudo docker images

 

    # 删除它们
    sudo docker rmi busybox-1
    sudo docker rmi busybox

 

 

 

译注:可以使用 docker rm $(docker ps -q -a) 一次性删除所有的容器,docker rmi $(docker images -q) 一次性删除所有的镜像。

 

现在开始导入刚刚导出的容器:

 

# 导入 export.tar 文件
    cat /home/export.tar | sudo docker import - busybox-1-export:latest

 

    # 查看镜像
    sudo docker images

 

    # 检查是否导入成功,就是启动一个新容器,检查里面是否存在 /home/test 目录(是存在的)
    sudo docker run busybox-1-export [ -d /home/test ] && echo ''Directory found'' || echo ''Directory not found''

 

使用类似的步骤导入镜像:

 

# 导入 save.tar 文件
    docker load < /home/save.tar

 

    # 查看镜像
    sudo docker images

 

    # 检查是否导入成功,就是启动一个新容器,检查里面是否存在 /home/test 目录(是存在的)
    sudo docker run busybox-1 [ -d /home/test ] && echo ''Directory found'' || echo ''Directory not found''

 

那,它们之间到底存在什么不同呢?我们发现导出后的版本会比原来的版本稍微小一些。那是因为导出后,会丢失历史和元数据。执行下面的命令就知道了:

 

# 显示镜像的所有层 (layer)
    sudo docker images --tree

 

执行命令,显示下面的内容。正你看到的,导出后再导入 (exported-imported) 的镜像会丢失所有的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史和层 (layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层 (layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚(可以执行 docker tag <LAYER ID> <IMAGE NAME > 来回滚之前的层)。

 

vagrant@Ubuntu-13:~$ sudo docker images --tree
    ├─f502877df6a1 Virtual Size: 2.489 MB Tags: busybox-1-export:latest
    └─511136ea3c5a Virtual Size: 0 B
      └─bf747efa0e2f Virtual Size: 0 B
        └─48e5f45168b9 Virtual Size: 2.489 MB
          └─769b9341d937 Virtual Size: 2.489 MB
            └─227516d93162 Virtual Size: 2.489 MB Tags: busybox-1:latest

Docker - 实现本地镜像的导出、导入(export、import、save、load)

Docker - 实现本地镜像的导出、导入(export、import、save、load)

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。

    对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。  

一、使用 export 和 import

1,查看本机的容器

这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。

原文:Docker - 实现本地镜像的导出、导入(export、import、save、load)

2,导出镜像

(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。
1 docker export f299f501774c > hangger_server.tar


(2)上面命令执行后,可以看到文件已经保存到当前的 docker 终端目录下。

原文:Docker - 实现本地镜像的导出、导入(export、import、save、load)

3,导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。
1 docker import - new_hangger_server < hangger_server.tar


(2)执行 docker images 命令可以看到镜像确实已经导入进来了。

原文:Docker - 实现本地镜像的导出、导入(export、import、save、load)

二、使用 save 和 load

1,查看本机的容器

这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

原文:Docker - 实现本地镜像的导出、导入(export、import、save、load)

2,保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

1 docker save 0fdf2b4c26d3 > hangge_server.tar


(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:

1 docker save -o images.tar postgres:9.6 mongo:3.4

 

3,载入镜像

使用 docker load 命令则可将这个镜像文件载入进来。
1 docker load < hangge_server.tar

 

附:两种方案的差别

特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。

 

1,文件大小不同

export 导出的镜像文件体积小于 save 保存的镜像  

2,是否可以对镜像重命名

  • docker import 可以为镜像指定新名称
  • docker load 不能对载入的镜像重命名

 

3,是否可以同时将多个镜像打包到一个文件中

  • docker export 不支持
  • docker save 支持

 

4,是否包含镜像历史

  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
  • 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
 

5,应用场景不同

  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。


原文出自:www.hangge.com  转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2411.html

Docker for Windows(三)Docker镜像与容器的区别&常用命令

Docker for Windows(三)Docker镜像与容器的区别&常用命令

Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
容器 = 镜像 + 读写层。

Docker常用命令:

docker version显示 Docker 版本信息
docker info显示 Docker 系统信息,包括镜像和容器数
docker pull <image-id>拉取或者更新指定镜像
docker create <image-id>创建镜像
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。


docker start <container-id>启动容器
docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。


docker run <image-id>启动镜像
看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。


实际上,docker run 命令先是利用镜像创建了一个容器,然后运行这个容器。这个命令非常的方便,并且隐藏了两个命令的细节,但从另一方面来看,这容易让用户产生误解。


docker ps 查看所有运行中的容器。
这隐藏了非运行态容器的存在,如果想要找出这些容器,我们需要使用docker ps –a这个命令。


docker images 命令会列出所有顶层镜像。
实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。


docker images –a命令列出了所有的镜像,也可以说是列出了所有的可读层。如果你想要查看某一个image-id下的所有层,可以使用docker history来查看。


docker stop <container-id>停止所有的进程docker stop命令会向运行中的容器发送一个SIGTERM的信号,然后停止所有的进程。


docker kill <container-id>杀死进程,docker kill 命令向所有运行在容器中的进程发送了一个不友好的SIGKILL信号。


docker rm <container-id>命令会移除构成容器的可读写层。注意,这个命令只能对非运行态容器执行。


docker rmi <image-id>命令会移除构成镜像的一个只读层。你只能够使用docker rmi来移除最顶层(top level layer)(也可以说是镜像),你也可以使用-f参数来强制删除中间的只读层。


docker commit <container-id>命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。


docker build我们从上图可以看到,build命令根据Dockerfile文件中的FROM指令获取到镜像,然后重复地1)run(create和start)、2)修改、3)commit。在循环中的每一步都会生成一个新的层,因此许多新的层会被创建。


docker exec <running-container-id>docker exec 命令会在运行中的容器执行一个新进程。


docker inspect <container-id>查看这个容器的详细信息,例如查看运行的数据库服务的连接信息。


docker save <image-id>docker save命令会创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。


docker export <container-id>docker export命令创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容(译者注:expoxt后的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像)。


docker history <image-id>docker history命令递归地输出指定镜像的历史镜像。


firewall-cmd --add-port=3306/tcp开放端口
systemctl stop firewalld关闭防火墙

 

docker import和docker load的区别是什么?

docker import和docker load的区别是什么?

区别:docker load命令导入镜像库存储文件到本地镜像库;docker import命令导入一个容器快照到本地镜像库。容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

docker import和docker load的区别是什么?

首先,想要清楚的了解docker load与docker import命令的区别,就必须了解镜像与容器的区别:

  • 镜像:用来启动容器的只读模板,是容器启动所需的rootfs,类似于虚拟机所使用的镜像。
  • 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

镜像是容器的基础,可以简单的理解为镜像是我们启动虚拟机时需要的镜像,容器时虚拟机成功启动后,运行的服务。

  想要了解docker load与docker import命令的区别,还必须知道docker save与docker export命令:

  • docker save images_name:将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
  • docker export container_id:将一个容器导出为文件,再使用docker import 命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

docker import和docker load的区别

实际上,既可以使用docker load命令来导入镜像库存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。

两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。此外从容器快照文件导入时,也可以重新指定标签等元数据。

推荐教程:《docker教程》、《PHP教程》

以上就是docker import和docker load的区别是什么?的详细内容,更多请关注php中文网其它相关文章!

docker run中-v指令与Dockerfile中volume命令的区别

docker run中-v指令与Dockerfile中volume命令的区别

volume

Dockerfile中 VOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ 目录下的,代码如下:

FROM frolvlad/alpine-java:jre8-slim
MAINTAINER oas.cloud
COPY nickdir .
VOLUME /usr/local/oas/file/
WORKDIR /usr/local/oas/

上述 VOLUME /usr/local/oas/file/ 定义的是容器内目录所在路径,在容器创建过程中会在容器中创建该目录,而宿主机上的挂载目录名是随机生成的,
例如:

/var/lib/docker/volumes/593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37

上面的目录位于宿主机,对应容器中的 /usr/local/oas/file/ 目录。

docker run -v

docker -v 可以指定挂载到宿主机的具体目录,相对于Dockerfile的 VOLUME 挂载方式更具有可控性,代码如下:

$ docker run —name tengine-web -d -p 9527:80 -p 9000:9000 \
-v /usr/local/tengine/logs:/var/log/nginx \
-v /usr/local/tengine/conf.d:/etc/nginx/conf.d \
-v /usr/local/tengine/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/tengine/html:/usr/share/nginx/html \
-v /usr/local/oas/file:/usr/local/oas/file nginx

上述命令就可以将宿主机的 /usr/local/tengine/logs 等目录挂载到容器的 /var/log/nginx 等对应目录,冒号前为宿主机目录(绝对路径),冒号后为镜像内挂载的路径(绝对路径)。

本文内容均引用自:Dockerfile 中 VOLUME 与 docker -v 的区别说明

今天关于Docker 的 save 和 export 命令的区别docker save -o的介绍到此结束,谢谢您的阅读,有关Docker - 实现本地镜像的导出、导入(export、import、save、load)、Docker for Windows(三)Docker镜像与容器的区别&常用命令、docker import和docker load的区别是什么?、docker run中-v指令与Dockerfile中volume命令的区别等更多相关知识的信息可以在本站进行查询。

本文标签: