跳到主要内容
  1. 所有文章/
  2. Docker学习笔记/

Docker05容器数据卷

·📄 832 字·🍵 2 分钟

什么是容器数据卷? #

问题:如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

解决:容器之间可以有一个数据共享技术,Docker 容器中产生的数据可以同步到本地。这就是卷技术。

数据卷技术:实现容器与主机之间持久化和同步操作,容器与容器之间的数据共享。

使用数据卷 #

# docker run -it -v 主机目录:容器内目录
#运行
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

#进入容器内部查看文件
[root@1309cabd368d /]# cd home
[root@1309cabd368d home]# ls
test

#快捷键退出后,查看主机文件
[root@izwz91mv6i3x6k12jjqh60z ~]# cd ../
[root@izwz91mv6i3x6k12jjqh60z /]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@izwz91mv6i3x6k12jjqh60z /]# cd home/ceshi
[root@izwz91mv6i3x6k12jjqh60z ceshi]# ls
test

[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED             STATUS             PORTS                                       NAMES
e9a056333396   centos    "/bin/bash"         16 minutes ago      Up 16 minutes                                                  strange_grothendieck
39f11d68d64d   tomcat    "catalina.sh run"   About an hour ago   Up About an hour   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat02

#看到容器有如下显示:说明配置成功
[root@izwz91mv6i3x6k12jjqh60z ~]# docker inspect e9a056333396

image-20210514121726073.png

具名和匿名挂载 #

#匿名挂载(只写了容器内的路径)
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
0f3e16361a94ebad9c33f1f95541221baeb34938f49cc22b0e2f4b48529ac5c5

#查看所有 volume 卷情况
[root@izwz91mv6i3x6k12jjqh60z ~]# docker volume ls
DRIVER    VOLUME NAME
local     24570da35a5fed8d17719e297aee20858fea33320982d266ba9a42d272f96514
local     47031f8700fc06fda4053726e7df7e37df7917b0bf66c834ed94998c73049d3d
local     3454500b1f5630df52a4292c2b98bce1a77de4fed08a7e2a02606dd13482a410
local     cc0f07ef4be0cf2bf6c8e9395198e69744227cc10cba02aad9d9c08d613b7426

#具名加载
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx nginx
264b185cbcccb005f20eb63d86b01d39e39b99fe2e7626590ed41d2b1bc57838

[root@izwz91mv6i3x6k12jjqh60z ~]# docker volume ls
DRIVER    VOLUME NAME
local     24570da35a5fed8d17719e297aee20858fea33320982d266ba9a42d272f96514
local     47031f8700fc06fda4053726e7df7e37df7917b0bf66c834ed94998c73049d3d
local     3454500b1f5630df52a4292c2b98bce1a77de4fed08a7e2a02606dd13482a410
local     cc0f07ef4be0cf2bf6c8e9395198e69744227cc10cba02aad9d9c08d613b7426
local     jumin-nginx

#查看这个卷
[root@izwz91mv6i3x6k12jjqh60z ~]# docker inspect jumin-nginx
[
    {
        "CreatedAt": "2021-05-14T15:41:29+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jumin-nginx/_data",
        "Name": "jumin-nginx",
        "Options": null,
        "Scope": "local"
    }
]

总结:所有容器内的卷,在没有指定目录的情况下都是在 /var/lib/docker/volumes/XXXXXX/_data 。通过具名加载可以方便的找到我们的一个卷,大多数情况都是使用 具名加载

注意如下不同点:

-v 容器内路径            #匿名加载
-v 卷名:容器内路径       #具名加载
-v /宿主机路径:容器路径   #指定路径加载

拓展:

#通过 设置 ro rw 改变读写权限
ro #只读
rw #可读可写

#如:
docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx:ro nginx

#若设置为只读就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

什么是数据卷容器? #

容器之间使用数据卷技术实现数据同步和共享。

两个或多个容器之间实现数据共享思路:

image-20210514163909043.png

#启动容器 docker01
[root@izwz91mv6i3x6k12jjqh60z test]# docker run -it --name docker01 zhang_new_centos:1.0

#启动容器 docker02 --volumes-from docker01
[root@0292e5d71d18 /]# [root@izwz91mv6i3x6k12jjqh60z test]# docker run -it --name docker02 --volumes-from docker01  zhang_new_centos:1.0

#查看状态
[root@66a61d493849 /]# [root@izwz91mv6i3x6k12jjqh60z test]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED             STATUS             PORTS                                       NAMES
66a61d493849   zhang_new_centos:1.0   "/bin/sh -c /bin/bash"   12 seconds ago      Up 11 seconds                                                  docker02
0292e5d71d18   zhang_new_centos:1.0   "/bin/sh -c /bin/bash"   26 seconds ago      Up 25 seconds                                                  docker01

通过 docker inspect docker01 发现:

image-20210514164643381.png

通过 docker inspect docker02 发现:

image-20210514164720528.png

说明成功实现了容器间的数据同步!!

注意:容器之间配置信息的传递,数据卷容器的生命周期会一直持续到没有容器使用为止。但一旦你持久化到了本地,这个时候,本地的数据是不会删除的。