一、数据卷管理
数据卷的作用是将宿主机的某个磁盘目录映射到容器的某个目录,从而实现宿主机和容器之间的数据共享。
命令格式:
$ docker run -itd --name [容器名称] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
下面实现一个使用数据卷实现文件共享的案例:把宿主机的zhong-test目录挂载到容器的tmp目录。
docker run -itd --name nginx-1 -v /home/zhongliwen/zhong-test:/tmp nginx
二、数据卷容器管理
数据卷容器的作用是实现多个容器之间的数据共享。其实,数据卷容器也是一个容器,但是与其他Docker容器不一样的是,数据卷容器是专门用来提供数据卷给其他容器进行挂载操作。
下面实现使用数据卷容器实现容器之间数据共享的案例。具体需求如下:
第一步:创建一个数据卷容器。
$ docker create -v [数据卷容器目录] --name [数据卷容器名称] [镜像名称] [命令(可选)]
例如:使用nginx镜像创建一个名为“container01”容器,并在该容器中创建一个data目录。
$ docker create -v /data --name container01 nginx
第二步:创建两个容器,并且把它们挂载到上面的数据卷容器中。
$ docker run --volumns-from [数据卷容器ID或名称] -tid --name [容器名称] [镜像名称] [命令(可选)]
例如:
$ docker run --volumes-from container01 -tid --name nginx-test-1 nginx
$ docker run --volumes-from container01 -tid --name nginx-test-2 nginx
执行完后,容器的状态如下图所示:
测试步骤:
# 进入ngnix-test-1容器
$ docker exec -it nginx-test-1 /bin/bash
# 进入data目录
$ root@xxxx:/# ls
$ root@xxxx:/# cd data
# 新建一个hello文件夹
$ root@xxxx:/# mkdir hello
然后启动另外一个会话进行测试。
# 进入ngnix-test-2容器
$ docker exec -it nginx-test-2 /bin/bash
# 查看data目录
$ root@xxxx:/# ls
这时候可以看到,在nginx-test-2容器的data目录也有一个hello目录。如果在该data文件夹进行所有的操作,都会自动同步到nginx-test-1容器的data目录中。
三、数据备份
数据备份方案:
- 创建一个容器,该容器专门用于挂载数据卷容器;
- 创建一个数据卷,然后把本地目录挂载到该数据卷;
- 将数据卷容器的内容备份到该数据卷中;
- 完成备份后销毁数据卷容器;
数据备份的命令格式:
$ docker run --rm --volumes-from [数据卷容器ID或名称] -v [宿主机目录]:[容器目录] [镜像名称] [备份命令]
例如:把数据卷容器中的data目录备份到宿主机的backup目录中。
# 在宿主机上创建备份目录
$ mkdir backup
# 创建备份容器,把宿主机的backup目录挂载到该容器的backup目录。
# 执行tar备份命令,把数据卷容器中的data目录进行压缩,压缩文件保存在备份容器的backup目录下中。
# 由于宿主机backup目录已经被挂载到备份容器上,因此在宿主机backup目录中也可以看到该压缩文件。
# 由于指定了--rm参数,当备份容器启动完成后,它会自动被删除掉。
$ docker run --rm --volumes-from container01 -v /home/zhongliwen/backup/:/backup/ nginx tar zcPf /backup/data.tar.gz /data
# 查看备份文件
$ ls /backup
# 解压缩文件
$ tar -zxvf data.tar.gz
执行完成后,可以发现backup目录下有一个data目录,该data目录就是数据卷容器中的data目录的备份。
四、数据还原
数据还原方案:
- 创建一个新的数据卷容器;
- 创建一个新的容器,并且挂载到数据卷容器中,同时挂载本地的备份目录作为数据卷;
- 将要恢复的数据解压到容器中;
- 销毁刚创建的容器;
数据还原的命令格式:
$ docker run --rm -itd --volumes-from [数据要恢复到的容器] -v [宿主机备份目录]:[容器备份目录] [镜像名称] [解压命令]
例如:
# 启动数据卷容器
$ docker start container01
# 进入数据卷容器
$ docker exec -it container01 bash
# 删除data目录中的数据
root@xxx:/# rm -rf /data/*
root@xxx:/# exit
# 创建还原容器,把宿主机的backup目录挂载到该容器的backup目录
# 执行tar命令,对宿主机backup目录下的data.tar.gz文件进行解压,解压后的数据保存在还原容器的data目录
# 由于指定了--rm参数,当还原容器启动完成后,它会自动被删除掉。
docker run --rm --volumes-from container01 -v /home/zhongliwen/backup/:/backup/ nginx tar xPf /backup/data.tar.gz -C /data
# 重新进入数据卷容器中
$ docker exec -it container01 bash
# 查看data目录
root@xxx:/# ls data
最后,可以看到数据卷容器data目录下的数据又被恢复回来了!!!