docker卷和目录的区别

我们在以后使用容器的时候,容器可能会被频繁的删除重建!例如版本更新的时候!我们会用新版的容器替换旧版的容器!旧版的容器就需要被删除!

而容器是无状态的!容器中所保存的数据会随着容器的删除而被删除!所以我们不能够将一些重要的数据保存在容器中!
例如MySQL的数据库就不能将数据库文件保存在容器中!

正确的做法是我们可以在宿主机上创建一个数据卷!数据卷其实就是我们宿主机上的一个目录!
我们将数据卷挂载到容器中的某个目录下!这样当我们在容器中往这个目录中写入数据时,数据会直接被保存到宿主机的数据卷中!
这样就算容器被删除,数据也依然会保存在数据卷中!我们启动新的容器的时候,从新挂载数据卷即可!数据依然存在!
这就是容器的持久化存储了!

数据卷可以被多个容器同时挂载!所以也能够实现容器间文件共享,类似NFS共享一样!

————————————————————————————————————————
数据卷的增、删、改、查

1.创建一个数据卷

我们管理docker的数据卷,需要使用docker的volume子命令操作!

docker volume create 数据卷名字 创建一个数据卷

2.查看数据卷

docker volume ls 查看本地数据卷列表
docker volume inspect 数据卷名字 查看数据卷的详细信息

3.删除数据卷

docker volume rm 卷名1 卷名2 … 删除一个或者多个数据卷
docker volume prune 删除所有未被使用的数据卷
—————————————————————————————————————————

使用数据卷

我们在创建容器的时候要想好容器的哪些目录需要挂载数据卷!
在创建容器时使用 -v 选项就可以挂载数据卷了

例子,挂载数据卷html到nginx的网站根目录下
docker run --name nginx1 -d -p 80:80 -v html:/usr/share/nginx/html nginx

卷在宿主机存放的目录是:/var/lib/docker/volumes

所以html卷的绝对路径是:/var/lib/docker/volumes/html

数据存放在卷目录中的_data目录中!我们往_data目录中添加文件,就相当于往容器的网站根目录添加文件了!

——————————————————————————————————————————

在数据卷中有个特殊的卷,叫匿名卷

我们可以这样去使用匿名卷

docker run --name nginx1 -d -p 80:80 -v /usr/share/nginx/html nginx

-v 后面直接时容器内部的一个目录!我们并没有指定要挂载什么!这个时候就会挂载匿名卷!

有些镜像在构建的时候将一些目录做成默认的挂载点!当我们在创建容器时,如果忘记给这个
目录挂载数据卷,那么它会自己去创建并挂载一个匿名卷!保证数据肯定是写在卷中,而不是容器中!

在Dockerfile中使用VOLUME命令来指定默认挂载点!

———————————————————————————————————————————
数据卷的目录有些长!容器也可以挂载我们指定的目录!例如挂载/opt/html到容器中!
使用方法和使用数据卷是一样的,也是在创建容器时使用 -v选项!

例子:挂载目录/opt/html到nginx的网站根目录下

docker run --name nginx1 -d -p 80:80 -v /opt/html:/usr/share/nginx/html nginx

挂载这种普通的目录和数据卷是有些区别的!

我们挂载数据卷时,容器内挂载目录中的数据会被复制到数据卷中!所以我们在数据卷中可以看到容器内挂载目录中原来的文件!

如果我们挂载的是这种普通目录,容器内挂载目录中的数据是不会被复制到宿主机的这个目录中的!容器内挂载目录中的数据会被隐藏!而显示宿主机目录中的内容! 这个和nfs有点相似(和数据卷正好相反)

—————————————————————————————————————————————

我们一般会将容器内部挂载的目录称之为挂载点!

我们在创建容器时,数据卷、挂载的目录、或者容器内部的挂载点!其实都不用单独去创建!如果不存在,会自动创建的

—————————————————————————————————————————————

猜你喜欢

转载自blog.csdn.net/zhangthree1/article/details/107542739