• Docker系列教程05-Docker数据卷(Data Volume)学习


    引言

    在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。要想实现数据的持久化,需要将数据从宿主机挂载到容器中。目前Docker提供了三种方式将数据从宿主机挂载到容器中。

    • Volume

    普通数据卷,映射到/var/lib/docekr/volumes目录下。

    • bind mounts

    绑定数据卷,映射到宿主机指定路径下

    • tmpfs mounts

    临时卷,只存在于宿主机内存中

    三种方式的示意图如下所示:

    一、Volume的基本使用

    1、创建数据卷

    1、创建一个Volume
    [root@qll251 ~]# docker volume create for_nginx
    for_nginx
    
    2、查看所有数据卷
    [root@qll251 ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               for_nginx
    
    3、 查看指定数据卷详细信息
    [root@qll251 ~]# docker volume inspect for_nginx
    
    查看数据卷详细信息

    可以看到我们创建的for_nginx卷,保存在宿主机/var/lib/docekr/volumes/下;以后针对该Volume的写操作都会保存在/var/lib/docekr/volumes/for_nginx/_data下。

    2、挂载数据卷到容器

    创建nginx容器,并挂载 for_nginx 数据卷

    [root@qll251 ~]# docker run -itd -p 88:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx
    c2124dd81a36e7a798b95276215a59a63d4a5f7d34ccb2bc31889494304ade56
    

    mount参数后面跟的是键值对。source指定宿主机源文件位置。target指定数据卷在容器中的挂载位置。

    使用docker inspect查看容器挂载信息:

    红框标出的内容,相信您基本都能看懂,这里扩展一个小知识点:RW: true,表示读写。如果希望数据卷对某个容器来说是只读的,可以通过添加readonly选项来实现,代码示例如下:

    docker run -itd --mount source=for_nginx,target=/test,readonly nginx
    

    3、修改nginx主页内容

    [root@qll251 ~]# cd /var/lib/docker/volumes/
    [root@qll251 volumes]# cd for_nginx/_data/
    [root@qll251 _data]# ls
    50x.html  index.html
    [root@qll251 _data]# echo "Hello world" > index.html
    

    4、测试访问nginx主页

    5、验证数据卷的持久化

    1、强制删除nginx容器
    [root@qll251 ~]# docker rm -f c2
    c2
    
    2、容器被删除,数据卷仍然存在
    [root@qll251 ~]# cd /var/lib/docker/volumes/for_nginx/
    [root@qll251 for_nginx]# more _data/index.html
    Hello world
    

    由此可以验证,容器卷与容器的生命周期无关,在删除容器时,docker不会自动删除卷,即使用Volume可以实现数据的持久化保存。

    6、清理卷

    如果不再使用本地容器卷,那么可以手动清理掉

    [root@qll251 ~]# docker volume rm for_nginx
    

    二、bind mounts 的基本使用

    1、 使用卷创建容器

    运行一个nginx容器,并将宿主机/webapp目录挂载至容器/usr/share/nginx/html目录:

    [root@qll251 ~]# docker run -itd -p 81:80 --mount type=bind,source=/webapp,target=/usr/share/nginx/html nginx
    690e779843933f735cf9044d7fd159a72ce6dcb833da61a010df58b0122b074e
    

    上述命令等同于使用旧的-v参数,代码如下:

    docker run -itd -p 81:80 -v /webapp:/usr/share/nginx/html nginx
    

    2、验证挂载情况

    3、进入容器

    [root@qll251 ~]# docker exec -it 690 /bin/bash
    root@690e77984393:/# cd /usr/share/nginx/html/
    root@690e77984393:/usr/share/nginx/html# ls
    

    进入该容器,会发现容器该目录本身存在的文件消失不见了。原因如下:

    如果你使用Bind mounts挂载宿主机目录到一个容器中的非空目录,那么此容器中的非空目录中的文件会被隐藏,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式最大的不同

    三、tmpfs mounts 的使用

    tmpfs mountfs,顾名思义 是一种非持久化的数据存储。它仅仅将数据保存在宿主机的内存中,一旦容器停止运行,tmpfs mounts会被移除,从而造成数据丢失

    1、运行一个容器,并指定临时卷

    [root@qll251 ~]# docker run -itd --mount type=tmpfs,target=/test ubuntu:18.04
    fad68fbcdab580fad03db7fa1e4f40c4e694fb8a30dc292af38dc3efd556b140
    [root@qll251 ~]#
    

    2、在容器中写入数据

    [root@qll251 ~]# docker exec -it fa /bin/bash
    root@fad68fbcdab5:/# cd /test
    root@fad68fbcdab5:/test# echo 123123 > tmp.txt
    root@fad68fbcdab5:/test# cat tmp.txt
    123123
    

    3、重启容器,发现数据丢失

    [root@qll251 ~]# docker restart fa
    fa
    [root@qll251 ~]# docker exec -it fa /bin/bash
    root@fad68fbcdab5:/# cd /test
    root@fad68fbcdab5:/test# cat tmp.txt
    cat: tmp.txt: No such file or directory
    

    4、tmpfs mounts的使用场景

    当因为安全或其他原因,不希望将数据持久化到容器或宿主机上,那么可以使用tmpfs mounts模式。

    结语

    欢迎来到『开源Linux』,这里是 Linux 爱好者的聚集地。专注分享Linux/Unix相关内容(包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货)。风里雨里,我们在这里等您,期待与您相遇。

    十年磨一剑
  • 相关阅读:
    C#.net开发 List与DataTable相互转换
    asp.net 7.分页
    PostgreSQL 创建触发器 Trigger
    PostgreSQL 的命令行工具 psql 的常用命令
    安装SQL Server DQS 和 MDS
    Ubuntu ssh-keygen 生成公钥并添加到远程服务器上
    阿里云code基础文档
    忘记本地MySQL数据库密码的解决方法
    谷歌浏览器安装jsonview
    phpstorm汉化包
  • 原文地址:https://www.cnblogs.com/qinlulu/p/13204793.html
Copyright © 2020-2023  润新知