数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利。
Docker的volume的本质是容器中一个特殊的目录。在容器的创建过程中,Docker会将宿主机上的指定目录(一个以volume ID为名称的目录,或者指定的宿主机目录)挂载到容器中指定的目录上(使用bing mount挂载方法),故挂载完成后的宿主机目录和容器内的目标目录表现一致。
bind mount是将主机上的目录或文件mount到容器里。使用直观高效,易于理解。
使用-v
选项指定挂载路径,格式 <host path>:<container path>
#前面是宿主机真实存在的路径:后面是容器内的路径
后台运行一个使用nginx镜像的容器并将宿主机的/data目录挂载到容器的目录/usr/share/nginx/html下 [root@server1 ~]# docker run -d --name demo -v /data:/usr/share/nginx/html nginx
调到前台运行,分别查看宿主机和容器的指定的目录下的内容,是一样的。这是因为这种方式挂载和我们平时使用mount方式是一样的,原有数据隐藏,替换为宿主机的数据。
##/data目录下这么多东西是因为docker默认数据目录是/data
[root@server1 ~]# docker exec -it demo bash
bind mount默认权限是读写rw,可以在挂载时指定只读ro。
-v选项指定的路径,如果不存在,挂载时会自动创建。 docker run -it --name vm1 \ /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume不需要指定mount源,docker自动为容器创建数据卷目录。默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,容器内原有数据会被复制到volume中。
创建卷方式:
[root@server1 ~]# docker volume create webdata #创建一个名为webdata的卷 [root@server1 ~]# docker rm -f demo #把上面创建的卷删掉 [root@server1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx #把webdata这个卷挂载到容器内的/usr/share/nginx/html目录上并运行一个容器
将创建的webdata卷挂载到容器的/usr…目录下
进入docker默认创建的数据卷目录查看卷里的内容,我们可以看到上面只创建了卷,没有写入任何东西,但卷里有内容是因为挂载时容器内指定目录里原本有东西,所以复制过来的
我们运行容器使用的是nginx镜像,访问一下,没有问题
如果挂载时没指定mount源,那么docker会自动随机创建一个文件名很长的卷
[root@server1 ~]# docker rm -f demo [root@server1 ~]# docker run -d --name demo -v /usr/share/nginx/html nginx 67ab13a7b24c19c53f4ce117136b9d0e4dec93c615a0192ead919d10e6c2acae
我们使用docker inspect demo命令查看下卷的源目录
得到路径后就可以查看目录下的内容了
ls /var/lib/docker/volumes/2ca22fd769e4b7b6f5a02dd96fe8d47a6df5578074c0d340ced3ab33b25456ca/_data
相同点:两者都是 host 文件系统中的某个路径。
不同点如图: