文章目录
- 1.docker数据卷的介绍
- 2.bind mount
- 2.1 bind mount挂载文件到容器
- 2.2 在容器内修改挂载内容
- 2.3 只读挂载
- 2.4 挂载yum源
- 3.docker managed volume(docker管理卷)
- 3.1 docker managed volume挂载文件
- 3.2 指定数据卷目录
- 3.3 删除容器及数据卷
- 3.4 删除容器恢复数据卷
- 3.5 多个容器挂载同一个目录
1.docker数据卷的介绍
1.为什么用数据卷?
docker分层文件系统性能差,生命周期与容器相同(容器删除,文件也丢失)
而docker数据卷是mount到宿主机中,绕开了分层文件系统,和主机磁盘性能相同,容器删除后依然保留,但是仅限本地磁盘,不能随容器迁移。
docker官方提供两种卷:
1.bind mount
2.docker managed volume
2.bind mount
bind mount:将主机上的目录或文件直接mount到容器里,使用直接,高效
2.1 bind mount挂载文件到容器
docker run -d --name web1 -p 80:80 -v /opt/website: /usr/share/nginx/html nginx
容器里/usr/share/nginx/html是nginx 的默认发布目录curl localhost
docker exec web1 mount
在容器里执行mount命令
看到/dev/mapper/rhel-root,也就是我们的根目录,挂接到容器的/usr/share/nginx/htmlvim /opt/website/index.html
编辑nginx 的默认发布主页curl localhost
2.2 在容器内修改挂载内容
docker container attach web1
应用容器不能这样,这样操作会卡住,ctrl+c后容器会自动退出docker start web1
开启web1容器docker exec -it web1 bash
-it是exec的选项,bash表示在容器内执行的操作,打开一个bash ,在容器中修改curl localhost
数据也已经更改
在容器内更改的数据其实就是宿主机上的数据。
这种方式,不存在的目录会自动新建(无论容器还是宿主机),但是会以宿主机为准,绑定挂接到容器后,容器中的对应目录如果有数据,就会被覆盖。
2.3 只读挂载
bind mount方式挂载时默认权限是rw,可以在挂载时指定只读(ro)
docker run -it --name vm1 -v/ opt/data1:/data1 -v /opt/data2:/data2:ro ubuntu
这些目录在宿主机和容器内都是没有的 ,data1读写挂载,data2只读挂载cd /opt/data2
touch file2
可以建立文件docker container attach vm1
可以看到 file2
2.4 挂载yum源
docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo rhel7 bash
挂载yum源,注意要给一个 bash
也可以docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo:ro rhel7 bash
加上只读选项,让yum源不能被更改
3.docker managed volume(docker管理卷)
bind mount必须指定宿主机文件系统路径,移植性差(如果容器在A主机上crash掉,B主机上如果没有对应路径,无法进行移植)
docker managed volume不需要指定宿主机文件系统路径,docker自动为容器创建,默认数据卷目录都在 /var/lib/docker/volumes
如果挂载时指向容器内已有的目录,原数据会被复制到volume中
3.1 docker managed volume挂载文件
docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx
curl localhost
发现可以访问,看到nginx主页docker inspect web1
3.2 指定数据卷目录
docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
curl localhost
docker inspect web2
3.3 删除容器及数据卷
docker rm -f web2
删除之前的容器docker volume ls
查看卷,发现容器删除了,数据还在docker volume rm b29ea012d9b02b3fc410834c6da4d0bd4bca3e1cf4ae95e5b3bda71cfe0e85a1
删除docker volume prune
删除所有没有被容器使用的卷,如果容器较多,一个一个删除麻烦
3.4 删除容器恢复数据卷
docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
docker rm -f web2
删除之前的容器docker volume ls
查看卷,发现容器删除了,数据还在docker volume create webdata
创建一个数据卷cp /var/lib/docker/volumes/website2/_data/* /var/lib/docker/volumes/webdata/_data/
拷贝数据docker run -d --name web2 -p 80:80 -v webdata:/usr/share/nginx/html nginx
创建web2依然可以使用web1的数据curl localhost
可以访问echo linux > /var/lib/docker/volumes/webdata/_data/index.html
更改发布面也可以访问
3.5 多个容器挂载同一个目录
还可以使用这种方式让多个容器挂载同一个目录docker run -d --name web3 -v webdata:/usr/share/nginx/html nginx
再新建一个容器,去掉端口映射docker inspect web3
curl 172.17.0.3
只要数据卷在,再次启动容器数据依然保留。