容器数据库卷 什么是容器数据卷?
docker的理念:将应用和环境及打包成为一个镜像。
数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求数据可以持久化!
例如,我Docker安装一个MySql,我将MySql删除了,但是我不希望删除它的数据(表)==需求:MySql数据可以存储在本地==
容器之间可以有一个数据共享的技术!将Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,挂载到Linux上面。
总结:就是为了容器的持久化和同步操作!容器之间也是可以数据共享的!
使用数据卷
方式一:直接使用命令来进行挂载 -v
1 2 3 4 5 6 7 docker run -it -v #主机目录, 容器内目录# 测试 root@LAPTOP-10L6P3UV:/mnt/c/Users/17083/Desktop# cd /home root@LAPTOP-10L6P3UV:/home# pwd /home root@LAPTOP-10L6P3UV:/home# docker run -it -v /home/ceshi:/home centos /bin/bash# 通过Docker inspect 查看容器的信息
在宿主机的/home/ceshi目录下新建一个test.c文件,发现容器之内/home目录下也存在这个文件这就是双向绑定
实战:安装MySQL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker pull mysql -d 后台运行 -p 端口映射 -v 数据卷挂载 -e 环境配置 --name 容器名字 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
持久化就是绑定在了本地
假设我们将容器进行删除,发现我们挂载的数据卷仍然没有丢失,这就实现了容器数据的持久化
具名和匿名挂载 1 2 3 4 5 6 7 8 # 匿名挂载 -v 容器内的路径 docker run -d -P --name nginx01 -v /etc/nginx docker volume --help# 查看所有卷的情况 root@LAPTOP-10L6P3UV:/home/mysql/data# docker volume ls# 这里发现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 这里发现这种就是匿名挂载,我们在-v的时候只写了容器内的路径,没有写容器之外的路径 # 具名挂载 root@LAPTOP-10L6P3UV:/home# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx root@LAPTOP-10L6P3UV:/home# docker volume ls DRIVER VOLUME NAME local juming-nginx# 通过-v 卷名:容器内的路径 # 查看一下这个卷 root@LAPTOP-10L6P3UV:/home# docker volume inspect juming-nginx [ { "CreatedAt": "2024-06-11T09:14:55Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ]
所有Docker容器内的卷,在没有指定目录的情况之下都是在/var/lib/docker/volumes/xxxxxx/_data,(但是我在WSL中没有找到,毕竟Linux的内存结构与windows存储结构不一样)
算了,还是在Ubuntu上面下载一个Docke,重来一次,耗费了我好多时间!!!
Ubuntu下面的
我么可以通过具名挂载,可以方便的找到 我们的卷,大多数情况下使用具名挂载。
1 2 3 4 # 如何进行确定是具名挂载还是匿名挂载,还是指定路径挂载 -v 容器内的路径 # 匿名挂载 -v 卷名:容器内的路径 # 具名挂载 -v /宿主机路径:容器内的路径 #指定路径挂载
拓展
1 2 3 4 5 6 7 8 # 通过-v 容器内的路径:ro rw 改变读写权限 ro readonly # 可读 rw readwrite # 可读可写# 一旦设置了容器的权限,容器对于我们挂载出来的内容就有了限定! docker run -d -P --nama nginx01 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx# 只要看到了ro就说明这个路径只能通过宿主机来操作,容器内是不能改变的
初识DockerFile 第一种方式使用了commit来构建
DockerFile就是用来构建docker镜像的构建文件!命令脚本,先体验一下!
通过这个脚本可以生镜像,镜像是一层一层的,脚本的一个个命令都是一层!
1 2 3 4 5 6 7 8 # 创建一个dockerfile文件,名字可以是随机的,建议就是一个DockerFile # 以下是它的文件内容 指令(大写) 参数 FROM centos VOLUME ["volume01", "volume02"] CMD echo "---end---" CMD /bin/bash# 这里的每一个命令都是镜像的一层
1 2 # 启动自己生成的容器 docker run -it 2771b5374df0 /bin/bash
这个卷和外部一定有一个同步的目录
1 2 3 VOLUME ["volume01", "volume02"] #这一块是匿名挂载 CMD echo "---end---" CMD /bin/bash
进入volume01在其中添加一个container.txt文件
1 2 3 [root@104f58e694f9 volume01]# touch container.txt [root@104f58e694f9 volume01]# ls container.txt
查看以下卷挂载的路径
1 2 3 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 104f58e694f9 2771b5374df0 "/bin/bash" About a minute ago Up About a minute silly_kare root@kyclnx:/home/docker-test-volume# docker inspect 104f58e694f9
然后在宿主机的volume01中查看是否有container.txt文件
1 2 3 4 root@kyclnx:/home/docker-test-volume# cd /var/lib/docker/volumes/79cedab2401c9f142f41f3162548a9329b1ed45dc5a08200561b284158feadd0/_data root@kyclnx:/var/lib/docker/volumes/79cedab2401c9f142f41f3162548a9329b1ed45dc5a08200561b284158feadd0/_data# ls container.txt# 同步成功
这种方式未来使用的很多,因为我们通常会构建自己的镜像
假设构建镜像的时候没有挂载卷,要自动镜像挂载 -v 卷名 容器内路径
数据卷容器 容器之间也是可以数据共享的 ,假设两个mysql同步数据
谁去挂载了谁,那么就称它为父容器
1 2 3 # 启动三个容器通过我们刚才自己写的镜像启动 # 第一个启动 docker run -it --name docker01 kuangshen/centos
1 2 3 # 第二个启动 docker run -it --name docker02 --volumes-from docker01 kuangshen/centos# 然后ls-l发现了docker02之中也有volume01和volume02
然后在docker01之中创建一个test.txt的是可以同步到docker02之中去的
1 2 3 4 5 # 第三个启动 docker run -it --name docker03 --volumes-from docker01 kuangshen/centos# 实现了数据共享 # 测试,可以删除docker01,查看一下docker02和docker03是否还可以访问这个文件 # 测试依旧可以进行访问,增加test03.c文件,或者删除已存在的文件,依旧可以实现数据共享。
这种就类似于Linux中的硬链接(现在我还不知道Linux硬链接和软链接)传递的作用
结论:
容器之间可以实现配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦你持久化到了本地,这个时候本地的数据是不会删除的!