Docker核心技术(二)

镜像

镜像简介

Docker镜像是什么? 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。

搜索、查看、获取

搜索镜像

#作用
搜索Docker Hub(镜像仓库)上的镜像 
#命令格式: 
docker search [镜像名称] 
#命令演示: 
$ docker search ubuntu 
#NAME:名称 
#DESCRIPTION:基本功能描述 
#STARS:下载次数
#OFFICIAL:官方 
#AUTOMATED:自动的运行

获取镜像

#作用:
下载远程仓库(如Docker Hub)中的镜像 
#命令格式: 
docker pull [镜像名称] 
#命令演示: 
$ docker pull ubuntu 
$ docker pull nginx 
#注释: 
#获取的镜像在哪里? 
#/var/lib/docker 目录下 #由于权限的原因我们需要切换root用户 #那我们首先要重设置root用户的密码: 
:~$ sudo passwd root #这样就可以设置root用户的密码了。 #之后就可以自由的切换到root用户了 
:~$ su #输入root用户的密码即可。 #当然,如果想从root用户切换回一般用户,则可使用 su -val(一般用户名) #而当你再次切回到root用户,则只需要键入exit,再次输入exit则回到最初的用户下 #操作下面的文件可以查看相关的镜像信息 
:~$ vim /var/lib/docker/image/overlay2/repositories.json

查看镜像

#作用:列出本地镜像 
#命令格式: 
docker images [镜像名称] 
docker image ls [镜像名称] 
#命令演示: $ docker images #镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记, 默认使用latest标记信息 
#docker images -a 列出所有的本地的images(包括已删除的镜像记录) #REPOSITORY:镜像的名称 
#TAG :镜像的版本标签 
#IMAGE ID:镜像id 
#CREATED:镜像是什么时候创建的 
#SIZE:大小

重命名、删除

镜像重命名

#作用:
对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像 
#命令格式: 
docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本] 
#命令演示: 
$ docker tag nginx:latest panda-nginx:v1.0

删除镜像

#作用:
将本地的一个或多个镜像删除 
#命令格式: 
docker rmi [命令参数][镜像ID] 
docker rmi [命令参数][镜像名称]:[镜像版本] 
docker image rm [命令参数][镜像] 
#命令演示: 
$docker rmi 3fa822599e10 
$docker rmi mysql:latest #注意: 如果一个image_id存在多个名称,那么应该使用 名称:版本 的格式删除镜像 
#命令参数(OPTIONS): 
-f, --force 强制删除

导出、导入

导出镜像

将已经下载好的镜像,导出到本地,以备后用。

#作用:
将本地的一个或多个镜像打包保存成本地tar文件 #命令格式: 
docker save [命令参数][导出镜像名称][本地镜像镜像] #命令参数(OPTIONS): 
-o, --output string 指定写入的文件名和路径 #导出镜像
:~$ docker save -o nginx.tar nginx 

导入镜像

#作用:
将save命令打包的镜像导入本地镜像库中 #导入镜像命令格式: 
$ docker load [命令参数][被导入镜像压缩文件的名称] $ docker load < [被导入镜像压缩文件的名称] 
$ docker load --input [被导入镜像压缩文件的名称] #命令参数(OPTIONS): 
-i, --input string指定要打入的文件,如没有指定,默认是STDIN 
#为了更好的演示效果,我们先将nginx的镜像删除掉 docker rmi nginx:v1.0 
docker rmi nginx 
#导入镜像文件: 
$ docker load < nginx.tar
#注意:
如果发现导入的时候没有权限需要使用chmod命令修改镜像文件的权限 

历史、创建

查看镜像历史

#作用:
查看本地一个镜像的历史(历史分层)信息 #查看镜像命令格式: 
docker history [镜像名称]:[镜像版本] docker history [镜像ID] #我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息 
$ docker history sswang-nginx:v1.0 
#IMAGE:编号 
#CREATED:创建的 
#CREATED BY :基于那些命令创建的 
#SIZE:大小 
#COMMENT:评论

镜像详细信息

#作用:
查看本地一个或多个镜像的详细信息 
#命令格式: 
$ docker image inspect [命令参数] [镜像名称]:[镜像版本] 
$ docker inspect [命令参数] [镜像ID] #查看镜像详细信息: 
$ docker inspect nginx 

