在这篇文章中,我们将带领您了解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 - 实现本地镜像的导出、导入(export、import、save、load)
- Docker for Windows(三)Docker镜像与容器的区别&常用命令
- docker import和docker load的区别是什么?
- docker run中-v指令与Dockerfile中volume命令的区别
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
1,查看本机的容器
这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。2,导出镜像
(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。1 |
docker export f299f501774c > hangger_server.tar
|
(2)上面命令执行后,可以看到文件已经保存到当前的 docker 终端目录下。
3,导入镜像
(1)使用 docker import 命令则可将这个镜像文件导入进来。1 |
docker import - new_hangger_server < hangger_server.tar
|
(2)执行 docker images 命令可以看到镜像确实已经导入进来了。
二、使用 save 和 load
1,查看本机的容器
这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。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镜像(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 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 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命令的区别等更多相关知识的信息可以在本站进行查询。
本文标签: