docker学习(十)Docker 持久化存储

这篇具有很好参考价值的文章主要介绍了docker学习(十)Docker 持久化存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

docker学习(一)docker 概述
docker学习(二)docker 安装部署
docker学习(三)常用命令
docker学习(四)使用 commit 制作镜像
docker学习(五)使用 Dockerfile 制作镜像
docker学习(六)卷 Volume
docker学习(七)docker daemon
docker学习(八)HTTP/HTTPS 代理
docker学习(九)docker 调试
docker学习(十)docker 持久化存储

了解联合文件系统后,我们知道,镜像是只读的,类似共享文件形式让多个容器使用。如果要在容器里修改文件,即镜像里的文件,那该如何修改?
为了解决这个问题,docker 引入了 写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改。

1.容器的数据卷

1.1.什么是数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。

1.2.数据卷特点

数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接进行修改
数据卷的变化不会影像镜像的更新
卷会一直存在,即使挂载数据卷的容器已经被删除

1.3.Docker 提供三种方式将数据从宿主机挂载到容器

Volumes: Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
Bind mounts: 将宿主机的任意位置的文件或者目录挂载到容器中。
tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmps,同时避免写入容器可写层提高性能。

2.volume 持久化方案

2.1.volume 简介

volume是Docker官方推荐的持久化方案,默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统外的程序无权限修改其中的数据。
一个volume可以同时供多个container使用,如果没有container使用volume,其不会自动删除,用户需运行docker volume prune明确删除。
如果用户显式创建volume,则需要给其指定一个名称;如果是隐式创建volume,Docker会自动为其分配一个在宿主机范围内唯一的名字。

2.2.volume 特点

docker volume create -v 创建 volume 时,宿主机目录路径必须以/或~/开头,否则 Docker 会将其当成volume 而不是bind mount。
如果容器中的目录不存在,docker会自动创建目录;如果容器中的目录已有内容,docker会使用宿主机上目录的内容覆盖容器目录的内容。

2.3.常用命令与实操

## 管理卷
sudo docker volume create test-vol # docker volume ls
sudo docker volume inspect test-vol
## 用卷创建一个容器
sudo docker run -itd --rm --name centos7-zlm-image-container -v test-vol:/home/volume centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=volume,src=test-vol,dst=/home/volume centos7-zlm-image /bin/bash
## 进入容器
sudo docker exec -it centos7-zlm-image-container /bin/bash
## 清理
sudo docker stop centos7-zlm-image-container # docker rm test-test
## 删除卷
sudo docker volume rm test-vol
## 注意:如果没有指定卷,自动创建。

创建数据卷,启动容器使用 test-vol 这个数据卷

# 清空无用的卷
[test@localhost ~]$ sudo docker volume prune
[sudo] test的密码:
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
09d989283ec5e1c70b0825fff898d57128a04cff7d9a3b5ca26cf9730fe5a7a5
97f2c76715724f2a4695db654df39aa304bbeff10289595ac1d4ff1a967c4e62
ed750105d8244db3d5d5f7a468bec397807edd70934986725dbc6d04e4cd5557
......

Total reclaimed space: 0B
# 创建卷
[test@localhost ~]$ sudo docker volume create test-vol
test-vol
# 查看卷信息
[test@localhost ~]$ sudo docker volume inspect test-vol
[
    {
        "CreatedAt": "2023-07-04T09:59:31+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
        "Name": "test-vol",
        "Options": {},
        "Scope": "local"
    }
]
# 查看/var/lib/docker/volumes 多了一个目录
[test@localhost ~]$ sudo ls /var/lib/docker/volumes
backingFsBlockDev  metadata.db  test-vol
# 创建容器,绑定卷到容器目录
[test@localhost ~]$ sudo docker run -itd --rm --name centos7-zlm-image-container -v test-vol:/home/volume centos7-zlm-image /bin/bash
6c4f9e398ec446777613b599f0182a902d01ba3af468f8f865ba6dd6fcfb7169
# 进入容器
[test@localhost ~]$ sudo docker exec -it centos7-zlm-image-container /bin/bash
# 容器内创建文件
[root@6c4f9e398ec4 /]# cd /home/volume/
[root@6c4f9e398ec4 volume]# ls 
[root@6c4f9e398ec4 volume]# touch hello.txt 
[root@6c4f9e398ec4 volume]# exit 
exit
# 查看本地卷,多了了hello.txt文件
[test@localhost ~]$ sudo ls /var/lib/docker/volumes/test-vol/_data
hello.txt
# 停止容器
[test@localhost ~]$ sudo docker stop centos7-zlm-image-container
centos7-zlm-image-container
# 删除卷
[test@localhost ~]$ sudo docker volume rm test-vol
test-vol
# 删除本地目录
[test@localhost ~]$ sudo ls /var/lib/docker/volumes/test-vol/_data
ls: 无法访问/var/lib/docker/volumes/test-vol/_data: 没有那个文件或目录
[test@localhost ~]$ 

2.4.volume 使用场景

