当前位置: 首页 > article >正文

【虚拟机】Docker基础 【二】

2.2.数据卷

容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:

  • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
  • MySQLNginx容器运行后,如果我要修改其中的某些配置该怎么办?
  • 我想要让Nginx代理我的静态资源怎么办?

因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。

2.2.1.什么是数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
Nginx为例,我们知道Nginx中有两个关键的目录:
-html:放置一些静态资源

  • conf:放置配置文件
    如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。
    但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

在这里插入图片描述
在上图中:

  • 我们创建了两个数据卷:confhtml
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷confhtml分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

**这样一来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。**此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

小提示:
/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
为什么不让容器目录直接指向宿主机目录呢?
1.因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
2.但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

不过,我们通过由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷,具体参考2.2.3小节。

2.2.2.数据卷命令

数据卷的相关命令有:

命令说明
docker volume create创建数据卷
docker volume ls查看所有数据卷
docker volume rm删除指定数据卷
docker volume inspect查看某个数据卷的详情
docker volume prune清除数据卷

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。

容器与数据卷的挂载需要在创建容器时进行配置,而不能对已经创建好的容器进行设置。在Docker中,数据卷是在容器运行时动态挂载的,可以在运行时通过-v参数将主机上的目录挂载到容器内部的目录。但是,一旦容器被创建并运行,就不能再重新配置其数据卷的挂载。

2.2.2.1 演示一下nginx的html目录挂载

在这里插入图片描述
1.通过dps(上一篇文章设置的命令别名)docker ps 查看容器是否存在

docker ps
dps

2.删除容器

docker rm -f nginx

在这里插入图片描述
3.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷

 docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html  nginx

挂载目录在哪找?上docker官网 查看文档
在这里插入图片描述
4.挂载完数据卷后,然后查看数据卷

docker volume ls
# 结果
DRIVER    VOLUME NAME
local     d408fc247fe5905a87c60b72657a05841e88a41798e76e51bbe2f9ce49928760
local     html

在这里插入图片描述
5. 查看数据卷详情

docker volume inspect html
# 结果
[
    {
        "CreatedAt": "2023-11-28T21:22:52+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]

在这里插入图片描述
6.查看宿主机的 /var/lib/docker/volumes/html/_data目录

ll /var/lib/docker/volumes/html/_data
# 可以看到与nginx的html目录内容一样,结果如下:
总用量 8
-rw-r--r--. 1 root root 497 1024 21:46 50x.html
-rw-r--r--. 1 root root 615 1024 21:46 index.html

查看容器内部的文件

docker exec -it nginx bash
cd /usr/share/nginx/html
ls

在这里插入图片描述

因为容器内部没有vill这些命令,所以挂载数据卷的方式来修改宿主机的文件,从而改变容器内部的文件

7.进入该目录(数据卷目录),并随意修改index.html内容

cd /var/lib/docker/volumes/html/_data
vi index.html

不想通过vi 进行修改的话,可以点击 MobaXtermFollow terminal folder 勾选,就可以像在windows上打开一个文件那样进行修改了
在这里插入图片描述
在这里插入图片描述

  1. 打开浏览器查看效果

在这里插入图片描述
9.添加静态资源
在这里插入图片描述
浏览器查看效果
在这里插入图片描述
10.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化

docker exec -it nginx bash
cd /usr/share/nginx/html
ls

在这里插入图片描述
大致流程

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

# 2.然后查看数据卷
docker volume ls
# 结果
DRIVER    VOLUME NAME
local     29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f
local     html

# 3.查看数据卷详情
docker volume inspect html
# 结果
[
    {
        "CreatedAt": "2024-05-17T19:57:08+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]

# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
# 可以看到与nginx的html目录内容一样,结果如下:
总用量 8
-rw-r--r--. 1 root root 497 1228 2021 50x.html
-rw-r--r--. 1 root root 615 1228 2021 index.html

# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html

# 6.打开页面,查看效果

# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash

教学演示环节:演示一下MySQL的匿名数据卷

1.查看MySQL容器详细信息

docker inspect mysql
# 关注其中`.Config.Volumes`部分和`.Mounts`部分

我们关注两部分内容,第一是.Config.Volumes部分:

{
  "Config": {
    // ... 略
    "Volumes": {
      "/var/lib/mysql": {}
    }
    // ... 略
  }
}

可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷。
然后,我们再看结果中的.Mounts部分:

{
  "Mounts": [
    {
      "Type": "volume",
      "Name": "29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f",
      "Source": "/var/lib/docker/volumes/29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f/_data",
      "Destination": "/var/lib/mysql",
      "Driver": "local",
    }
  ]
}

可以发现,其中有几个关键属性:

  • Name:数据卷名称。由于定义容器未设置数据卷名,这里的就是匿名卷自动生成的名字,一串hash值。
  • Source:宿主机目录
  • Destination : 容器内的目录
    上述配置是将容器内的/var/lib/mysql这个目录,与数据卷29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f挂载。于是在宿主机中就有了/var/lib/docker/volumes/29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

接下来,可以查看该目录下的MySQL的data文件:

ls -l /var/lib/docker/volumes/29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f/_data

注意:每一个不同的镜像,将来创建容器后内部有哪些目录可以挂载,可以参考DockerHub对应的页面


http://www.kler.cn/a/152328.html

相关文章:

  • EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测
  • WP采集插件的进阶功能:输入关键词采集及定向采集实现精准筛选
  • 无mac电脑生成uniapp云打包私钥证书的攻略
  • webpack优化打包速度
  • 基于AT89C51单片机的节日彩灯门设计
  • Excel 使用技巧
  • 5年经验之谈 —— 接口测试主要测哪些方面?
  • 淘宝订单接口对接实战(续):高级功能与实战案例
  • Course1-Week3-分类问题
  • 使用JMeter安装RabbitMQ测试插件的步骤
  • Windows安装Opencv与VS配置
  • Google Chrome访问出现 NET::ERR_CERT_INVALID
  • 探讨几种在CentOS 7上实现文件上传的方法
  • 打开ITK-SNAP遇到找不到vcruntime140_1.dll
  • C++那些事之nodiscard
  • neo4j使用之超神之旅
  • excel+requests管理测试用例接口自动化框架
  • Flask SocketIO 实现动态绘图
  • python——第十五天
  • 怎样做好信用卡汽车分期业务营销