docker容器 - 卷(volume)- 挂载

目录

参考文档:Volumes | Docker Documentation

什么是卷(volume)?

什么是挂载,它的作用是什么?

一台机器里的多个容器之间共享数据(使用挂载)

首先我们可以使用最简单的docker cp命令复制文件给容器,来实现跟挂载相似的功能

docker容器挂载文件的命令

docker容器挂载卷(volume)的命令

多台机器之间共享数据(NFS挂载的使用)

可查看参考文档:(45条消息) 搭建NFS服务器_Claylpf的博客-CSDN博客

然后可以直接使用docker容器的卷直接挂载nfs服务器


参考文档:Volumes | Docker Documentation

什么是卷(volume)?

在容器化应用程序开发和部署过程中,卷(Volume)是一个非常常见的概念,它可以将主机文件系统或其他容器的文件系统挂载到容器内部的特定路径上,从而为容器提供额外的持久化存储。因此,容器里卷起到的作用主要有以下几个方面:

  1. 持久化存储:容器中的文件系统是短暂且易变的,当容器被删除后,容器内数据也会随之消失。而通过使用卷,可以将需要持久化的数据存储在卷中,从而保证数据的持久化。

  2. 数据共享:容器化应用程序通常由多个容器组成,这些容器需要分享数据或配置信息。通过使用卷,不同的容器之间可以共享相同的卷,从而实现数据共享

  3. 数据备份:通过使用卷,可以将数据备份到独立的存储设备中,例如网络附加存储(NAS)或云存储等。这有助于防止数据丢失、数据损坏或其他故障,提高了数据的可靠性。

总的来说,卷是容器化应用程序中提供持久化存储和数据共享的关键组件之一,可以提高应用程序的稳定性和可靠性,同时也有助于简化应用程序的开发和管理

 我们可以通过docker inspect查看每个容器对应的卷(volume)(mysq会自带卷,nginx不会,需要我们挂载卷)    

[root@mysql _data]# docker inspect sc-mysql-1 | egrep "volume"  #查找sc-mysql-1容器里对应的vloume卷
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/6167418cb7d0a3dfacef4439f410e1860c088d297cf47aeceaf88d3e56528219/_data",
[root@mysql _data]# 

什么是挂载,它的作用是什么?

在计算机中,挂载(Mount)通常指将一个文件系统(如硬盘分区、光盘或NFS共享)连接到另一个系统的目录树上,使得该文件系统中的文件和目录可以被访问。具体来说,挂载可以将文件系统加入到Linux中的虚拟文件系统树中,使得用户可以使用标准的文件操作命令(如ls、cp、mv等)来访问文件系统中的数据。

在实际应用中,挂载的作用有以下几个方面:

  1. 扩展文件系统:通过将新的文件系统挂载到现有的目录中,可以扩展现有文件系统的容量。

  2. 访问远程文件系统:通过挂载远程文件系统,例如NFS、CIFS/SMB文件共享,可以在本地计算机上访问位于远程计算机上的文件。

  3. 分离文件系统:通过挂载和卸载文件系统,可以将不同的文件系统隔离开来,以便于管理和维护,也可以帮助隔离不同的应用程序或用户之间的文件系统。

  4. 简化文件管理:通过挂载,可以将不同的文件系统组织成一个逻辑文件树,并可以使用标准文件操作命令来访问其中的所有文件和目录,简化了文件管理操作。

总的来说,挂载是计算机中一个非常常见的操作,它可以将不同的文件系统组织成一个逻辑文件树,并将它们与应用程序所使用的目录进行连接,扩展了文件系统的存储能力,并且使得用户可以通过统一的界面来管理和访问文件系统中的数据。

一台机器里的多个容器之间共享数据(使用挂载)

首先我们可以使用最简单的docker cp命令复制文件给容器,来实现跟挂载相似的功能

[root@mysql html]# cat index.html    #创建html文件
welcome to sc web!!!
[root@mysql html]# 

[root@mysql html]# docker cp /html/index.html clay-nginx:/usr/share/nginx/html 将创建的文件复制到容器里的html文件夹里

即可实现跟挂载一样的部分功能

但是它缺少了跟挂载一样的同步功能,当我改变外面的文件时,容器内文件并不会发生同步

因此我们需要使用真正的挂载功能

docker容器挂载文件的命令

-v 指定宿主机里的文件挂载到容器里的路径

