docker 数据卷理解和使用

1、什么是docker数据卷

docker 数据卷呈现给docker容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。便于数据共享和重用

2、为什么要使用数据卷

1、当创建一个容器的时候,容器运行,数据能不能持久化?

2、如果能够持久化,数据存储在哪?由于docker是隔离的,数据能不能存储在容器外?

3、如果部署很多容器,每次都需要进入容器中进行配置嘛?能不能外部进行配置

docker 数据卷呈现给docker容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。

Volume的作用

  • 通过数据卷可以在容器之间实现共享和重用
  • 对数据卷的修改会立马生效(非常适合作为开发环境)
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

3、使用docker 数据卷 和 数据卷容器

1、为容器 挂载数据卷

docker run用来创建容器,可以在使用改命令时添加-v参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中,

-v的作用是将宿主机的一个目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。

docker run -p 8080:80 -d --name nginx01 -v /home/test:/home/test   nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-todlPAdA-1624331618817)(C:\Users\Meet\AppData\Roaming\Typora\typora-user-images\image-20210618144122193.png)]

意思是: 我们创建了一个名称为nginx01的容器,将本机的9999端口映射到容器中nginx服务器的默认web访问端口80下,创建一个数据卷,并挂载到容器的/home/test目录下(注意:如果不存在会自动创建)。

我们可以通过docker inspect指令找到Volume在主机上的存储位置

docker inspect  nginx01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEWuNZQi-1624331618823)(C:\Users\Meet\AppData\Roaming\Typora\typora-user-images\image-20210618144428868.png)]

测试:往容器卷写入数据,查看linux主机是否,会自动同步共享

# 容器中
root@dda40c3f4e1a:/home/test# touch nginxVolumn.txt
root@dda40c3f4e1a:/home/test# ls 
nginxVolumn.txt

#主机中
[root@VM-8-9-centos test]# ls
nginxVolumn.txt

# 容器数据卷 数据同步成功!

测试:当容器关闭的时候,linux往docker数据卷中写入数据,数据是否同步

