zoukankan      html  css  js  c++  java
  • Docker-容器数据卷

    1.1 什么是容器数据卷

    1、容器数据卷产生前提

    • 将应用和运行的环境打包形成容器运行,运行结果可以伴随着容器,对于数据的要求,我们是希望能够持久化的,假设说你安装一个redis,如果把容器删了,就相当于删库跑路,出现以上的问题,我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!
    • 为了能保存数据在Docker中就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

    2、数据卷基本作用

    数据卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

    3、数据卷基本特点

    • 数据卷可在容器之间共享或重用数据,卷中的更改可以直接生效。
    • 数据卷中的更改不会包含在镜像的更新中。
    • 数据卷的生命周期一直持续到没有容器使用它为止。

    总结: 就是容器的持久化,以及容器间的继承和数据共享!!!

    1.2 使用数据卷

    方式一:直接使用命令挂载 -v

    1、基本语法

    docker run -it -v 主机目录:容器内目录 镜像名
    

    2、测试容器和宿主机之间数据共享:在容器中,创建的会在宿主机中看到!

    docker run -it -v /home/test:/home centos:7 /bin/bash
    


    3、查看数据卷是否挂载成功: docker inspect 容器id

    docker inspect 0fd75c2bddab
    

    4、测试容器停止退出后,主机修改数据是否会同步?

    • 停止容器。
    • 在宿主机上修改文件,增加些内容。
    • 启动刚才停止的容器。
    • 然后查看对应的文件,发现数据依旧同步。

    1.3 匿名和具名挂载

    1.3.1 匿名卷挂载

    1、基本语法-v 容器内路径

    docker run -d -P --name nginx01 -v /etc/nginx nginx
    

    2、查看卷命令docker volume ls匿名挂载的缺点,就是不好维护

    1.3.2 具名卷挂载

    1、基本语法: -v 卷名:/容器内路径

    docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
    

    2、查看数据卷名

    docker volume ls
    

    3、查看挂载路径

    4、总结

    所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/????/_data

    通过具名挂载可以方便的找到自己的数据卷,大多数情况在使用的是具名挂载

    ## 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!!
    -v 容器内路径 #匿名挂载
    -v 卷名:容器内路径 #具名挂载
    -v /宿主机路径::容器内路径 #指定路径挂载!!
    

    1.3.3 拓展卷挂载

    1、通过 -v容器内路径, ro rw改变读写权限。

    ro:  readonly #只读操作
    rw:  readwrite # 可读可写
    

    2、一旦这个设置了容器权限,容器对挂载出来的内容就有限定了

    docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
    docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
    

    注意:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

    1.4 Docker File初体验

    DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。

    1、在宿主机 /home 目录下新建一个 docker-test-volume文件夹。

    mkdir docker-test-volume
    

    2、进入docker-test-volume创建dockerfile1

    [root@Linux docker-test-volume]# vim dockerfile1
    [root@Linux docker-test-volume]# cat dockerfile1 
    FROM centos
    # 匿名挂载
    VOLUME ["/dockerVolume1", "/dockerVolume2"]
    CMD echo "-------end------"
    CMD /bin/bash
    [root@Linux docker-test-volume]# 
    

    3、build后生成镜像,获得一个新镜像 guardwhy/centos:7

    docker build -f dockerfile1 -t guardwhy/centos:7 . 
    

    4、查看生成的镜像

    [root@Linux docker-test-volume]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    guardwhy/centos     latest              086cf1afb24c        5 minutes ago       209MB
    centos              latest              300e315adb2f        6 months ago        209MB
    

    5、启动容器

     docker run -it 086cf1afb24c /bin/bash
    

    6、在数据卷中新建一个spring.java文件

    [root@6c0b413d6544 /]# ls
    bin  dockerVolume1  etc   lib	 lost+found  mnt  proc	run   srv  tmp	var
    dev  dockerVolume2  home  lib64  media	     opt  root	sbin  sys  usr
    [root@6c0b413d6544 /]# cd dockerVolume1
    [root@6c0b413d6544 dockerVolume1]# touch spring.java
    [root@6c0b413d6544 dockerVolume1]# ls -l
    total 0
    -rw-r--r--. 1 root root 0 Jun  9 16:36 spring.java
    [root@6c0b413d6544 dockerVolume1]# 
    

    6、在查看下这个容器的信息,查看卷挂载的路径。

    [   
        "Mounts": [
        {
        "Type": "volume",
        "Name": "e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22",
        "Source": "/var/lib/docker/volumes/e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22/_data",
        "Destination": "/dockerVolume1",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
        },
        {
        "Type": "volume",
        "Name": "e47420ec9c9fb494119e73eed85e96a8b60f2e66947d0b6cbdf131bf08758ead",
        "Source": "/var/lib/docker/volumes/e47420ec9c9fb494119e73eed85e96a8b60f2e66947d0b6cbdf131bf08758ead/_data",
        "Destination": "/dockerVolume2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
        }
        ],
    ]
    

    7、测试spring.java是否同步!!!

    执行命令,查看结果!!!

    cd /var/lib/docker/volumes/e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22/_data
    

    1.5 数据卷容器

    命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

    使用上一步的镜像:guardwhy/centos 为模板,运行容器 centOS01centOS02centOS03,这些容器都会具有容器卷。

    "/dockerVolume1"
    "/dockerVolume2"
    

    容器间传递共享,多个容器同步数据

    1、先启动一个父容器centOS01,然后在dockerVolume1新增文件。

    docker run -it  --name centOS01 guardwhy/centos
    

    退出容器不停止命令:ctrl+P+Q

    2、创建centOS02,让它继承(关键字: --volumes-from)centOS01 容器,然后在dockerVolume1新增文件spring.java,分别查看两个容器。

    docker run -it --name centOS02 --volumes-from centOS01 guardwhy/centos
    


    进入两个容器中,发现文件同步(实现文件共享)!!!

    2、创建centOS03,让它继承(关键字: --volumes-from)centOS01 容器,然后在dockerVolume1新增文件SpringMVC.java,分别查看这三个容器。

    docker run -it --name centOS03 --volumes-from centOS01 guardwhy/centos
    


    3、删除容器centOS1,查看其它容器还能否访问!!!

    4、小结

    容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止,但是一旦持久化到了本地,这个时候本地的数据是不会删除的!!!

  • 相关阅读:
    两台独立计算机共享一套键鼠
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第三天
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第二天
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第一天
    javac编译时报错 (错误: 编码GBK的不可映射字符)
    JavaWeb学习1-springMVC
    理学和工学的区别
    各种证书
    问题
    字符编码的理解
  • 原文地址:https://www.cnblogs.com/Guard9/p/14906578.html
Copyright © 2011-2022 走看看