1、什么是容器数据卷

docker理念回顾
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化。
例如:安装一个MySQL,结果你把容器删除了,就相当于删库跑路

所以我们希望容器之间有可能可以共享数据,docker容器产生的数据,如果不通过docker commit生成新镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了,这样的方案是不可行。

为了能保存数据在docker中我们就可以使用卷,让数据挂载到我们本地,这样数据就不会因为容器删除而丢失了
作用
卷就是目录和文件,存在一个或多个容器中,由docker挂载到容器,但不属于联合文件西戎,因此能够绕过union file system,提供一些用于持久存储或共享数据的特性。
卷的设计目的就是数据持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其他挂载的数据卷。
特点

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

总结:就是容器的持久化,以及容器间的继承和数据共享。

2、使用数据卷

(1)、容器中直接使用命令来添加

docker run -it -v 容器绝对路径目录:容器内目录 镜像名
[root@localhost home]# docker run -it -v /home/itcloudblog:/home/ centos /bin/bash
[root@f01c6c4b888d /]# 
查看数据卷是否挂载成功,执行命令:docker inspect 容器id

2023-06-25_133928.jpg
测试容器和宿主机之间数据共享:可以发现在容器中创建的会在宿主机中看到。

2023-06-25_134422.jpg

测试容器停止退出后,主机修改数据是否同步!

  1. 停止容器
  2. 在宿主机上修改文件,增加内容
  3. 启动刚才停止的容器
  4. 然后查看对应的文件,发现数据依旧同步。

2023-06-27_180645.jpg

通过Docker File来添加

DockerFile是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。
说明:在编写DockerFile文件中使用VOLUME指令来给镜像添加一个或多个数据卷
1、我们在宿主机上/home目录下新建一个docker-test-volume文件夹

[root@localhost home]# mkdir docker-test-volume

2、编写DockerFile文件

[root@localhost docker-test-volume]# cat dockerfile 
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo"------------end-----------"
CMD /bin/bash

[root@localhost docker-test-volume]# 

3、build后生成镜像,获取一个新镜像

docker build -f /home/docker-test-volume/dockerfile -t itcloudlog/centos .

2023-06-28_135035.jpg

4、启动容器

[root@localhost docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat                1.1       991d2bf8ebb4   3 days ago      684MB
nginx                 latest    605c77e624dd   18 months ago   141MB
tomcat                latest    fb5657adc892   18 months ago   680MB
mysql                 latest    3218b38490ce   18 months ago   516MB
itcloudlog/centos     latest    dce498831c82   21 months ago   231MB
centos                latest    5d0da3dc9764   21 months ago   231MB
portainer/portainer   latest    580c0e4e98b0   2 years ago     79.1MB
elasticsearch         latest    5acf0e8da90b   4 years ago     486MB
[root@localhost docker-test-volume]# 
[root@localhost docker-test-volume]# docker run -it dce498831c82 /bin/bash
[root@ce5aa6523fef /]# 

5、查看数据卷目录

[root@localhost docker-test-volume]# docker run -it dce498831c82 /bin/bash
[root@ce5aa6523fef /]#
[root@ce5aa6523fef /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 2 root root 6 Jun 28 05:53 dataVolumeContainer1 #数据卷目录
drwxr-xr-x. 2 root root 6 Jun 28 05:53 dataVolumeContainer2 #数据卷目录
drwxr-xr-x. 5 root root 360 Jun 28 05:53 dev
drwxr-xr-x. 1 root root 66 Jun 28 05:53 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 171 root root 0 Jun 28 05:53 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 11 16:05 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
[root@ce5aa6523fef /]#
通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢?

6、我们在数据卷中新建一个文件

[root@ce5aa6523fef /]# cd dataVolumeContainer1
[root@ce5aa6523fef dataVolumeContainer1]# touch container.txt
[root@ce5aa6523fef dataVolumeContainer1]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jun 28 05:56 container.txt
[root@ce5aa6523fef dataVolumeContainer1]# 

7、查看下这个容器的信息

docker inspect ce5aa6523fef
      "Mounts": [
            {
                "Type": "volume",
                "Name": "808b8f30f98121ac32c3d6a488b4e1f69c448f3a89c830065dfafc2a951714ba",
                "Source": "/var/lib/docker/volumes/808b8f30f98121ac32c3d6a488b4e1f69c448f3a89c830065dfafc2a951714ba/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "2a4ef9e1e78b1c7c85d51a38ee63498e29c13aa6b2faf3998b18254995317072",
                "Source": "/var/lib/docker/volumes/2a4ef9e1e78b1c7c85d51a38ee63498e29c13aa6b2faf3998b18254995317072/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

8、在宿主机上查看dataVolumeContainer1卷对应默认位置

[root@localhost ~]# cd /var/lib/docker/volumes/808b8f30f98121ac32c3d6a488b4e1f69c448f3a89c830065dfafc2a951714ba/_data
[root@localhost _data]# pwd
/var/lib/docker/volumes/808b8f30f98121ac32c3d6a488b4e1f69c448f3a89c830065dfafc2a951714ba/_data
[root@localhost _data]# ls
container.txt
[root@localhost _data]# 

最后修改:2023 年 06 月 28 日
如果觉得我的文章对你有用,请随意赞赏