根据模板创建镜像

#登录系统模板镜像网站:
#https://download.openvz.org/template/precreated/ #找到一个镜像模板进行下载,比如说ubuntu-16.04-x86_64.tar.gz,地址为:
#https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz 
#命令格式:
cat 模板文件名.tar | docker import - [自定义镜像名] 
#演示效果: 
$ cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-mini

总结

4.png

容器管理

docker容器技术指Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs)

containers的中文解释是集装箱。

Docker则实现了一种应用程序级别的隔离,它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器”上来。

容器简介

容器是什么?

容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何
地方以相同的方式运行

  • Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
  • 容器具备一定的生命周期。
  • 另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。

我们就可以理解容器就是被封装起来的进程操作,只不过现在的进程可以简单也可以复杂,复杂的话可以运行1个操作系统.简单的话可以运行1个回显字符串.

容器与虚拟机的相同点

  • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
  • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
  • 容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
  • 同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers下

容器与虚拟机的不同点

注意:容器并不是虚拟机,但它们有很多相似的地方

  • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运
    行在宿主机的内核上,其本质上以一系列进程的结合。
  • 容器是轻量级的,虚拟机是重量级的。
    首先容器不需要额外的资源来管理,虚拟机额外更多的性能消耗;
    其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
  • 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

查看、创建、启动

查看容器

#作用显示docker容器列表 
#命令格式: 
docker ps 
#命令演示: 
$ docker ps 
#CONTAINER ID 容器ID 
#IMAGE 基于那个镜像 
#COMMAND 运行镜像使用了哪些命令? #CREATED多久前创建时间 
#STATUS 开启还是关闭 
#PORTS端口号 
#NAMES容器名称默认是随机的 
#注意: 
管理docker容器可以通过名称,也可以通过ID

ps是显示正在运行的容器
-a是显示所有运行过的容器,包括已经不运行的容器

创建待启动容器

#作用:
利用镜像创建出一个Created 状态的待启动容器 #命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create [参数命令] 依赖镜像 [容器内命令] [命令参数] 
#命令参数(OPTIONS):
-t, --tty 分配一个伪TTY,也就是分配虚拟终端 
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称 
#命令参数(COMMAND\ARG): 
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
#创建容器(附上ls命令和a参数)
docker create -it --name ubuntu-1 ubuntu ls -a 

启动容器

启动容器有三种方式

  • 启动待启动或已关闭容器
  • 基于镜像新建一个容器并启动
  • 守护进程方式启动docker

启动容器

#作用:
将一个或多个处于创建状态或关闭状态的容器启动起来 #命令格式: 
docker start [容器名称]或[容器ID] #命令参数(OPTIONS): 
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上 
-i, --interactive 将当前shell的 STDIN连接到容器上
#启动上面创建的容器 
docker start -a ubuntu-1 

创建新容器并启动

#作用:
利用镜像创建并启动一个容器 
#命令格式: 
docker run [命令参数] [镜像名称][执行的命令] 命令参数(OPTIONS):
-t, --tty 分配一个伪TTY,也就是分配虚拟终端 
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称 
-d, --detach 在后台运行容器并打印出容器ID 
--rm 当容器退出运行后,自动删除容器
#启动一个镜像输出内容并删除容器 
$ docker run --rm --name nginx1 nginx /bin/echo "hello docker"
#注意: 
docker run 其实 是两个命令的集合体 docker create + docker start

守护进程方式启动容器<常用的方式>

更多的时候,需要让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现

#命令格式: 
docker run -d [image_name] command ... #守护进程方式启动容器: 
:~$ docker run -d nginx 

暂停与取消暂停与重启

容器暂停

#作用:
暂停一个或多个处于运行状态的容器 
#命令格式: 
docker pause [容器名称]或[容器ID] 
#暂停容器 
docker pause a229eabf1f32 

容器取消暂停

#作用:
取消一个或多个处于暂停状态的容器,恢复运行
#命令格式: 
docker unpause [容器名称]或[容器ID] 
#恢复容器 
docker unpause a229eabf1f32 

重启

#作用:
重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
该命令相当于stop和start命令的结合 
#命令格式: 
docker restart [容器名称]或[容器ID]
#命令参数(OPTIONS):
-t, --time int 重启前,等待的时间,单位秒(默认 10s) 
#恢复容器 
docker restart -t 20 a229eabf1f32 12345678910

