• Docker数据卷


    Docker数据卷

    容器数据卷

    docker容器数据卷是什么?

    当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

    通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

    特点
    1. 数据卷可以在容器之间共享或重用数据

    2. 数据卷中的更改可以直接生效

    3. 数据卷中的更改不会包含在镜像的更新中

    4. 数据卷的生命周期一直持续到没有容器使用它为止

    使用数据卷

    方法一:通过命令行挂载 -v

    docker run -it -v 主机目录:容器内目录
    
    docker run -it -v /home/test:/home centos /bin/bash
    
    docker inspect b9e99e8a5528	#在容器详细信息中看到mounts挂载信息
    "Mounts": [
        {
    		"Type": "bind",
    		"Source": "/home/test",
    		"Destination": "/home",
    		"Mode": "",
    		"RW": true,
    		"Propagation": "rprivate"
        }
    ],
    
    #容器内创建文件
    [root@b9e99e8a5528 home]# touch a.txt
    [root@b9e99e8a5528 home]# ls
    a.txt
    #挂载的目录中保持一致
    [root@pinked test]# ls
    a.txt
    

    Mysql数据持久化

    docker pull mysql:5.7
    docker run -d -p 9000:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    
    docker rm -f mysql01	#删除容器后,数据并不会消失
    

    匿名和具名挂载

    #匿名挂载, -v后只写了容器内的路径,不指定主机的路径
    docker run -d -P --name nginx01 -v /etc/nginx nginx
    #具名挂载,也不指定主机的路径
    docker run -d -P --name nginx02 -v named-nginx:/etc/nginx nginx
    #查看所有数据卷的情况
    docker volume ls	
    DRIVER              VOLUME NAME
    local               8a60bf491b5a15b6fd7377cf8ea5a75f33da280981c255abef8514ac39986317
    local               18fe0022467eb03f6877e905a63801d20c9384baaa8b14583f4c75d460f9def3
    local               688bfa670576a725fbb1286b6d3c9f8bfcbb94e89cce225d373861a8cdb21b3f
    local               a1d6fcbe9e667e4d2489ed100438be9d7a05b59a62e8da1cd7f41768241dbe49
    local               ad2f1d8fccf4dbc05a3034ead5832a10245b11dc2441566111bd629749e95489
    local               d2c6a93afb5ba497bb645389e0d7c9b7e29210b1a31a8637226577657336d05f
    local               d7307bdf0a4d308a15a71228706b03aa7028a3492d0dda5b281eb86a7a3c58f8
    local               efbffc284f8a8880c90bbed53b6d2dd37a2822c7bbe1a57dc042eadd17ded034
    local               named-nginx
    #查看挂载的目录
    docker volume inspect named-nginx 
    [
        {
            "CreatedAt": "2020-09-14T16:38:45+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/named-nginx/_data",
            "Name": "named-nginx",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    

    方法二:通过DockerFile添加

    #创建编写dockerfile文件
    vim dockerfile1
    
    #文件内容
    FORM centos
    VOLUME ["volume01","volume02"]
    CMD echo "----end----"
    CMD /bin/bash
    
    #运行脚本
    docker build -f dockerfile1 -t pinked/centos .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 0d120b6ccaa8
    Step 2/4 : VOLUME ["volume01","volume02"]
     ---> Running in 3bcba5970da7
    Removing intermediate container 3bcba5970da7
     ---> eb50b29c1307
    Step 3/4 : CMD echo "----end----"
     ---> Running in 1ccbaabea09d
    Removing intermediate container 1ccbaabea09d
     ---> 8a2624081206
    Step 4/4 : CMD /bin/bash
     ---> Running in ab98e07b11a5
    Removing intermediate container ab98e07b11a5
     ---> 8b902d6910f6
    Successfully built 8b902d6910f6
    Successfully tagged pinked/centos:latest
    
    #启动镜像
    docker run -it 8b902d6910f6 /bin/bash
    #镜像内会有自己挂载的目录
    ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
    
    #查看容器详细信息,找到挂载的主机目录
    docker inspect 4845b25f96fa
    

    数据卷容器

    测试
    #启动容器1,里面有自定义的挂载目录volume01	volume02
    docker run -it --name centos01 pinked/centos
    #启动容器2,里面也有自定义的挂载目录volume01	volume02
    docker run -it --name centos02 --volumes-from centos01 pinked/centos
    
    #容器2中新建文件
    [root@52dfe66f41d8 /]# cd volume01
    [root@52dfe66f41d8 volume01]# ls
    [root@52dfe66f41d8 volume01]# touch abc.java
    #容器1中也会看到文件
    [root@pinked docker-test-volume]# docker attach centos01
    [root@949a6c982e37 /]# cd volume01
    [root@949a6c982e37 volume01]# ls
    abc.java
    #启动容器3,之前建立的文件也在
    docker run -it --name centos03 --volumes-from centos01 pinked/centos
    [root@7d8e3c53a1d0 /]# cd volume01
    [root@7d8e3c53a1d0 volume01]# ls
    abc.java
    #删除容器1后,挂载的文件仍然存在
    docker rm -f centos01
    
    多个mysql数据共享
    #容器1
    docker run -d -P -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    #容器2
    docker run -d -P -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 --name mysql02 mysql:5.7
    
  • 相关阅读:
    Linux内核之数据双链表
    程序员必读:Linux内存管理剖析
    大型网站系统架构演化之路
    高流量站点NGINX与PHP-fpm配置优化
    LVS负载均衡集群服务搭建详解(二)
    LVS负载均衡集群服务搭建详解(一)
    安装 openSUSE Leap 42.1 之后要做的 8 件事
    【Linux基础】VI命令模式下删除拷贝与粘贴
    【Linux基础】VI命令模式下大小写转换
    【Linux基础】VI 编辑器基本使用方法
  • 原文地址:https://www.cnblogs.com/pinked/p/13697025.html
Copyright © 2020-2023  润新知