Docker Data Volume 详解及示例

1、Docker Data Volume

1.1 概念介绍

  • Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层

  • 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制

  • 关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会全部丢失

  • 存在的问题:

    # 存储于联合文件系统中,不易于宿主机访问;
    # 容器间数据共享不便
    # 删除容器其数据会丢失
    
  • 解决方案:“卷(volume)”
    “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定(关联)”
    在这里插入图片描述

  • Data volumes provide several useful features for persistent or shared data

    # Volume于容器初始化之时即会创建,由base image提供的卷中的数据会于此期间完成复制
    # Data volumes can be shared and reused among containers
    # Changes to a data volume are made directly
    # Changes to a data volume will not be included when you update an image
    # Data volumes persist even if the container itself is deleted
    
  • Volume的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时既不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作

  • 卷为docker提供了独立于容器的数据管理机制

1.2 Docker Volume 管理机制

卷为docker提供了独立于容器的数据管理机制:

  • 可以把“镜像”想像成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享
  • 卷实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和“制作镜像的主机”分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境

在这里插入图片描述

1.3 Docker Volume Types

Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同:

# Bind mount volume
	# a volume that points to a user-specified location on the host file system
# Docker-managed volume
	# the Docker daemon creates managed volumes in a portion of the host’s file system that’s owned byDocker

在这里插入图片描述

1.4 Docker Volume Command Help

[root@Tang-6 ~]# docker container run --help | grep volume
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
[root@Tang-6 ~]# docker volume --help
[root@Tang-6 ~]# docker container volume --help

1.5 Docker Run Volume Command

# 为 docker run 命令使用 -v 选项即可使用 Volume

	# Docker-managed volume
		# docker  run  -it  -name bbox1–v /data  busybox
		# docker inspect -f {{.Mounts}} bbox1
			# 查看bbox1容器的卷、卷标识符及挂载的主机目录
			
	# Bind-mount Volume
		# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
		# docker inspect -f {{.Mounts}} bbox2

1.6 Sharing volumes Types

There are two ways to share volumes between containers.

# 多个容器的卷使用同一个主机目录,例如
	# docker run–it --name c1 -v /docker/volumes/v1:/data busybox
	# docker run–it --name c2 -v /docker/volumes/v1:/data busybox

# 复制使用其它容器的卷,为 docker run命 令使用 --volumes-from 选项
	# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox
	# docker run -it --name bbox2 --volumes-from bbox1 busybox

2、示例 1

2.1 创建 Docker

[root@Tang-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox      
/ # ls        						# 根目录下自动创建相关目录
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
total 0

2.2 查看现在主机上的 Docker Volume

[root@Tang-6 ~]# docker volume ls
DRIVER              VOLUME NAME
local               11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872
local               54373374ed1b7312481af30c8338abca41c22c2900c7d643dd5e522e27e984b2

2.3 查看 Docker busyboxvolume 的 Volumes 挂载位置

2.3.1 第一种方式

[root@Tang-6 ~]# docker container inspect busyboxvolume
"Mounts": [
            {
                "Type": "volume",
                "Name": "11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872",
                "Source": "/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data",
                "Destination": "/mydata",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

2.3.2 第二种方式

[root@Tang-6 ~]# docker container inspect -f {{.Mounts.Source}} busyboxvolume

2.4 进入到宿主的此目录

[root@Tang-6 ~]# cd /var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[root@Tang-6 _data]# ll
total 0
[root@Tang-6 _data]# pwd
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[root@Tang-6 _data]# vim test.txt
[root@Tang-6 _data]# cat test.txt 
How are you?

2.5 进入到 Docker busyboxvolume 的 /mydata 目录

[root@Tang-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox
/ # ls
bin     dev     etc     home    mydata  proc    root    sys     tmp     usr     var
/ # cd /mydata/
/mydata # ls
test.txt
/mydata # cat test.txt 
How are you?

2.6 删除 Docker busyboxvolume

root@Tang-6 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
7abbd3c486a8        busybox             "sh"                     2 minutes ago       Exited (0) 54 seconds ago                         busyboxvolume
[root@Tang-6 ~]# docker rm busyboxvolume
busyboxvolume
[root@Tang-6 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES

2.7 宿主机上此目录下的文件还存在,

不会随着 Docker 的删除还被删除,但是在创建 Docker 时,使用 -rm 选项,会被删除。

root@Tang-6 ~]# cd -
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[root@Tang-6 _data]# ll
total 4
-rw-r--r-- 1 root root 13 Nov 23 16:09 test.txt
[root@Tang-6 _data]# cat test.txt 
How are you?

3、示例 2 — 新创建 Docker Volume 绑定指定的宿主机目录,并在两个 Docker 实现 Volume 共享

3.1 宿主机上创建相关目录,并创建相关测试文档

[root@Tang-6 ~]# mkdir /data/volumes/v1 -pv
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/volumes’
mkdir: created directory ‘/data/volumes/v1’
[root@Tang-6 ~]# cd /data/volumes/v1/
[root@Tang-6 v1]# cat test.txt 
Hello!!!

3.2 创建 Docker mybox1 ,并查看相关测试文件

[root@Tang-6 ~]# docker run --name mybox1 -it -v /data/volumes/v1:/my/data busybox
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt 
Hello!!!

3.2 创建 Docker mybox2 ,使用 Docker mybox1 的 Volume 并查看相关测试文件

[root@Tang-6 ~]# docker run --name mybox2 -it --volumes-from mybox1 busybox
/ # ls
bin   dev   etc   home  my    proc  root  sys   tmp   usr   var
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt 
Hello!!!
[root@Tang-6 ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
169a543f5345        busybox             "sh"                About an hour ago   Up About an hour                        mybox2
f250ffc6d357        busybox             "sh"                About an hour ago   Up About an hour                        mybox1
发布了158 篇原创文章 · 获赞 7 · 访问量 9744

猜你喜欢

转载自blog.csdn.net/weixin_44983653/article/details/103216504