关闭、终止、删除

关闭容器

在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器

#作用:
延迟关闭一个或多个处于暂停状态或者运行状态的容器
#命令格式: 
docker stop [容器名称]或[容器ID] 
#关闭容器: 
$ docker stop 8005c40a1d16 

中止容器

#作用:
强制并立即关闭一个或多个处于暂停状态或者运行状态的容器 
#命令格式: 
docker kill [容器名称]或[容器ID] 
#终止容器 
$ docker kill 8005c40a1d16 

删除容器

删除容器有三种方法: 正常删除 -- 删除已关闭的

强制删除 -- 删除正在运行的

强制批量删除 -- 删除全部的容器

正常删除容器

#作用:
删除一个或者多个容器 
#命令格式: 
$ docker rm [容器名称]或[容器ID]
#删除已关闭的容器: 
$ docker rm 1a5f6a0c9443

Error response from daemon: You cannot remove a running container c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9. Stop the container before attempting removal or force remove
错误响应守护进程:你不能删除一个容器
c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9运行。
在尝试拆卸或强制拆 卸之前,先停止容器。

强制删除运行容器

#作用:
强制删除一个或者多个容器 
#命令格式: 
docker rm -f [容器名称]或[容器ID]
#删除正在运行的容器 
$ docker rm -f 8005c40a1d16

拓展批量关闭容器

#作用:
批量强制删除一个或者多个容器 
#命令格式: 
$ docker rm -f $(docker ps -a -q)
#按照执行顺序$(), 获取到现在容器的id然后进行删除

进入、退出

进入容器我们学习三种方法:

  • 创建容器的同时进入容器
  • 手工方式进入容器
  • 生产方式进入容器

创建并进入容器

#命令格式: 
docker run --name [container_name] -it [docker_image] /bin/bash 
#命令演示: 
$ docker run -it --name panda-nginx nginx /bin/bash 
#进入容器后 root@7c5a24a68f96:/
# echo "hello world" hello world root@7c5a24a68f96:/
# exit exit 
#docker 容器启动命令参数详解:
#--name:给容器定义一个名称
#-i:则让容器的标准输入保持打开。
#-t:让docker分配一个伪终端,并绑定到容器的标准输入上 
#/bin/bash:执行一个命令 

退出容器

#方法一: 
exit 
#方法二: 
Ctrl + D 

手工方式进入容器

#命令格式: 
docker exec -it 容器id /bin/bash 
#效果演示: 
$ docker exec -it d74fff341687 /bin/bash 

生产方式进入容器

我们生产中常用的进入容器方法是使用脚本,脚本内容如下

#!/bin/bash 
#定义进入仓库函数 
docker_in(){ 
    NAME_ID=$1
    PID=$(docker inspect --format {{.State.Pid}} $NAME_ID) 
    nsenter --target $PID --mount --uts --ipc --net --pid 
}
docker_in $1 

直接执行的话是没有执行权限的所以需要赋值权限

#赋权执行 
$ chmod +x docker_in.sh 
#进入指定的容器,并测试
$ ./docker_in.sh b3fbcba852fd

注意:当拷贝到linux下的时候会出现

-bash: ./docker_in.sh: /bin/bash^M: 解释器错误: 没有那个文件或目录这个问题大多数是因为你的脚本文件在windows下编辑过。windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat -A docker_in.sh时你可以看到这个\r字符被显示为^M,这时候只需要删除这个字符就可以了。可以使用命令 sed -i 's/\r$//' docker_in.sh

基于容器创建镜像

方式一:

#命令格式: 
docker commit -m '改动信息' -a "作者信息" [container_id][new_image:tag] 
#命令演示: 
#进入一个容器,创建文件后并退出:
$ ./docker_in.sh d74fff341687 
$ mkdir /hello 
$ mkdir /world 
$ ls 
$ exit 
#创建一个镜像: 
$ docker commit -m 'mkdir /hello /world ' -a "panda" d74fff341687 nginx:v0.2 
#查看镜像: 
$ docker images 
#启动一个容器 
$ docker run -itd nginx:v0.2 /bin/bash
#进入容器进行查看 
$ ./docker_in.sh ae63ab299a84 
$ ls 

