首页 > 其他分享 >【Docker】Docker数据的存储

【Docker】Docker数据的存储

时间:2023-10-30 16:32:46浏览次数:58  
标签:容器 存储 Sep volume UTC 2023 docker 数据 Docker


默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层里,如果容器被删除了,则对应的数据也随之删除了。

这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享。

Docker主要提供了两种方式做数据的持久化:

  • Data Volume:由Docker管理(数据目录/var/lib/docker/volumes/), 持久化数据的最好方式
  • Bind Mount:由用户指定存储的数据具体mount在系统什么位置

【Docker】Docker数据的存储_dockerfile

Data Volume

准备一个脚本

date.sh

#!/bin/bash

while true
do
    echo `date`
    echo `date` >> /home/morris/dockerfile/volumn/logs/date.log
    sleep 1
done

准备一个镜像

Dockerfile

from alpine:latest

label author=morris

env work_dir /usr/app

workdir $work_dir

copy date.sh .

volume ["/home/morris/dockerfile/volume/logs/"]

entrypoint ["sh", "date.sh"]

构建镜像:

$ docker build -t date:1.0 .
Sending build context to Docker daemon  4.608kB
Step 1/7 : from alpine:latest
 ---> c059bfaa849c
Step 2/7 : label author=morris
 ---> Using cache
 ---> 4a7f368ccac1
Step 3/7 : env work_dir /usr/app
 ---> Using cache
 ---> 2413cf06006b
Step 4/7 : workdir $work_dir
 ---> Using cache
 ---> 1230bcd7bf40
Step 5/7 : copy date.sh .
 ---> Using cache
 ---> 6ad3761a0592
Step 6/7 : volume ["/home/morris/dockerfile/volume/logs/"]
 ---> Using cache
 ---> 82ad0fd1b949
Step 7/7 : entrypoint ["sh", "date.sh"]
 ---> Using cache
 ---> ca25386d02f3
Successfully built ca25386d02f3
Successfully tagged date:1.0

创建容器(不指定-v参数)

启动容器:

$ docker container run --rm date:1.0
Fri Sep 22 02:01:56 UTC 2023
Fri Sep 22 02:01:57 UTC 2023

另外启动一个shell,进入容器中查看日志:

$ docker container exec -it e4 sh
/usr/app # tail -f /home/morris/dockerfile/volume/logs/date.log
Fri Sep 22 02:03:32 UTC 2023
Fri Sep 22 02:03:33 UTC 2023
Fri Sep 22 02:03:34 UTC 2023

此时Docker会自动创建一个随机名字的volume,去存储我们在Dockerfile定义的volume。

可以使用docker container inspect命令查看随机生成的volume名称:

... ...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87",
                "Source": "/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data",
                "Destination": "/home/morris/dockerfile/volume/logs",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
... ...

可以使用docker volume ls查看所有的volume列表:

$ docker volume ls
DRIVER    VOLUME NAME
local     3dc166ddf9968412b6d9f8050a0b9d84f74a0fae4d8f5d1c55222222ec142c82
local     b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
local     bc5e8a682761ee129bf98206758d4e6a76df9755f825c61c030330ce78190376
local     d62c8edbe60a80ba8c5d57c678e0badb542ec7ceb6120ce3d0e442c3e6d2f7b7
local     f3bbbca769c38f706f286b08824f6bcee0dfb362931c7bf5d97102f12e11fe4f
local     fc6e4e62f182938fa48954252ecbee4485194dcd1c11d995f25678744ce0300d

可以使用docker volume inspect查看volume的详细信息:

$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[
    {
        "CreatedAt": "2023-09-22T10:01:56+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data",
        "Name": "b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87",
        "Options": null,
        "Scope": "local"
    }
]

可以看到volume对应宿主机器上存储的物理地址为/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data,我们到这个目录查看下:

# cd /var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data

# ll
total 36
drwxr-xr-x 2 root root  4096 Sep 22 10:01 ./
drwx-----x 3 root root  4096 Sep 22 10:01 ../
-rw-r--r-- 1 root root 23867 Sep 22 10:15 date.log

# tail -f date.log
Fri Sep 22 02:15:36 UTC 2023
Fri Sep 22 02:15:37 UTC 2023
Fri Sep 22 02:15:38 UTC 2023
... ...

当容器删除后,这个volume也随之删除了:

$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[]
Error: No such volume: b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87

创建容器(指定-v参数)

在创建容器的时候通过-v参数我们可以手动的指定需要创建Volume的名字,以及对应于容器内的路径,这个路径是可以任意的,不必需要在Dockerfile里通过VOLUME定义。

比如在创建容器时指定volume的名字为mydate,对应容器的路径为/home/morris/dockerfile/volume/logs

$ docker container run -v mydate:/home/morris/dockerfile/volume/logs --rm date:1.0
Fri Sep 22 02:32:31 UTC 2023
Fri Sep 22 02:32:32 UTC 2023

查看volume列表:

$ docker volume ls
DRIVER    VOLUME NAME
local     mydate

删除容器后volume还存在,不会跟着容器一起删除,这样我们在下次运行新的容器时可以volume的名称继续使用volume中的数据。

Bind Mount

Docker Bind Mounts是一种用于将主机文件或目录挂载到Docker容器中的方法,可以实现容器与主机之间的文件共享。

Data Volume模式只能将/var/lib/docker/volumes/中的目录与Docker容器共享,而Docker Bind Mounts能实现主机中任意文件与容器之间的共享。

由于我这里使用的是WSL中运行的Docker,所以我们可以将Windows中的D盘的docker_data目录映射到一个具体GCC环境的Docker容器中,这样可以在Windows下使用编辑器编辑c语言的源文件,然后使用Docker容器中的GCC环境进行编译:

