-v 持久化 三种
默认的 volumes 占用一部分宿主机的资源 最常用的方式
bind mounts 不同的数据结构不通不可移植 不能写在dockerfile中 比较常用
tmpfs 挂载到内存当中 一般都不会用
docker run -itd -v /usr/share/nginx/html nginx 默认
/var/lib/docker/volumes/xxxxxxxxxxxxxx/_data
docker run -itd -v /opt:/usr/sharc/nginx/html nginx bind mounts
/opt
容器卷
容器卷 docker vloume create 名字 说白了它是一个容器但是它提供的是一个卷的功能 这个比bind mounts好很多
docker run -itd -v nginx-data:/usr/share/nginx/html nginx 容器卷
/var/lib/docker/volumes/nginx-data/_data
docker volume create nginx-data //创建一个自定义容器卷
docker volume ls //查看所有容器卷
docker volume inspect nginx-data //查看指定容器卷详情信息
创建使用指定卷的容器
docker run -itd --name=nginx -p 8000:80 -v nginx-data:/usr/share/nginx/html nginx
选项-v表示挂载数据卷,这里使用自定义数据卷nginx-data,并且将数据卷挂载到/usr/share/nginx/html
默认会创建匿名数据卷进行映射和挂载。
可查看宿主机文件系统的数据/var/lib/docker/volumes/nginx-data/_data
Volume帮我们做了类似于一个软连接的功能。在容器里边的改动,我们可以再宿主机里感知,而在宿主局里面的改动,在容器里边可以感知到。
如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有随着容器被删除掉。
所以在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么数据复用当前数据卷里面文件的。
此外,我们还可以启动多个nginx容器实例,共享同一个数据卷。数据卷的复用性和扩展性较强。
docker volume rm nginx-data //清理卷(无用的)
Bind Mounts的基本使用
指定了将宿主机上的/wwwroot目录(如果没有会自动创建)挂载到/usr/share/nginx/html(这个目录是yum安装nginx的默认网页目录)。
docker挂载的默认权限是读写(rw),用户可以通过ro指定为只读
docker run -d -it --name=nginx -p 800:80 -v /wwwroot:/usr/share/nginx/html:ro nginx
与volumes不同,bind mounts的方式会隐藏被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html目录下的内容被隐藏掉了,因此我们看不到。
但是,我们可以将宿主机上的文件随时挂载到容器中
echo "test html" > /wwwroot/index.html
root@bfad2ded6e7a:/# ls /usr/share/nginx/html/
index.html
验证绑定
docker inspect nginx
"HostConfig": {
"Binds": [
"/wwwroot:/usr/share/nginx/html:ro"
],
清理
docker stop nginx
nginx
docker rm nginx
nginx
ls /wwwroot/
index.html
同volumes一样,当我们清理掉容器之后,挂在目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。
数据卷容器
用户需要在容器之间共享一些持续性更新的数据时,可以使用数据卷容器。数据容器也是一个普通的容器。里边有设置好的数据卷,专门提供给他容器挂载使用。通过--volumes-from数据卷容器名来实现。
docker run -it -v /dbdata:/dbdata --name=dbdata centos /bin/bash //创建数据容器卷
创建一个数据卷容器,并在其中创建一个数据卷挂载到/dbdata
docker run -it --volumes-from dbdata --name test1 centos /bin/bash
ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
touch dbdata/flaglinux //在test1容器的/dbdata目录创建测试文件
进入test2容器验证结果
docker run -it --volumes-from dbdata --name test2 centos /bin/bash
ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
ls dbdata/
flaglinux //测试文件还在
可以多次使用--volume-from参数从多个容器挂载多个目录。也可以从其他已经挂载了