目录
参考文档:Volumes | Docker Documentation
什么是卷(volume)?
什么是挂载,它的作用是什么?
一台机器里的多个容器之间共享数据(使用挂载)
首先我们可以使用最简单的docker cp命令复制文件给容器,来实现跟挂载相似的功能
docker容器挂载文件的命令
docker容器挂载卷(volume)的命令
多台机器之间共享数据(NFS挂载的使用)
可查看参考文档:(45条消息) 搭建NFS服务器_Claylpf的博客-CSDN博客
然后可以直接使用docker容器的卷直接挂载nfs服务器
在容器化应用程序开发和部署过程中,卷(Volume)是一个非常常见的概念,它可以将主机文件系统或其他容器的文件系统挂载到容器内部的特定路径上,从而为容器提供额外的持久化存储。因此,容器里卷起到的作用主要有以下几个方面:
持久化存储:容器中的文件系统是短暂且易变的,当容器被删除后,容器内数据也会随之消失。而通过使用卷,可以将需要持久化的数据存储在卷中,从而保证数据的持久化。
数据共享:容器化应用程序通常由多个容器组成,这些容器需要分享数据或配置信息。通过使用卷,不同的容器之间可以共享相同的卷,从而实现数据共享。
数据备份:通过使用卷,可以将数据备份到独立的存储设备中,例如网络附加存储(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等)来访问文件系统中的数据。
在实际应用中,挂载的作用有以下几个方面:
扩展文件系统:通过将新的文件系统挂载到现有的目录中,可以扩展现有文件系统的容量。
访问远程文件系统:通过挂载远程文件系统,例如NFS、CIFS/SMB文件共享,可以在本地计算机上访问位于远程计算机上的文件。
分离文件系统:通过挂载和卸载文件系统,可以将不同的文件系统隔离开来,以便于管理和维护,也可以帮助隔离不同的应用程序或用户之间的文件系统。
简化文件管理:通过挂载,可以将不同的文件系统组织成一个逻辑文件树,并可以使用标准文件操作命令来访问其中的所有文件和目录,简化了文件管理操作。
总的来说,挂载是计算机中一个非常常见的操作,它可以将不同的文件系统组织成一个逻辑文件树,并将它们与应用程序所使用的目录进行连接,扩展了文件系统的存储能力,并且使得用户可以通过统一的界面来管理和访问文件系统中的数据。
[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文件夹里
即可实现跟挂载一样的部分功能
但是它缺少了跟挂载一样的同步功能,当我改变外面的文件时,容器内文件并不会发生同步
因此我们需要使用真正的挂载功能
-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 ~]#
功能展示
下面我们进行卷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 服务器
我们需要在宿主机host上也下载好 nfs 服务
最后对docker容器挂载卷即可