[root@mysql ~]# docker run -d -p 8804:80 --name clay-nginx-1 -v /html/:/usr/share/nginx/html nginx
1082079b423b1976eee6d98f1e735fb476c7f743d34803f8acef92c12a55348a
[root@mysql ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS             PORTS                                   NAMES
1082079b423b   nginx     "/docker-entrypoint.…"   14 seconds ago      Up 13 seconds      0.0.0.0:8804->80/tcp, :::8804->80/tcp   clay-nginx-1
1d0ab6b389bb   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8803->80/tcp, :::8803->80/tcp   clay-nginx
[root@mysql ~]# 

功能展示

docker容器挂载卷(volume)的命令

下面我们进行卷volume的创建 

[root@mysql html]# docker volume create nginx-web #创建volume卷
nginx-web
[root@mysql html]# docker volume ls  #查看所有卷
DRIVER    VOLUME NAME
local     4c7c035ff15b9b022f6fc875d8303f6286cf61d8e89ea1692996760169393f1e
local     6167418cb7d0a3dfacef4439f410e1860c088d297cf47aeceaf88d3e56528219
local     e129efa82af7232ec5cdfd9f1ebb5e2ab35be29216166551aefe7d322b0309bf
local     nginx-web
[root@mysql html]# 

[root@mysql html]# docker volume inspect nginx-web   #查看卷的详细信息
[
    {
        "CreatedAt": "2023-04-16T08:41:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx-web/_data",
        "Name": "nginx-web",
        "Options": null,
        "Scope": "local"
    }
]
[root@mysql html]# 

我们在卷里创建一个html文件,用于挂载使用

[root@mysql html]# cd /var/lib/docker/volumes/nginx-web/  
[root@mysql nginx-web]# ls
_data
[root@mysql nginx-web]# cd _data/            #进入卷里保存数据的地方
[root@mysql _data]# ls
[root@mysql _data]# vim index.html
[root@mysql _data]# cat index.html 
welcome to sc study!
[root@mysql _data]# 

对卷进行挂载

[root@mysql ~]# docker run -d -p 8805:80 --name clay-nginx-2 -v nginx-web:/usr/share/nginx/html nginx         #对nginx-web卷进行挂载处理
c917e155a0fba24971a94b72da65b1e2878a621790ca686e70150a6bb41712ef
[root@mysql ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS             PORTS                                   NAMES
c917e155a0fb   nginx     "/docker-entrypoint.…"   11 seconds ago      Up 10 seconds      0.0.0.0:8805->80/tcp, :::8805->80/tcp   clay-nginx-2
1082079b423b   nginx     "/docker-entrypoint.…"   21 minutes ago      Up 21 minutes      0.0.0.0:8804->80/tcp, :::8804->80/tcp   clay-nginx-1
1d0ab6b389bb   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8803->80/tcp, :::8803->80/tcp   clay-nginx
[root@mysql ~]# 

查看效果

成功完成对卷的挂载

当然其他的容器,也可以挂载相同的卷,一个卷可以跟无数的容器挂载,因此可以使不同的容器看到一样的东西,实现了数据的共享

当然我们可以使用--mount来挂载文件

多台机器之间共享数据(NFS挂载的使用)

使用NFS服务

可查看参考文档:(45条消息) 搭建NFS服务器_Claylpf的博客-CSDN博客

实验规划图 

 

并设置共享目录的权限

当我们搭建好了 nfs 服务器

我们需要在宿主机host上也下载好 nfs 服务

然后可以直接使用docker容器的卷直接挂载nfs服务器

1、尝试使用卷来对应nfs服务器共享的目录 

查看我们创建的卷的详细信息 

最后对docker容器挂载卷即可

实验示意图 

注:如上的卷名不用,因此需要自己创建 

NFS是最简单最廉价的解决方案

NFS容易丢失数据,网络不稳定很容易丢失数据

我在这里使用NFS目的是为了模拟企业里,所有服务器到一台集中存放数据的服务器拿数据的

是为了模拟使用SAN而是使用

SAN是存储区域网络(Storage Area Network)的简称它是一种专门用于数据存储的高速、高可靠性、高扩展性网络。与传统的直接连接式存储方式(DAS)相比,SAN更加灵活和可扩展,通过光纤通道或者iSCSI等协议连接不同的服务器和存储设备。

SAN可以使用Fibre Channel或iSCSI等协议实现数据传输,具有以下优点:

  1. 高速:SAN利用光纤通道传输数据,速度可达几百到几千兆比特每秒,远高于传统的磁盘阵列和直接连接方式。

  2. 高可靠性:SAN采用多路径冗余机制,保证数据的高可靠性。如果某个路径出现故障,系统会自动切换到备用路径,从而保证数据的不断可用性。此外,SAN还支持快速克隆、备份和恢复功能,大大提高了数据的安全性和可靠性。

  3. 高扩展性:SAN可以通过添加新的存储设备实现容量的无限扩展,同时还可以实现虚拟化技术,将物理存储资源虚拟化为逻辑存储资源,从而更加灵活地进行存储管理。

总之,SAN是一种高速、高可靠性和高扩展性的存储解决方案,广泛应用于数据库、企业级应用、虚拟化等领域,是现代企业高效存储的首选技术。一台SAN服务器需要大几十万