方式二:

#命令格式: 
docker export [容器id] > 模板文件名.tar
#命令演示: 
#创建镜像: 
$ docker export ae63ab299a84 > nginx.tar
#导入镜像: 
$ cat nginx.tar | docker import - panda-test

导出(export)导入(import)与保存(save)加载(load)的恩怨情仇

import与load的区别:

import可以重新指定镜像的名字,docker load不可以

export 与 保存 save 的区别:

1、export导出的镜像文件大小,小于 save保存的镜像。

2、export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史。


日志、信息、端口、重命名

查看容器运行日志

#命令格式: 
docker logs [容器id] 
#命令效果:
$ docker logs 7c5a24a68f96 

查看容器详细信息

#命令格式:
docker inspect [容器id] 
#命令效果: 
查看容器全部信息: 
$ docker inspect 930f29ccdf8a 
查看容器网络信息: 
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 930f29ccdf8a

查看容器端口信息

#命令格式: 
docker port [容器id] 
#命令效果: 
$ docker port 930f29ccdf8a
#没有效果没有和宿主机关联

容器重命名

#作用:
修改容器的名称
#命令格式: 
docker rename [容器id]或[容器名称] [容器新名称]
#命令效果: 
$ docker rename 930f29ccdf8a u1 

数据管理

生产环境使用Docker的过程中,往往需要对数据进行持久化保存,或者需要更多容器之间进行数据共享,那我们需要怎么要的操作呢?

答案就是:数据卷(DataVolumes)和数据卷容器(Data Volume Containers)

数据卷简介

什么是数据卷?

就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
数据卷(Data Volumes):容器内数据直接映射到本地主机环境

数据卷特性
  • 数据卷可以在容器之间共享和重用,本地与容器间传递数据更高效;
  • 对数据卷的修改会立马有效,容器内部与本地目录均可;
  • 对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作;
  • 卷会一直存在,直到没有容器使用。

docker 数据卷命令详解

:~$ docker run --help 
-v, --volume list Bind mount a volume (default []) 
挂载一个数据卷,默认为空 

我们可以使用命令 docker run用来创建容器,可以在使用docker run 命令时添加-v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中。 -v参数的作用是将宿主机的一个目录作为容器的数据挂载到docker容器中,使宿主机和容器之间可以共享一个 目录,如果本地路径不存在,Docker也会自动创建。

数据卷实践

关于数据卷的管理我们从两个方面来说:

  • 目录
  • 普通文件

数据卷实践之目录

#命令格式: 
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录][镜像名称] [命令(可选)]
#命令演示: 
#创建测试文件: 
$ echo "file1" > tmp/file1.txt
#启动一个容器,挂载数据卷: 
$ docker run -itd --name test1 -v /home/itcast/tmp/:/test1/ nginx
#注意宿主机目录需要绝对路径 
#测试效果
$ docker exec -it a53c61c77 /bin/bash root@a53c61c77bde:/# cat /test1/file1.txt file1

数据卷实践 之 文件{不推荐}

#命令格式: 
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件][镜像名称] [命令(可选)]
#命令演示: 
#创建测试文件 
$ echo "file1" > /tmp/file1.txt
#启动一个容器,挂载数据卷
$ docker run -itd --name test2 -v /home/itcast/tmp/file1.txt:/nihao/nihao.sh nginx
#测试效果 
:~$ docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh 
file1 

注意:

  • Docker挂载数据卷的默认读写权限(rw),用户可以通过ro设置为只读 格式:[宿主机文件]:[容器文件]:ro
  • 如果直接挂载一个文件到容器,使用文件工具进行编辑,可能会造成文件的改变,从Docker1.1.0起,这会导致 报错误信息。所以推荐的方式是直接挂在文件所在的目录。

数据卷容器简介

什么是数据卷容器? 需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。数据卷容器(Data VolumeContainers):使用特定容器维护数据卷简单点:数据卷容器就是为其他容器提供数据交互存储的容器

docker 数据卷命令详解

:~$ docker run --help 
。。。 
-v, --volumes-from list Mount volumes from the specified container(s) (default[])
#从指定的容器挂载卷,默认为空

数据卷容器操作流程

如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:

  • 创建数据卷容器
  • 其他容器挂载数据卷容器

