Docker4:docker基础2
欢迎来到“雪碧聊技术”CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!
目录
①声明一个观点:我们不需要创建数据卷,因为挂载数据卷时,如果不存在该数据卷,就会自动创建该数据卷。
②挂载数据卷的时机:在创建docker容器时,进行挂载(如果容器已经创建好了,那么后续是无法给容器的目录挂载数据卷的)
1、声明一个观点:通过数据卷挂载,宿主机目录是固定的,在/var/lib/docker/volumes/目录下,如果我们想要宿主机的其他目录和容器的某个目录映射,就可以使用本地目录挂载。
③运行如下命令:创建、启动mysql容器,并完成本地目录挂载
④我们删掉刚才那个mysql容器,再创建一个新的mysql容器,看看数据是否仍然存在
一、数据卷
1、通过一个案例,解释为什么需要数据卷
①案例介绍
②具体操作
-
找到nginx容器中的html目录在哪(去docker官网,找nginx镜像,看说明)
- 通过docker命令,进入nginx容器内部,切换到nginx容器的静态资源目录,尝试修改index.html文件
2、通过上述案例,引出问题
①上述案例存在什么问题?
问题:找到了nginx容器里面的静态资源目录下的index.html文件,但是发现我们的nginx容器没有vi命令,也就是说根本没办法修改里面的静态资源。
我们在nginx容器内,连vi命令都无法执行,更别说部署什么静态资源了。
②为什么存在上述问题?
这还是回归到了我们之前就一直强调的问题:镜像包含了应用本身、所需环境、系统函数库等文件,这些都是应用运行所必备的条件,不可缺少的,但是vi命令、ll命令这些可有可无的东西,镜像里面是不存在的,而创建、运行容器,又是根据镜像来的,因此容器里也不会存在这些可有可无的命令。
综上,就导致了我们无法在nginx容器内,运行vi命令来修改index.html文件。因为nginx容器内,根本没有vi这个命令。
③如何解决上述问题?
通过“数据卷”来解决。
我们下面就要学习“数据卷”的知识。
3、什么是数据卷(volume)?
数据卷(volume)是一个虚拟目录,是容器内目录、宿主机目录之间映射的桥梁。
4、数据卷的命令
5、给容器目录,挂载数据卷
①声明一个观点:我们不需要创建数据卷,因为挂载数据卷时,如果不存在该数据卷,就会自动创建该数据卷。
②挂载数据卷的时机:在创建docker容器时,进行挂载(如果容器已经创建好了,那么后续是无法给容器的目录挂载数据卷的)
③举例
//1、先删除已存在的nginx容器
docker stop nginx
docker rm nginx
//2、创建、运行一个nginx容器时,完成数据卷的挂载
//此时创建的nginx容器的名称是myNginx(叫啥都行,别重复即可)
//此时数据卷的名称是html(叫啥都行,别与其他数据卷名称重复即可)
//数据卷挂载的目录是nginx容器的静态资源目录/usr/share/nginx/html
docker run -d --name myNginx -p 80:80 -v html:/usr/share/nginx/html nginx
//3、查看所有数据卷
docker volume ls
//结果为:(前两个是自带的数据卷,最后一个html是我们刚刚挂载的数据卷,不存在就会自动创建)
//DRIVER VOLUME NAME
//local 2e6bcaa00190da8316a0120b23d2088f1c498bb3c24b0c6f6d2db465060ad545
//local e56c84d46f771e4fecda3ad18d70a351c4f018e3f0369e03de3c3fa22cedd25d
//local html
//4、查看html数据卷挂载到宿主机(linux虚拟机)的哪个目录
docker volume inspect html
//结果为:("Mountpoint": "/var/lib/docker/volumes/html/_data"就是挂载的宿主机目录)
//[
// {
// "CreatedAt": "2024-11-21T19:49:01+08:00",
// "Driver": "local",
// "Labels": null,
// "Mountpoint": "/var/lib/docker/volumes/html/_data",
// "Name": "html",
// "Options": null,
// "Scope": "local"
// }
//]
//5、得知了数据卷挂载的宿主机目录,我们切换到该目录/var/lib/docker/volumes/html/_data中,并修改其中的index.html文件
cd /var/lib/docker/volumes/html/_data
vim index.html
然后我们通过浏览器,访问192.168.6.100:80/index.html,查看该页面存不存在我们刚刚修改的内容:
可见,通过数据卷,确实能实现宿主机目录、容器目录之间的双向绑定,我们修改宿主机目录下的内容,就等于修改容器目录下的内容。
甚至我们可以在宿主机目录/var/lib/docker/volumes/html/_data下传入一个图片:
然后通过浏览器,访问192.168.6.100:80/01.gif
6、总结
二、本地目录挂载
1、声明一个观点:通过数据卷挂载,宿主机目录是固定的,在/var/lib/docker/volumes/目录下,如果我们想要宿主机的其他目录和容器的某个目录映射,就可以使用本地目录挂载。
2、案例:
①案例介绍
②具体操作
- 查看mysql容器是否有数据卷挂载
运行结果:
思考:为什么mysql要给它的存储目录挂载到宿主机呢?
答案:因为mysql在运行时,会不断产生数据,如果不做挂载, 这些数据都会保存在容器内的文件系统里,将来这个容器的体积会越来越大,将来进行容器迁移就非常不方便。 因此出于数据解耦的目的,就把mysql容器的存储目录挂载到宿主机目录。
- 匿名数据卷的缺点:
那等我们在启动一个mysql容器时,想要拿到之前的mysql数据,会发现拿不到,因为此时又生成了一个新的匿名数据卷,原来的匿名数据卷的数据就等于丢失了。
3、实现本地目录挂载
举例:
①创建三个目录
[root@localhost ~]# pwd
/root
[root@localhost ~]# mkdir mysql
[root@localhost ~]# ls
anaconda-ks.cfg dump.rdb initial-setup-ks.cfg mysql nginx.tar 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# cd mysql
[root@localhost mysql]# mkdir data
[root@localhost mysql]# mkdir conf
[root@localhost mysql]# mkdir init
[root@localhost mysql]# ls
conf data init
②将老师给的资料中的两个文件,存入上面的文件夹
上面这个hm.cnf配置文件,配置了mysql的编码格式等配置信息。
上面这个hmall.sql文件,里面是一些建库、建表的sql语句,一会我们连接mysql就能看到。
③运行如下命令:创建、启动mysql容器,并完成本地目录挂载
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
运行结果:
④我们删掉刚才那个mysql容器,再创建一个新的mysql容器,看看数据是否仍然存在
以上就保证了以后即使进行数据库升级、换数据库的版本等等,数据也是不会丢失,因为mysql容器的目录挂载到了我们创建的宿主机目录下。
结语
以上就是数据卷的全部内容,想了解更多docker知识,请关注本博主~~
原文地址:https://blog.csdn.net/qq_63981644/article/details/143952737
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!