$ docker run --rm -it -v /mnt/d/docker_data:/usr/app gcc:9.4 bash
root@aedaf7a3e462:/# cd /usr/app/
root@aedaf7a3e462:/usr/app# ls
hello.c

多个机器之间的容器共享数据

官方参考链接 https://docs.docker.com/storage/volumes/#share-data-among-machines

Docker的volume支持多种driver。默认创建的volume driver都是local

$ docker volume inspect mydate
[
    {
        "CreatedAt": "2023-09-22T10:32:31+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mydate/_data",
        "Name": "mydate",
        "Options": null,
        "Scope": "local"
    }
]

下面我们来看看一个叫sshfs的driver,如何让docker使用不在同一台机器上的文件系统做为volume

主机规划

准备两天Linux机器,之间可以通过SSH相互通信。

  • 192.168.200.10:名称为host1,安装Docker
  • 192.168.200.11:名称为host2,作为数据存储

账号密码都是 root/root

安装插件

host1:192.168.200.10上安装Docker插件vieux/sshfs

$ docker plugin install --grant-all-permissions vieux/sshfs
latest: Pulling from vieux/sshfs
Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811
52d435ada6a4: Complete
Installed plugin vieux/sshfs

创建volume

使用类型为vieux/sshfs的driver创建一个名为sshvolume的volume。

$ docker volume create --driver vieux/sshfs -o [email protected]:/home/logs -o password=root sshvolume

查看volume:

$ docker volume ls
DRIVER               VOLUME NAME
local                mydate
vieux/sshfs:latest   sshvolume

$ docker volume inspect sshvolume
[
    {
        "CreatedAt": "0001-01-01T00:00:00Z",
        "Driver": "vieux/sshfs:latest",
        "Labels": {},
        "Mountpoint": "/mnt/volumes/24ef5f7f94863e87f7802e20f5662e68",
        "Name": "sshvolume",
        "Options": {
            "password": "root",
            "sshcmd": "[email protected]:/home/logs"
        },
        "Scope": "local"
    }
]

创建容器挂载Volume

创建容器,挂载sshvolume

$ docker container run -v sshvolume:/home/morris/dockerfile/volume/logs --rm date:1.0
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023

这个文件我们可以在host2上看到:

$ tail -f /home/logs/date.log
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023


标签:容器,存储,Sep,volume,UTC,2023,docker,数据,Docker
From: https://blog.51cto.com/morris131/8094102

相关文章

  • 【Docker】Docker的网络
    Docker提供了多种内置的网络模式,用于在容器之间建立网络连接。这些网络模式,包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。桥接网络桥接网络是Docker的默认网络模式。在桥接网络中,Docker会为每个容器创建一个虚拟网络接口,并为容器分配一个IP......
  • 【Docker】Docker Compose的使用
    我们知道使用一个Dockerfile模板文件,可以让用户很方便的定义⼀个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等,我们只能一个一个......
  • Linux系统重装后恢复数据盘LVM卷
    请注意,在执行这些步骤之前,确保已经了解LVM的基本概念和操作方式,并且谨慎操作以避免数据丢失。此外,如果有关于卷组的备份,那么更安全的方法是直接恢复备份,在重装系统之后再进行数据还原。在Linux系统重装后恢复LVM数据盘卷时,您可以按照以下步骤进行:1、确保LVM卷组已经存......
  • docker指令详解
    Docker指令详解1.生命周期管理run创建并运行容器,格式dockerrun[OPTIONS]image[COMMAND][ARG...],参数说明dockerrun[options]image[command][arg...]-d,--detach#后台运行-it,--interacticetty#交互终端形式运行-p,--publishlist#指定端口-v,--vo......
  • Oracle系列---【数据库连接数超了,导致数据库连接不上,如何排查当前连接数,以及如何修改
    数据库连接数超了,导致数据库连接不上,如何排查当前连接数,以及如何修改最大连接数限制?1.对比当前连接数和最大连接数如果差的比较少,比如相差十几,二十几,连不上的话,很有可能是用连接池连接,一次申请连接数大于剩余的连接数导致的。#查看当前总连接数SELECTcount(*)FROMV$session......
  • 智能化农业温湿度数据采集网关
    随着科技的发展,各行各业对于环境参数的监测需求不断增加。尤其在某些特定行业,如温室农业、制药、食品、冷库等加工领域,温度和湿度的控制对于保障生产过程的稳定性至关重要。因此,温湿度数据的采集与监控具有越来越重要的意义。温湿度数据采集是通过安装在不同位置的传感器设备来实现......
  • SQL Server数据库创建远程服务器备份计划(小白详细图文教程)
    一、前言最近项目系统做安全加固,以前是本地备份,现在需要做远程内网服务器数据库备份,后期也有可能做异地备份。下面以SQLServer2016内网服务器数据库备份为例,数据库服务器地址:192.168.10.200备份服务器地址:192.168.10.100二、创建存储文件夹192.168.10.100远程100服务器,创建......
  • 数据结构:栈与队列-详解循环队栈
    《详解循环队栈》目录:循环队列的定义及其特点循环队列的实现完整Demo运行截图小结参考文献一、循环队列的定义及其特点队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表......
  • JavaScript数据类型的转换
    一、字符串类型的转换1、自动转换<script>varstr='hello';varnum=100;console.log(str+num);console.log(typeof(str+num));</script>2、强制转换String(),object.toString()<script>//string()var......
  • 数据统计分析 — 正态分布
    连续型随机变量的概率分布德国的高斯法国的拉普拉斯回到最开始的业务场景通过统计描述,分析师已经了解了配件A过去的日消耗量波动情况,现希望基于历史数据设定库存控制线,要求该库存量能够保证99%的使用日不会出现库存断货情况。该怎么办呢?控制线设置成均数可以吗?肯定是不......