自学内容网 自学内容网

Docker4:docker基础2

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长! 

目录

一、数据卷

1、通过一个案例,解释为什么需要数据卷

①案例介绍

②具体操作

2、通过上述案例,引出问题

①上述案例存在什么问题?

②为什么存在上述问题?

③如何解决上述问题?

3、什么是数据卷(volume)?

4、数据卷的命令

 5、给容器目录,挂载数据卷

①声明一个观点:我们不需要创建数据卷,因为挂载数据卷时,如果不存在该数据卷,就会自动创建该数据卷。

②挂载数据卷的时机:在创建docker容器时,进行挂载(如果容器已经创建好了,那么后续是无法给容器的目录挂载数据卷的)

③举例

6、总结

二、本地目录挂载

1、声明一个观点:通过数据卷挂载,宿主机目录是固定的,在/var/lib/docker/volumes/目录下,如果我们想要宿主机的其他目录和容器的某个目录映射,就可以使用本地目录挂载。

2、案例:

①案例介绍

②具体操作

 3、实现本地目录挂载

 举例:​编辑

 ①创建三个目录

②将老师给的资料中的两个文件,存入上面的文件夹

 ③运行如下命令:创建、启动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)!