运维docker07-docker数据管理

1、持久化和非持久化

  • docker数据主要分为两类:持久化的与非持久化的。

1、容器非持久化存储

  • 每个Docker容器都有非持久化存储。
  • 非持久化存储是创建容器时自动创建的,因此从属于容器,生命周期与容器相同,即删除容器也会删除全部非持久化数据。
  • 默认情况下,非持久化存储是容器全部文件和文件系统保存的地方。
  • 非持久化存储的位置:
    • 在Linux系统中,位于/var/lib/docker/<storage-driver>/。
    • 在Windows系统中,位于C\ProgramData\Docker\windowsfilter\。

示例:

]# docker container run --name web1 -d nginx:latest
]# docker container exec -it web1 bash
root@6d70626c1af2:/# touch /tmp/hh.txt

]# docker container inspect -f {{".GraphDriver.Data.UpperDir"}} web1    #查看容器在本地的非持久化存储
/var/lib/docker/overlay2/d95da2578a36387a3eddb0f42a78f547fe471505352e0c37165527482b3208ec/diff
]# ls /var/lib/docker/overlay2/d95da2578a36387a3eddb0f42a78f547fe471505352e0c37165527482b3208ec/diff/tmp/
hh.txt

2、容器持久化存储

  • 在生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
  • 如果希望持久化容器数据,则需要将数据存储在卷上。卷与容器是解耦的,从而可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定。最终效果即用户可以删除一个关联了卷的容器,但是卷并不会被删除。
  • 容器数据的持久化有两种方式:
    • 数据卷(Data Volumes):容器内数据直接映射到本地主机。
    • 数据卷容器(Data Volume Containers): 使用特定容器维护数据卷。

2、管理普通数据卷

  • 数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
  • 数据卷的特性:
    • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便。
    • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
    • 对数据卷的更新不会影响镜像,解耦应用和数据。
    • 卷会一直存在,直到没有容器使用,可以安全地卸载它,即被容器使用的数据卷无法删除
  • 基本语法格式如下
docker volume COMMAND
    inspect     显示一个或多个卷的详细信息
    ls          列出所有卷
    create      创建卷
    prune       删除所有未使用的本地卷
    rm          删除一个或多个卷

1、查看数据卷

  • 基本语法格式如下
docker volume ls [OPTIONS]
    -f, --filter filter   提供过滤值 (e.g. 'dangling=true')
    -q, --quiet           只显示卷名
    --format string       使用给定的Go模板格式化输出
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
    -f, --format string   使用给定的Go模板格式化输出

2、创建数据卷

  • 基本语法格式如下
docker volume create [OPTIONS] [VOLUME]
    -d, --driver string   指定卷驱动器名称 (default "local")
    --label list          设置卷的元数据
    -o, --opt map         设置驱动程序特定选项(default map[])
  • 默认情况下,Docker创建新卷时采用内置的local驱动。恰如其名,本地卷只能被所在节点的容器使用。使用-d参数可以指定不同的驱动。
  • 普通数据卷在宿主机的/var/lib/docker/volumes/目录下
  • 第三方驱动可以通过插件方式接入。这些驱动提供了高级存储特性,并为Docker集成了外部存储系统。驱动集成了外部存储系统到Docker环境当中,同时能使用其高级特性。
    • 块存储:相对性能更高,适用于对小块数据的随机访问负载。目前支持Docker卷插件的块存储例子包括HPE 3PAR、Amazon EBS以及OpenStack块存储服务(Cinder)。
    • 文件存储:包括NFS和SMB协议的系统,同样在高性能场景下表现优异。支持Docker卷插件的文件存储系统包括NetApp FAS,Azure文件存储以及Amazon EFS。
    • 对象存储:适用于较大且长期存储的、很少变更的二进制数据存储。通常对象存储是根据内容寻址,并且性能较低。支持Docker卷驱动的例子包括Amazon S3、Ceph以及Minio。
  • 下图展示的就是外部存储系统被用作卷存储。

示例:

]# docker volume create test    #等价于docker volume create -d local test

]# docker volume ls
DRIVER    VOLUME NAME
local     test
]# docker volume inspect test
[
    {
        "CreatedAt": "2021-09-15T17:34:58+08:00",
        "Driver": "local",                                     #Driver和Scope都是local。这意味着卷使用默认local驱动创建,只能用于当前Docker主机上的容器
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test/_data",    #Mountpoint属性说明卷位于Docker主机上的位置。
        "Name": "test",
        "Options": {},
        "Scope": "local"
    }
]

3、删除数据卷

  • 基本语法格式如下
docker volume rm [OPTIONS] VOLUME [VOLUME...]                  #删除一个或多个卷。不能删除容器正在使用的卷。
    -f, --force       强制移除一个或多个卷
