Docker容器数据持久化 --volumes

docker 容器内的数据是独立于镜像之外的,利用「数据卷」将其持久化到宿主机。

数据卷

数据卷其实就是一个目录或者一个文件,该目录(或文件)可以存在于宿主机上。将此目录(或文件)映射到容器中,便可以持久化容器内的数据到宿主机。
如果目录不存在于宿主机上,而是存在于一个容器内部,那么此容器便可以被称为「数据卷容器」

下面讲解一下具体的操作方式。

持久化到目录/ 文件
数据卷如果是宿主机的一个目录,可以进行如下操作将容器内的数据持久化:

命令用法如下:

1docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
2docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]

该命令是通过一个镜像启动一个容器。
--name指定容器的名称;
-v指定宿主机的某目录作为数据卷挂载到容器中,使该容器与宿主机共享此目录 。

注意
1.如果本地路径不存在,docker 会自动创建。
2.宿主机的目录请使用绝对路径。

操作实例:
1、执行如下命令,将宿主机的 /Users/peter/dockerdata/ 目录映射到新创建的nginx 容器中的 /data 目录:

1docker run -itd --name nginx -v /Users/peter/dockerdata:/data nginx
2
3docker run -itd --name nginx -v /Users/ethanyan/dockerdata/testdata.txt:/data/testdata.txt nginx

2、接下来验证是否生效,先在本地共享目录下创建一个新目录 NG

1cd /Users/ethanyan/dockerdata
2mkdir NG

3、进入容器 nginx 中看是否存在 NG目录:

1docker exec -it nginx /bin/bash #进入nginx容器
2ls /data   #列出data文件下的内容
3NG

可发现在本地创建目录后,容器内的确实也出现了新建的目录。

4、以上操作反之亦然
在容器的 /data/NG目录中创建一个文件testdata.txt ,退出容器后发现本地也出现了该文件。
使用此方法可以让容器和宿主机共享目录/文件,并将容器内的数据持久化到本地。

持久化到容器
如果不想这些数据直接暴露在宿主机,可以使用数据卷容器的方式。将数据卷容器挂载到其他容器,就可以多个容器之间共享数据了,而且还可以持久化的保存数据(后面会讲解如何备份和恢复数据卷容器)

注意:数据卷容器不启动

1、创建数据卷容器

1docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
2
3docker create -v /data/ --name data nginx

既然需要创建一个数据卷容器,那么就需要使用镜像,一般大家都习惯使用 centos 或者 Ubuntu 作为基础镜像

2、将数据卷容器挂载到其他容器

1# 创建容器并挂载数据卷命令
2docker run --volumes-from [数据卷容器 id/name] -itd --name [容器名字] [镜像名称] [命令(可选)]
3# 示例 
4docker run  --volumes-from VolumesID -itd --name nginx_test1 nginx /bin/bash
5docker run  --volumes-from VolumesID -itd --name nginx_test2 nginx /bin/bash

注意:使用数据卷容器是容器之间共享数据,不涉及宿主机,因此数据没有在宿主机上。

备份与恢复
数据卷容器的备份与恢复并不是容器的备份与恢复,实质上是数据的备份与恢复。

备份

1docker run -it --volumes-from [数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar cvf [备份文件路径] [要备份的目录]

我们执行示例命令:

1docker run -it --volumes-from data -v /Users/peter/dockerdata/:/backup nginx tar cvf /backup/backup.tar /data
2tar: Removing leading `/' from member names
3/data/
4/data/file.txt
5

该命令是加载数据卷容器并将容器内的/data目录打包,然后把压缩包保存到 映射到容器内 的新数据卷,本地目录为 /Users/peter/dockerdata/ 。执行完后,会在本地该目录出现压缩包 backup.tar

注意:
1、备份的命令执行完后会创建出一个临时容器,删除即可。重要的是压缩包。
之所以会出现一个临时容器,是因为备份的原理是:
创建一个新的容器挂载数据卷容器,而且此容器还与宿主机共享了一个目录(新数据卷),执行打包命令将数据卷容器内的数据打包保存到共享目录中,所以本地会出现一个压缩包。

恢复
1、创建一个新的数据卷容器 data_new

1docker create -v /data/ --name data_new nginx

2、恢复之前的备份文件

1docker run --volumes-from [新创建的数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar xvf [备份文件]
2
3# 执行示例命令
4docker run --volumes-from data_new -v /Users/peter/dockerdata/:/backup nginx tar xvf /backup/backup.tar
5data/
6data/file.txt

3、为了验证是否恢复,我们可以新创建一个容器并挂载新的数据卷容器:

1docker run  --volumes-from data_new -itd --name nginx_test6 nginx /bin/bash
2
3docker exec -it nginx_test6 /bin/bash
4
5root@2b54f0bfefbe:/# ls /data
6file.txt
7root@2b54f0bfefbe:/# cat /data/file.txt
8hello world

可看到数据卷容器已经恢复。

备份与恢复的原理

不管是备份还是恢复,我们都使用了一个中间介质,此介质便是一个容器。因为数据卷容器是不启动的,为了备份数据,我们就需要使用一个挂载了此数据卷容器的中间介质(容器)。此介质不光要能连接数据卷容器,还需要连接本地,因此我们又将本地的一个目录映射到了中间介质中。

备份就是中间介质将数据卷容器的目录打包后,再通过映射的目录共享给本地,所以本地会出现一个压缩包。容器列表多了一个新的容器,此容器便是中间介质。

恢复就是中间介质通过映射到容器的共享目录,读取到本地的备份文件(压缩包),然后在容器内部解压缩,数据就恢复到了挂载的数据卷容器中。

当然,此中间介质也可以使用--name 参数命名,便于删除。

docker容器网桥连接

容器之间如何互相通讯?具体的命令有哪些?

桥接(网桥)

网桥可以简单的理解为「局域网」,使加入网桥的容器之间可以互相通讯、暴露全部链接,同时与外界又保证了相对隔离的运行环境。

新建网络
下面先创建一个新的 Docker 网络。

1$ docker network create -d bridge [网桥名称]
2$ docker network create -d bridge test-net

参数-d bridge是默认配置,可写可不写
参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode(集群模式),在本小节中你可以忽略它。



docker程序如何持久化存储图片 docker 数据持久化_数据

创建网桥

通过网桥连接容器
连接网桥分为3种方式,一种是在创建容器时连接网桥,一种是在容器已经运行时连接网桥,最后一种是运行容器时连接网桥:
1、创建容器并连接:

1docker create --name [容器名称] --network [网桥名称] [镜像名称]
2docker create --name test1 --network test-net ubuntu

2、容器已经运行时连接:

1docker network connect [网桥名称] [容器名称]
2docker network connect test-net ubuntu

3、运行一个容器并连接到网桥:

1$ docker run -itd --name [容器名] --network [网桥名称] [镜像名称] /bin/bash
2$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

查看所有网桥

1docker network ls

查看某网桥的配置信息

1docker network inspect [网桥id或者名称]

删除网桥

1docker network rm [网桥id或者名称]

ping 查看容器是否连接
ping命令,大家都很熟悉吧。
如果未安装,首先需要安装Ping

1$ apt-get update
2$ apt install iputils-ping
3
4#进入容器test1内部
5$ docker exec -it test1 /bin/bash 
6
7$ ping test1   #进入容器test2里面ping test1
8$ ping test2   #进入在容器test1里面ping test2



docker程序如何持久化存储图片 docker 数据持久化_数据_02

docker程序如何持久化存储图片 docker 数据持久化_nginx_03