数据持久化介绍
在docker中若想真的实现数据持久化(容器结束但是数据不会被销毁),需要将数据从宿主机挂载到容器中,目前dockers提供三种不同的方式将数据从宿主机挂载到容器中
数据挂载在容器中的方法
1.数据卷:dockers会管理宿主机文件系统的一部分资源,默认位于/var/lib/docker/volumes/目录中:(最常用的方式)
-
在容器中创建一个文件
[root@localhost ~]# docker run -it -v /opt/ centos /bin/bash [root@73ca6f2ec4b2 /]# touch /opt/Carrie.txt [root@73ca6f2ec4b2 /]# ls /opt/ Carrie.txt 在宿主机上查看文件 [root@localhost ~]# ls /var/lib/docker/volumes/c1b90a7cf9f76e59df27711fe4b86cb68ea3bf76d3dcf54bd8ce34fdaf7e1a74/_data Carrie.txt
2.bind mounts :意为着指定存储在宿主机的任意位置
但是这种方法在不同的宿主机系统之间是不可移植的,bind mounts所指定的host目录不一样,这也是为什么bind mounts不能出现Dockerfile中的原因,因为会导致Dockerfile无法移植。
3.tmpfs:挂载存储在宿主机系统的内存中,一般不用,容易丢失数据
volume的基本使用
1.自己制定一个容器卷
- 虽然是个容器,但是提供了卷的功能
[root@localhost ~]# docker volume create nginx_data nginx_data [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local c1b90a7cf9f76e59df27711fe4b86cb68ea3bf76d3dcf54bd8ce34 local c1c87a0a98cfa3e78931e4b80802de51eb39c4acbc3564cbe22922 local c40e51083de4b800026f91a15838b727100bfdc8cc5e618d116b79 local ea3edafb5643ef8073665cc70c6bf6f7d043e4d94c383641af3f94 local nginx_data
-
2.查看容器卷的详细信息
-
[root@localhost ~]# docker volume inspect nginx_data [ { "CreatedAt": "2020-12-06T20:40:53+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx_data/_data", "Name": "nginx_data", "Options": {}, "Scope": "local" } ]
-
自己创建容器卷有个好处就是存放的地址不是ID号,能够更好利于找到文件,便于管理
-
[root@localhost ~]# docker run -d -it --name=nginx -p 8000:80 -v nginx_data:/usr/share/nginx/html nginx 8e212642347b20b7091a0cd4256f8e7de56a9969253d451042d785cc3eb14e6c [root@localhost ~]# ls /var/lib/docker/volumes/nginx_data/_data/ 50x.html index.html
Bind Mounts的基本用法
-
相当于打通一条通道,缺点是不可移植,无法跨操作系统
创建容器并映射目录 [root@localhost ~]# docker run -d -it --name=nginx-4 -p 801:80 -v /www/lib/root/:/usr/share/nginx/html nginx 进入容器创建文件,要测试宿主机是否成功创建相同文件 [root@localhost ~]# docker exec -it 3912 /bin/bash root@3912be3b20b3:/# echo "I am Carrie " > /usr/share/nginx/html/index.html 测试 [root@localhost ~]# cat /www/lib/root/index.html I am Carrie
-v 的三种玩法
-
1.默认的挂载进行映射 [root@localhost ~]# docker run -it -v /opt/ centos /bin/bash [root@localhost ~]# ls /var/lib/docker/volumes/c1b90a7cf9f76e59df27711fe4b86cb68ea3bf76d3dcf54bd8ce34fdaf7e1a74/_data Carrie.txt 2.创建容器卷的挂载进行映射 [root@localhost ~]# docker run -d -it --name=nginx -p 8000:80 -v nginx_data:/usr/share/nginx/html nginx [root@localhost ~]# ls /var/lib/docker/volumes/nginx_data/_data/ 3.将docker的目录映射在宿主机的目录上(不可移植性) [root@localhost ~]# docker run -it -v /opt/:/usr/share/nginx/html /bin/bash
数据卷容器
就是将数据卷制作成一个容器
-
创造一个容器卷,让它运行起来 [root@localhost ~]# docker run -it -v /dbdata:/dbdata --name=dbdata centos /bin/bash [root@localhost ~]# docker container start dbdata dbdata 创建一个容器通过容器卷运行起来,容器中会有一个目录是dbdata [root@localhost ~]# docker run -it --volumes-from dbdata --name test1 centos /bin/bash [root@1843cf161467 /]# ls bin dev home lib64 media opt root sbin sys usr dbdata etc lib lost+found mnt proc run srv tmp var
- 测试
-
创建一个新的容器 [root@localhost ~]# docker run -it --volumes-from dbdata --name test2 centos /bin/bash 进入dbdata就可查看文件 [root@5356ce4ad202 /]# ls bin dev home lib64 media opt root sbin sys usr dbdata etc lib lost+found mnt proc run srv tmp var [root@5356ce4ad202 /]# cd /dbdata/ [root@5356ce4ad202 dbdata]# ls Carrie