• 六、【Docker笔记】Docker数据管理


    前几节我们介绍了Docker的基本使用和三大核心概念,那么我们在使用Docker的过程中,Docker中必然产生了大量的数据,对于这些数据我们需要查看或者对这些数据进行一个备份,也有可能容器之间的数据需要进行共享,这些都涉及到了容器的数据管理操作。

    关于容器中管理数据Docker主要有两种方式:数据卷(Data Volumes)和数据卷管理(Data Volumes Dontainers)。

    一、数据卷

    数据卷是一个可供容器使用的特殊目录,它绕过了文件系统,可提供多种特性:

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新不会影响镜像
    • 卷会一直存在,直到没有容器使用为止

    1、在容器中创建数据卷

    在使用 docker run 命令运行镜像为容器时,可使用 -v 标记即在容器内创建一个数据卷,多次 -v 即可创建多个数据卷。

    # 创建一个 webapp 容器,并将一个数据卷挂载到 /webapp 目录下
    $ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
    $ sudo docker ps
    CONTAINER ID   IMAGE            COMMAND         CREATED        STATUS       PORTS                     NAMES
    d3426095a52b  training/webapp  "python app.py" 8 seconds ago  Up 7 seconds 0.0.0.0:32768->5000/tcp   web
    
    # 用浏览器访问 http://192.168.0.128:32768 (192.168.0.128为主机IP) 可看到浏览器打印一行 hello world!
    

    2、挂载主机目录为数据卷

    同样使用 -v 标记,也可以指定挂载一个本地已有的目录到容器中作为数据卷。推荐方式

    # 挂载一个本地主机目录为容器的数据卷
    $ sudo docker run -d -P --name web -v /opt/webapp(主机目录):/opt/webapp(容器目录) training/webapp python app.py
    

    这种挂载方式对功能的开发和测试非常方便,我们可以将自己的程序或数据放到一个主机目录中,之后创建为数据卷,哪怕主机目录不存在也没关系,Docker会自动帮助我们创建。当我们挂载之后,此时的数据卷权限为读写,我们可以通过 ro 将其指定为只读。

    $ sudo docker run -d -P --name web -v /opt/webapp:/opt/webapp:ro training/webapp python app.py
    

    3、挂载本地主机文件为数据卷

    -v 标记也可挂载一个本地主机文件作为数据卷。不推荐使用

    $ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
    

    二、数据卷容器

    当我们需要在多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器,数据卷容器也是一个普通的Docker容器,只是这个容器它专门用来提供数据卷以供其他容器挂载。

    # 0. 创建一个数据卷容器 dbdata,并创建一个数据卷挂载到 /dbdata
    $ sudo docker run -itd -v /dbdata --name dbdata ubuntu
    
    # 1. 查看容器的 /dbdata 目录
    root@xxx:/# ls
    bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    # 2. 在其他容器中挂载 dbdata 容器中的数据卷
    $ sudo docker run -itd --volumes-from dbdata --name db1 ubuntu
    $ sudo docker run -itd --volumes-from dbdata --name db2 ubuntu
    
    # 说明:即挂载成功,之后不管哪个容器修改了数据卷,其他容器都可即时查看。
    
    # 3. 在 dbdata 容器中创建 test.txt 文件
    $ sudo docker exec -ti fdcd9728f78e /bin/bash
    root@fdcd9728f78e:/# cd /dbdata/
    root@fdcd9728f78e:/dbdata# ll
    total 4
    drwxr-xr-x.  2 root root    6 Apr  9 12:38 ./
    drwxr-xr-x. 22 root root 4096 Apr  9 12:38 ../
    root@fdcd9728f78e:/dbdata# touch test.txt
    root@fdcd9728f78e:/dbdata# ls
    test.txt
    
    # 4. 在 db1 和 db2 容器中进行查看
    $ sudo docker exec -ti 0365f0f09a87 /bin/bash
    root@0365f0f09a87:/# cd /dbdata/
    root@0365f0f09a87:/dbdata# ls
    test.txt
    root@0365f0f09a87:/dbdata#
    
    # 5. 当前运行的三个容器ID
    $ sudo docker ps
    CONTAINER ID  IMAGE     COMMAND       CREATED         STATUS        PORTS      NAMES
    b57b6954e924  ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             db2
    0365f0f09a87  ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             db1
    fdcd9728f78e  ubuntu    "/bin/bash"   7 minutes ago   Up 7 minutes             dbdata
    

    在以上操作完成后,若我们此时删除容器,数据卷并不会被删除。若要删除数据卷,必须删除最后一个还挂载它的容器时显示的使用 docker rm -v 命令来指定同时删除关联的容器。

    三、利用数据卷容器迁移数据

    1、备份

    使用以下命令来备份 dbdata 数据卷容器内的数据卷:

    $ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
    

    2、恢复

    那么对备份的数据如何恢复,需要做两步走:

    # 0. 创建一个带有数据卷的容器 dbdata2
    $ sudo docker run -itd -v /dbdata --name dbdata2 ubuntu /bin/bash
    
    # 1. 创建另一个新的容器,挂载 dbdata2 的容器,并使用 untar 解压备份文件到所挂载的容器卷中
    $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
    

    欢迎志同道合朋友,加QQ群:119126035,QQ:1415583094,微信:cq1415583094
    我的GitHub:https://github.com/cq1415583094
    公众号欢迎关注

  • 相关阅读:
    [换根dp] Codeforces Round 67 (Rated for Div. 2) E
    [思维]Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A B1 B2 C D
    [Comet OJ
    关于Winform中的消息框MessageBox
    C#截取字符串的几种方式
    C#中的时间格式大全
    winform中dev的TreeList基本使用方式
    拉取项目时error setting certificate verify locations解决方式
    如何在GridView中新增按钮列
    使用GitHub/码云/Git个性化设置
  • 原文地址:https://www.cnblogs.com/chuanqi1415583094/p/12672861.html
Copyright © 2020-2023  润新知