# 关闭容器
[root@VM-8-9-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
dda40c3f4e1a   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 12 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   nginx01
[root@VM-8-9-centos ~]# docker stop nginx01 

# linux往数据卷写入数据 
[root@VM-8-9-centos test]# vim nginxVolumn.txt 
linux update  in container close.

# 开启容器 查看数据卷
[root@VM-8-9-centos ~]# docker start  nginx01 
nginx01
[root@VM-8-9-centos ~]# docker exec -it nginx01 /bin/bash
root@dda40c3f4e1a:/# cd /home/test/
root@dda40c3f4e1a:/home/test# ls
nginxVolumn.txt
root@dda40c3f4e1a:/home/test# cat nginxVolumn.txt 
linux update  in container close.

#  即使容器关闭,该容器数据卷依旧存在 ,  linux往容器数据卷写入数据成功!
2、数据卷权限 挂载目录到容器中

挂载的数据卷默认为可读写权限,除非外部文件系统做了特殊限制,在docker run的时候也可以执行为只读权限

[root@VM-8-9-centos ~]# docker run -d -p 9999:80 --name nginx02 -v /home/authority:/home/authority:ro nginx


# 容器中
root@e1ae8ee5c387:/home/authority# touch authority.txt
touch: cannot touch 'authority.txt': Read-only file system


# linxu中
[root@VM-8-9-centos authority]# touch authority.txt
[root@VM-8-9-centos authority]# ls
authority.txt

ro: 的意义在于,规定 容器对/home/authority 数据卷 只拥有readonly的权限

但是 linux跟跟容器共享的数据卷/home/authority 是拥有可读可写的权限。

3、挂载宿主机上的文件 到 容器中

想让所有的容器都可以共享宿主机的/home/hostFile.txt,从而只需要改变宿主机的文件源就能够影响到所有的容器。

[root@VM-8-9-centos home]# docker run -it -d --name nginx03 -v /home/hostFile.txt:/home/hostFile.txt:ro nginx
4、数据卷容器

数据卷容器: 在多个容器中共享数据的容器(实际上就是共享一个目录)

如果需要在多个容器间共享数据,并希望永久保存这些数据,最好的方式是使用数据卷容器,类似于一个提供网络文件共享服务的NFS服务器。

数据卷容器创建方法跟普通容器一样,只需要指定宿主机的一个文件夹作为数据卷即可,使用docker create命令创建但不启动数据卷容器:

# 通过宿主机的文件目录  创建 数据卷容器
# 创建一个数据卷容器
[root@VM-8-9-centos ~]# docker create -v /home/shareDirecotry --name shareDataVolumnContainer centos /bin/true
4092c64c2bf26fa1de45e46ff8d0c023f77a82f251d54d44d30078d71fdce82a

# 查看运行的容器
[root@VM-8-9-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c694a1581c35   nginx     "/docker-entrypoint.…"   47 minutes ago   Up 47 minutes   80/tcp    nginx03

# 查看全部容器
[root@VM-8-9-centos ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                         PORTS     NAMES
# 共享的数据卷容器
4092c64c2bf2   centos         "/bin/true"              13 seconds ago      Created                                  shareDataVolumnContainer    
c694a1581c35   nginx          "/docker-entrypoint.…"   47 minutes ago      Up 47 minutes                  80/tcp    nginx03
e1ae8ee5c387   nginx          "/docker-entrypoint.…"   About an hour ago   Exited (0) 51 minutes ago                nginx02
dda40c3f4e1a   nginx          "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             nginx01
dca312adb8a9   centos         "/bin/bash"              5 hours ago         Exited (0) 5 hours ago                   centos1
c4930882a1f1   d716ed54947b   "catalina.sh run"        25 hours ago        Exited (143) 2 hours ago                 tomcat0


# 创建多个容器 共享数据卷容器
[root@VM-8-9-centos ~]# docker run -it -d --volumes-from shareDataVolumnContainer  --name site1  nginx
9733bec6d7e6b860c5a6d39e229053faa94e48f59a9e843fb913def5e6f0e676
[root@VM-8-9-centos ~]# docker run -it -d --volumes-from shareDataVolumnContainer  --name site2  nginx
3926c6f338065c0e0764a576b286c3831821d34f1a919bdb5d3de6bd9979d303

 --volumes-from : 指定共享的数据卷容器
测试:多个容器共享数据卷容器

在这里插入图片描述

可以看到容器site1 在共享数据卷容器中创建了 site1.txt

容器site2 在共享数据卷容器中可以共享数据site1.txt

注意:此时linux主机是不能共享shareDirectory的

5、备份数据卷

**我们对数据卷容器中的数据进行备份,**备份方法:

1.创建一个新的容器
2.挂载数据卷容器
3.挂载宿主机本地目录作为数据卷
4.将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中
5.完成备份操作后容器销毁

请按照上述步骤对数据卷容器shiyanloudb中的数据进行备份:

# 创建备份目录
mkdir /tmp/backup
 
# 创建备份容器
docker run --rm --volumes-from shiyanloudb -v /tmp/backup:/backup ubuntu tar cvf /backup/shiyanloudb.tar /shiyanloudata

img

6、使用dockerFile 添加volume
使用VOLUME指令向容器添加volume

VOLUME /data

多个时VOLUME ["/data1","/data2"]

这种情况和第一个中情况docker run -v /data是一样的。注意,dockerfile中使用volume是不能和第二种方法那样挂载宿主机中指定的文件夹。这时为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹。

需要注意的是,在Dockerfile中使用VOLUME指令后,如果尝试对这个volume进行修改,这些修改指令都不会生效,比如下面例子,尝试添加一个文件,并修改文件并改变文件所有权限

FROM test/mycent:v1.0
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data
通过该Dockerfile创建镜像并启动容器后,该容器中存在用户foo,并且能看到在/data挂载的volume,但是/data文件夹的所有者并没有被改变为foo,而且/data下也没有/data/x文件。但是如果顺序反过来,先建文件,先授权,再挂载volume,那就得到期待的结果。

7、docker 具名,和匿名挂载
一、匿名挂载(指定容器数据卷,默认挂载到宿主机指定目录下生成的目录)

1.启动一个nginx 容器

语法格式:

-v   容器内路径!

[root@VM-8-9-centos ~]# docker run -d -p 9999:80 --name anonymousMount -v /etc/nginx  nginx

2.查看所有 volume 的情况

docker volume ls

该容器中数据卷会对应宿主机实际目录,通过docker inspect containerID 查看

docker inspect anonymousMount

# 一般都位于/var/lib/docker/volumes/ 下

"Mounts": [
            {
                "Type": "volume",
                "Name": "9677f2ed4e4cd6ef93254f34faabbb037b37b0a46e4221bd411911b7c2715442",
                "Source": "/var/lib/docker/volumes/9677f2ed4e4cd6ef93254f34faabbb037b37b0a46e4221bd411911b7c2715442/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

3.这里发现,这种就是匿名挂载,在 -v 的时候只加容器内路径,没有加容器外路径!

二、具名挂载

1.重新启动一个nginx 容器

语法格式:

-v 卷名:容器内路径

注:卷名前面不加路径/

 docker run -d -P --name nginx02 -v slotMount:/etc/nginx nginx

2.查看所有 volume 的情况

docker volume ls
DRIVER              VOLUME NAME
local               4dcdd5b0a408438d90683df372cbc31f0fc48497c4252f61cf9d9c2a03747c01
local               slotMount

3.查看具名卷的信息

docker volume inspect slotMount
[
    {
        "CreatedAt": "2021-01-27T15:54:14+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker容器内的卷,没有指定目录的情况下,都保存在“/var/lib/docker/volumes/xxx/_data”目录下。 # xxx为启动容器时设置的卷名

# 进入具名挂载的目录查看卷内的数据,可以看到nginx的配置文件存在!

[root@yang ~]# cd /var/lib/docker/volumes/slotMount/_data/
[root@yang _data]# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

!!!具名挂载可以方便找到一个卷,大多数情况下,推荐使用【具名挂载】

三、如何确定是匿名挂载,具名挂载,或者是指定路径挂载?
-v   容器内路径          # 匿名挂载         /var/lib/docker/volumes  生成对应挂载目录
-v   卷名:容器内路径       # 具名挂载         /var/lib/docker/volumes  生成对应挂载目录
-v   / 宿主机目录:容器内目录   # 指定路径挂载

个人博客:https://www.xiaoxuya.top/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白鸽呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值