注意: 数据卷容器自身并不需要启动,但是启动的时候依然可以进行数据卷容器的工作。

数据卷容器实践

数据卷容器实践包括两部分:创建数据卷容器和使用数据卷容器

创建一个数据卷容器

#命令格式: 
docker create -v [容器数据卷目录] --name [容器名字][镜像名称] [命令(可选)]
#执行效果 
$ docker create -v /data --name v1-test1 nginx

创建两个容器,同时挂载数据卷容器

#命令格式:
docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字][镜像名称] [命令(可 选)]
#执行效果: 
#创建 vc-test1 容器: 
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash 
#创建 vc-test2 容器: 
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash

确认卷容器共享

#进入vc-test1,操作数据卷容器: 
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt 
root@c408f4f14786:/# exit
#进入vc-test2,确认数据卷: 
:~$ docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt 
root@7448eee82ab0:/# ls /data/ 
v-test1.txt
root@7448eee82ab0:/# exit 
#回到vc-test1进行验证 
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/ 
v-test1.txt v-test2.txt 
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2 

数据备份原理

为什么需要数据备份和恢复? 工作中很多的容器的数据需要查看,所有需要备份将数据很轻松的拿到本地目录。
原理图:


5.png

数据备份方案:

  • 创建一个挂载数据卷容器的容器
  • 挂载宿主机本地目录作为备份数据卷
  • 将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中
  • 完成备份操作后销毁刚创建的容器

数据备份实践

#命令格式:
$ docker run --rm --volumes-from [数据卷容器id/name] -v [宿主机目录]:[容器目录][镜像名称] [备份命令]
#命令演示: 
#创建备份目录: 
$ mkdir /backup/ 
#创建备份的容器: 
$ docker run --rm --volumes-from 60205766d61a -v /home/itcast/backup/:/backup/ nginx tar zcPf /backup/data.tar.gz /data 
#验证操作: 
$ ls /backup 
$ zcat /backup/data.tar.gz

注释: -P:使用原文件的原来属性(属性不会依据使用者而变),恢复字段到它们的原始方式,忽略现有的用户权限屏蔽位(umask)。加了-p之后,tar进行解压后,生成的文件的权限,是直接取自tar包里面文件的权限(不会再使用该用户的umask值进行运算),那么不加-p参数,将还要再减去umask的值(位运算的减),但是如果使用root用户进行操作,加不加-p参数都一样。

数据还原原理

原理图:
数据恢复方案


6.png
  • 创建一个新的数据卷容器(或删除原数据卷容器的内容)
  • 创建一个新容器,挂载数据卷容器,同时挂载本地的备份目录作为数据卷
  • 将要恢复的数据解压到容器中
  • 完成还原操作后销毁刚创建的容器

数据还原实践

#命令格式: 
docker run --rm -itd --volumes-from [数据要到恢复的容器] -v [宿主机备份目录]:[容器备份目录] [镜像名称] [解压命令] 
#命令实践: 
#启动数据卷容器
$ docker start c408f4f14786 
#删除源容器内容: 
$ docker exec -it vc-test1 bash root@c408f4f14786:/# rm -rf /data/* 
#恢复数据: 
docker run --rm --volumes-from v-test -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /data 
#验证:
:~$ docker exec -it vc-test1/bin/bash
root@c408f4f14786:/# ls /data/data/ 
v-test1.txt v-test2.txt 
#新建新的数据卷容器: 
:~$ docker create -v /newdata --name v-test2 nginx 
#简历新的容器挂载数据卷容器
:~$ docker run --volumes-from a7e9a33f3acb -tid --name vc-test3 nginx /bin/bash 
#恢复数据: 
docker run --rm --volumes-from v-test2 -v /home/itcast/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /newdata 
#验证: 
:~$ docker exec -it vc-test3 /bin/bash
root@c408f4f14786:/
# ls /newdata 
v-test1.txt v-test2.txt 

注意: 解压的时候,如果使用目录的话,一定要在解压的时候使用 -C制定挂载的数据卷容器,不然的话容器数据是无法恢复的,因为容器中默认的backup目录不是数据卷,即使解压后,也看不到文件。数据是最宝贵的资源,docker在设计上考虑到了这点,并且为数据的操作提供了充分的支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容