docker volume prune [OPTIONS]                                  #删除所有未使用的本地卷
    --filter filter   提供过滤值(e.g. 'label=<label>')
    -f, --force       不提示确认
  • docker volume prune会删除未装入到某个容器或者服务的所有卷,所以谨慎使用!
  • docker volume rm允许删除指定卷。
  • 两种删除命令都不能删除正在被容器或者服务使用的卷。

示例:

]# docker volume rm test1 test2
]# docker volume prune -f

3、使用数据卷

  • 基本语法格式如下
docker container run --name 容器名 --mount type=volume,source=数据卷名,destination=容器路径 -d image[:tag]     #普通数据卷
docker container run --name 容器名 --mount type=tmpfs,tmpfs-size=512M,destination=容器路径 -d image[:tag]     #临时数据卷
docker container run --name 容器名 --mount type=bind,source=宿主机路径,destination=容器路径 -d image[:tag]     #绑定数据卷

Common Options:
    src, source: 绑定宿主机目录或挂载数据卷
    dst, destination, target: 挂载目标,即容器中的目录。
    ro, readonly:只读(默认读写)。
  • --mount选项支持三种类型的数据卷:
    • volume:普通数据卷,映射到主机var/lib/docker/volumes路径下。
      • 如果指定了已经存在的卷,Docker会使用该卷。
      • 如果指定的卷不存在,Docker会创建一个卷。
    • bind:绑定数据卷,映射到主机指定路径下。
      • 宿主机目录的路径必须是绝对路径,使用前必须存在。
      • 容器内路径可以为相对路径。如果不存在,Docker会自动创建。
    • tmpfs:临时数据卷,只存在于内存中。
  • 可以在创建容器时将宿主机的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷

示例1:

]# docker container run --name web1 --mount source=test1,target=/tmp -d nginx:latest    #创建一个容器,并使用数据卷
]# docker container exec -it web1 /bin/bash                                             #进入容器,并创建文件
/# ls /tmp/
/# echo '210917-1119' > /tmp/hello.txt
/# ls /tmp/
hello.txt

]# cat /var/lib/docker/volumes/test1/_data/hello.txt                                    #在容器外查看在容器中创建的文件
210917-1119

]# docker volume rm -f test1                                                            #被容器使用的数据卷不能被删除
Error response from daemon: remove test1: volume is in use - [7e7ef3b13be7e763728acd6042837f6e8b95899c980f465252c1a7a47f7c1f1f]
]# docker container rm -f web1
]# ls /var/lib/docker/volumes/test1/_data                                               #删除容器后,数据卷依然存在
hello.txt

]# docker volume rm test1                                                               #删除数据卷
test1
]# ls /var/lib/docker/volumes/test1/_data
ls: 无法访问/var/lib/docker/volumes/test1/_data: 没有那个文件或目录

示例2:

]# mkdir /test2
]# docker container run --name web2 --mount type=bind,source=/test2,target=/tmp -d nginx:latest

]# docker container exec -it web2 bash
/# echo '210917-1245' > /tmp/hh.txt

]# cat /test2/hh.txt
210917-1245

4、数据卷容器

1、使用数据卷容器

  • 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
  • 数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
  • 可以多次使用--volumes-from参数来从多个容器挂载多个数据卷
  • 使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态

示例:

]# docker container create --name volume1 --mount type=bind,src=/data1/,dst=/data1 busybox:latest    #创建一个数据卷容器

]# docker container run --name web1 --volumes-from volume1 -d nginx:latest    #创建容器web1,并使用数据卷容器
]# docker container run --name web2 --volumes-from volume1 -d nginx:latest    #创建容器web2,并使用数据卷容器

]# docker container exec -it web1 bash    #进入容器web1,并创建文件
/# echo '210917-1431' > /data1/hh.txt
]# docker container exec -it web2 bash    #进入容器web2,并查看在web1中创建的文件
/# cat /data1/hh.txt
210917-1431
]# cat /data1/hh.txt                      #在宿主机查看在web1中创建的文件
210917-1431

2、利用数据卷容器来迁移数据

]# docker container run --volumes-from volume1 --mount type=bind,src=$(pwd),dst=/backup --name worker busybox:latest tar cvf /backup/backup.tar /data1/

]# tar vft backup.tar
drwxr-xr-x root/root         0 2021-09-17 14:33 data1/
-rw-r--r-- root/root        12 2021-09-17 14:33 data1/hh.txt
  • 首先利用busybox:latest镜像创建了一个容器worker。
  • 使用--volumes-from volume1参数来让worker容器挂载volume1容器的数据卷(即/data1数据卷);
  • 使用--mount type=bind,src=$(pwd),dst=/backup参数来挂载本地的当前目录到worker容器的/backup目录。
  • worker容器启动后,使用tar cvf /backup/backup.tar /data1/命令将/data1/下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
posted @ 2021-09-15 16:12  麦恒  阅读(34)  评论(0编辑  收藏  举报