通过使用第三方提供的volume driver,用户可以将数据持久到远程主机或者云存储中。
(1)多个容器间共享数据。
(2)宿主机不保证存在固定目录结构。
(3)持久化数据到远程主机或者云存储而非本地。
(4)需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等
其实跟命名卷类似,参考docker学习(六)卷Volume

3.Bind Mounts 持久化方案

3.1.bind mount 简介

bind mount 持久化方式将宿主机中的文件、目录挂载到容器上,相应文件、目录可以被宿主机读写,也可以被容器读写。
bind mount 持久化方式可以将数据存储在宿主机器任何地方,但会依赖宿主机的目录结构,因此不能通过docker CLI直接管理,并且非Docker 进程和 Docker 进程都可以修改。

3.2.bind mount 特点

(1)性能最好
(2)Docker容器与宿主机耦合过于紧密,移植性较差。

3.3.常用命令与实操

#用卷创建一个容器:
sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=bind,src=/opt/bind,dst=/home/bind centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name=centos7-zlm-image-container -v /opt/bind:/home/bind centos7-zlm-image /bin/bash
# 验证绑定:
sudo docker inspect centos7-zlm-image-container
# 清理:
sudo docker stop centos7-zlm-image-container 
sudo docker rm centos7-zlm-image-container
[test@localhost ~]$ sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=bind,src=/opt/bind,dst=/home/bind centos7-zlm-image /bin/bash
bb9c7a1a48ee44462449bddb32749e4cbd4a9a675d26dcc600db2999820479e0
[test@localhost ~]$ sudo docker exec -it centos7-zlm-image-container /bin/bash
[root@bb9c7a1a48ee /]# cd home/bind/
[root@bb9c7a1a48ee bind]# touch hello.txt 
[root@bb9c7a1a48ee bind]# exit
exit
[test@localhost ~]$ ls /opt/bind/
hello.txt
[test@localhost ~]$ 
[test@localhost ~]$ sudo docker inspect centos7-zlm-image-container
[
    {
        ......
        "HostConfig": {
            "Binds": null,
            ...... 
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/opt/bind",
                    "Target": "/home/bind"
                }
            ],
            ......
        },
		......
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/bind",
                "Destination": "/home/bind",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        ......
    }
]
[test@localhost ~]$ 

3.4.bind mount 使用场景

(1)container共享宿主机配置文件,如docker将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。
(2)开发环境中build容器化。开发过程中将build过程container化,将宿主机上源代码目录bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结果写入另一个bind mount的目录中。
(3)监控服务container化。读取宿主机固定文件中的数据实现监控。

3.5.bind mount 注意事项

(1)-v 宿主机目录路径必须以/或~/开头,否则docker会将其当成是volume 而不是bind mount。
(2)如果宿主机上的目录不存在,docker会自动创建目录(多级的绝对路径好像不行)。
(3)如果容器中的目录不存在,docker会自动创建目录。
(4)如果容器中目录已有内容,那么docker会使用宿主机上目录的内容覆盖容器目录的内容。

4.tmpfs mount 持久化方案

4.1.tmpfs 简介

tmpfs mount只在Linux主机内存中持久化,是临时性的。当容器停止,tmpfs mount会被移除,通常用于临时存放敏感文件。
tmpfs mounts 可选选项:
–tmpfs-size: 挂载的tmpfs的字节数,默认不受限制
–tmpfs-mode: tmpfs的文件模式,例如700或1700.默认值为1777,这意味着任何用户都有写入权限
使用–tmpfs参数无法指定任何其他的可选项,并且不能用于Swarm Service(集群节点服务)。

4.2.tmpfs 特点

(1)只能在Linux主机内存中,不会持久化到磁盘。
(2)不支持多容器间共享。与卷和绑定装入不同,您无法tmpfs在容器之间共享装载。只有在Linux上运行Docker时才能使用此功能。

4.3.常用命令与实操

sudo docker run -itd --rm --name centos7-zlm-image-container --tmpfs /home/tmpfs centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name centos7-zlm-image-container --tmpfs /home/tmpfs:size=512M,mode=1777 centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=tmpfs,destination=/home/tmpfs,tmpfs-mode=1770 centos7-zlm-image /bin/bash
sudo docker stop centos7-zlm-image-container
[test@localhost ~]$ sudo docker run -itd --rm --name centos7-zlm-image-container --tmpfs /home/tmpfs centos7-zlm-image /bin/bash
[sudo] lianaipeng 的密码:
44521bf7c2ef4cf01b0b0b0e66d8f8ab9ef98cef3c0e45cf5477988e030332f8
[test@localhost ~]$ 
[test@localhost ~]$ sudo docker exec -it centos7-zlm-image-container /bin/bash
[root@44521bf7c2ef /]# ls /home/tmpfs/
[root@44521bf7c2ef /]# exit 
exit
[test@localhost ~]$ sudo docker inspect centos7-zlm-image-container
[
    {
        ......
        "HostConfig": {
            ......
            "Tmpfs": {
                "/home/tmpfs": ""
            },
            ......
        },
        ......
    }
]
[test@localhost ~]$ 

4.4.tmpfs 使用场景

Docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要访问这些敏感数据的container或者service时,docker会在宿主机上创建一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据安全。当容器停止运行时,则相应的tmpfs也从系统中删除。

