zoukankan      html  css  js  c++  java
  • Docker系统七:Docker数据管理

    Docker的数据管理

    I. 基本概念

    Docker容器一旦删除,其相关的rootf文件系统就会被删除,其容器内的数据将一并删除,为了保存相关数据,Docker提出了数据卷的概念。

    II. 数据卷

    Docker中与数据卷相关的参数:

    -v=[]; 创建数据卷
    --volumes-from; 数据卷容器
    

    1)创建数据卷

    -v 参数:
        
    * host-dir: 表示host上的目录,如果不存在,Docker会自动在Host上创建该目录;
    * container-dir:表示容器内部对应的目录,如果不存在,Docker会在容器内部创建此目录;
    * rw|ro :用于对控制卷的读写权限;
    

    不指定host-dir去创建一个数据卷:

    $docker run -it --rm -v /volume1 --name test1 ubuntu:14.04 /bin/bash
    $df -lf
    Filesystem      Size  Used Avail Use% Mounted on
    none             40G  4.9G   33G  14% /
    tmpfs           497M     0  497M   0% /dev
    tmpfs           497M     0  497M   0% /sys/fs/cgroup
    /dev/vda1        40G  4.9G   33G  14% /volume1
    shm              64M     0   64M   0% /dev/shm
    tmpfs           497M     0  497M   0% /sys/firmware
    
    $ls /volume1/
    $echo "volume1" > /volume1/test.ext
    $ls /volume1/
    test.txt
    

    通过查看发现Host的根分区被挂载到了容器的/volume1. 实际上Docker会在Host的/var/lib/docker/vfs/dir/(centos, 其他系统可能不同)目录中随机生成一个目录,然后挂载容器的/volume1;

    可以查看容器详细配置Mounts捉的Source:

    $docker inspect test1
    
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "5bf4ad339dad3c7fbecb0537c1a0a0065e70109beb4194475d1de153542b582b",
                    "Source": "/var/lib/docker/volumes/5bf4ad339dad3c7fbecb0537c1a0a0065e70109beb4194475d1de153542b582b/_data",
                    "Destination": "/volume1",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    

    这种方式创建的数据卷当没有基他容器依赖时,会随容器的删除而删除,同时对应的Host目录也会被删除,如查不想Host的目录被删除,需要启动时指定Host目录。

    2)挂载Host的目录做为数据卷

    $docker run -it --rm -v /data/volume1:/volume1 ubuntu:14.04 /bin/bash
    $df -lh
    tmpfs           497M     0  497M   0% /dev
    tmpfs           497M     0  497M   0% /sys/fs/cgroup
    /dev/vda1        40G  5.3G   32G  15% /volume1
    shm              64M     0   64M   0% /dev/shm
    tmpfs           497M     0  497M   0% /sys/firmware
    
    $ls /volume/
    $echo "hello"> /volume1/hello.txt
    $exit
    $ls /data/volume1/
    hello.txt
    $cat /data/volume1/hello.txt
    hello
    

    这样即使容器被删除,host内的目录仍然含有容器的相关数据文件,这种也是容器与Host进行数据交换的一种方式。实际上Docker内部是通过mount --bind来实现的。

    容器对挂载的数据据具有读写权限控制:如挂载目录为只读权限

    $docker run -it --rm -v /data/volume1:/volume1:ro ubuntu:14.04 /bin/bash
    $df -lh
    $touch /volume1/hello.txt
    touch: cannot touch 'test.text': Read-only file system
    

    3) 挂载Host的文件作为数据卷(此方法一般用于Host与容器间共享配置文件)

    • 通过挂载Host 的bash历史命令文件,在容器中查看Host的bash历史命令,当容器删除时,Host也能查看容器的执行命令历史
    docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu:14.04  /bin/bash
    
    • 同步Host与容器里的时区,挂载/etc/localtime到容器内部
    docker run -it --rm -v /etc/localtime:/ect/localtime ubuntu:14.04  /bin/bash
    

    III. 数据卷容器

    --volumes-from 参数用于数据卷有关的场景

    1) 创建和挂载数据卷

    • 创建一个dabdata的容器,其包含一个/dbdata的数据卷
    $docker run -d -v /dbdata  --name dbdata  training/postgres echo Data-only container for postgres
    
    • 通过--volumes-from在其他容器中挂载/dbdata的数据卷
    docker run -d --volumes-from dbdata --name db1 training/postgres
    docker run -d --volumes-from dbtata --name db2 training/postgres
    
    docker run -d --name db3 --volumes-from db1 training/postgres
    

    如此这样,db1和db2都能看到容器dbdata所有的数据卷(/dbdata)的内容,db3 是从其他已经挂载容器卷的容器挂载数据卷。

    当我们删除挂载数据卷的容器时,数据卷不会被删除,只能所有引用的容器被删除后,通过docker rm -v 显式删除数据卷。

    2)数据卷容器的使用

    使用数据卷进行多容器日志收集

    构建rsyslog镜像(使用Dockerfile)
    • Dockerfile 内容
    #forrsyslog
    FROM centos6
    MAINTAINER hustcat
    RUN yum -y install rsyslog && yum clean all
    
    CMD rsyslogd -n
    VOLUME /dev
    VOLUME /var/log
    
    • run Dockerfile
    docker build -t hustcat/rsyslog
    
    运行rsyslog容器
    docker run --name rsyslog -d -v /tmp/syslogdev:/devhustcat/rsyslog
    
    ls /tmp/syslogdev/log -lh
    
    从其他容器写log到日志容器
    docker run --rm -v /tmp/syslogdev/log:/dev/log centos6 logger -p info "hello rsyslog"
    

    附:专门处理容器日志的工具loggly

    IV. 备份、恢复和迁移数据卷

    1). 备份

    docker run --volumes-from dbdata -v ${pwd}:/backup ubuntu tar cvf /backup/backup.tar /dbdata
    
    • 创建一下新容器, 将Host本地目录挂载到/backup;
    • 将数据卷容器dbdata的数据卷/dbdata打包到/backup/backup.tar
    • 在Host的当前目录即可看到backup.tar

    2). 恢复

    将backup.tar的数据恢复到一个新的容器dbdata2中

    docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    docker run --volumes-from dbdata2 -v ${pwd}:/backup busybox tar xvf /backup/backup.tar
    
  • 相关阅读:
    Spark Streaming 调优指南
    Hive实战之Youtube数据集
    【源码解析】BlockManager详解
    Spark操作HBase问题:java.io.IOException: Non-increasing Bloom keys
    Spark实战之读写HBase
    ZooKeeper的简单理解
    Flume-ng源码解析之Source组件
    Flume-ng源码解析之Sink组件
    Flume-ng源码解析之Channel组件
    Flume-ng源码解析之启动流程
  • 原文地址:https://www.cnblogs.com/Terry-Wu/p/7461455.html
Copyright © 2011-2022 走看看