5.mount 总结

–mount:由多个键值对组成,以逗号分隔,每个键=组由一个元组组成。
该type安装件,其可以是bind,volume,或 tmpfs。
将安装在容器中destination的路径作为挂载的值。可以指定为destination,dst或target。也支持source,src。

sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=volume,src=test-vol,dst=/home/volume centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=bind,src=/opt/bind,dst=/home/bind centos7-zlm-image /bin/bash
sudo docker run -itd --rm --name centos7-zlm-image-container --mount type=tmpfs,destination=/home/tmpfs,tmpfs-mode=1770 centos7-zlm-image /bin/bash

参考:
https://blog.csdn.net/qq_35995514/article/details/130994432
https://www.cnblogs.com/benjamin77/p/9513429.html文章来源地址https://www.toymoban.com/news/detail-525667.html

到了这里,关于docker学习(十)Docker 持久化存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker Swarm NFS 数据持久化存储

    可参考我前面的博客《基于 Linux 的 Docker Swarm 集群部署及应用》 本次实验: master :192.168.56.142 work1 :192.168.56.132 work2 :192.168.56.180 可参考我前面的博客《构建NFS-FTP文件共享存储》 本次实验: NFS IP :192.168.56.141 Shared Dir :/data/sharedir 3.1 通过 Volume 3.1.1 创建 Volume 1、创建 Do

    2024年02月04日
    浏览(42)
  • 使用docker安装部署elasticsearch,并持久化到容器卷

    1.拉取Elasticsearch Docker镜像 在终端中执行以下命令来从Docker Hub拉取特定版本(如8.2.0)的Elasticsearch镜像。请确保你的网络连接正常,并且Docker已经在你的机器上安装并正确配置。 2.创建挂载目录 执行以下命令在本地创建文件夹,用于持久化 Elasticsearch 的数据和配置。 如果上述文

    2024年04月08日
    浏览(48)
  • yapi容器化docker部署以及mongodb容器的持久化挂载异常问题

    通过docker形式部署yapi,需要准备一个mongodb,然后直接在一个空文件夹里写好Dockerfile,其中通过wget下载yapi的zip包。 基本按照这篇文章:https://www.modb.pro/db/149666 来处理即可 把mongodb的docker 跑起来, --auth 表示需要密码才能访问 注意 原文中启动mongo的容器是这样的 首先创建Mon

    2024年02月14日
    浏览(51)
  • Docker安装mysql&&使用Navicat远程连接mysql容器&&mysql容器的持久化测试

    文章主人公:帅哥BUG😎  文章路人: 路人 🤨  路人 😛 目录 一.安装mysql并配置文件 1.下载相关镜像 2.在宿主机中创建相关目录,用于挂载容器的相关数据 3.conf目录 4.data目录(创建mysql5.7容器) 二.使用Navicat远程连接mysql容器 1.ip addr 获取ip 2.点击连接选择MySql 3.输入ip,密码

    2024年02月03日
    浏览(48)
  • Docker Desktop使用宿主机Windows的配置文件持久化存储数据

    《微软官网Windows 上的 Docker 引擎帮助文档》 以Nginx为例 把Nginx的配置文件复制到Windows 注意:Windows的盘符是小写的,以及目录直接是用反斜杠的!(我掉这坑里好久!!!) 修改宿主机的nginx.conf配置文件 删除nginx容器 重启启动一个新的Nginx容器 访问localhost

    2024年02月09日
    浏览(52)
  • Docker学习路线5:在 Docker 中实现数据持久化

    Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离。默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失。为了解决这个问题并在容器生命周期内保留数据,Docker 提供了各种数据持久化方法。 Docker 卷 绑定挂载 Docker tmpfs

    2024年02月16日
    浏览(45)
  • 小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

    一、概述 Docker持久化是指将容器中的数据持久保存在主机上,以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的,它们的文件系统默认是易失的,这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是,在许多场景中,我们希望

    2024年02月14日
    浏览(37)
  • Docker 持久化

    为了能够保存(持久化)数据以及共享容器间的数据, Docker 提出了 Volume 的概念。简单来说, Volume 就是目录或者文件,它可以 绕过 默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 数据卷方式: 数据卷是一个特殊的文件或者目录,它将宿主机文件或

    2024年02月03日
    浏览(47)
  • Docker数据持久化

    在容器层的 UnionFS(联合文件系统)中对文件/目录的任何修改,无论是手工修改还是 容器在运行过程中的修改,在该容器丢失或被删除后这些修改将全部丢失。即这些修改是无 法保存下来的。若要保存下来这些修改,通常有两种方式: 定制镜像持久化:将这个修改过的容器

    2024年01月23日
    浏览(58)
  • docker的数据卷、docker数据持久化

    环境: centos7.9 docker version 20.10.14 本篇我们来介绍docker的数据卷,数据卷是用于实现docker数据的持久化。 使用docker过程中,我们需要持久化容器中产生的数据,以及容器与容器之间、容器与主机之前进行数据共享、备份等操作,这里就需要到容器的数据持久化管理。 docker的数

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包