zoukankan      html  css  js  c++  java
  • docker 实践四:数据管理

    这篇是关于 docker 的数据管理。

    注:环境为 CentOS7,docker 19.03。

    一般容器中管理数据主要有两种方式:

    • 数据卷(Data Volumes):容器内数据直接映射到本地主机环境。
    • 数据卷容器(Data Volume Containers):使用特定容器维护数据卷。

    主要来介绍如何创建数据卷,并且把本地的目录挂载到容器内,使用数据卷容器在容器和主机之间共享数据,并实现数据的备份和恢复。

    数据卷

    首先我们先来介绍下什么是数据卷:数据卷(Data Volume)是一个可供容器使用的特殊目录,是将主机操作系统目录直接映射进容器,类似于Linux的mount命令

    数据卷可以提供很多很用的特性:

    • 数据卷可以在容器之间共享和重⽤, 容器间传递数据将变得⾼效与⽅便;
    • 对数据卷内数据的修改会⽴马⽣效, ⽆论是容器内操作还是本地操作;
    • 对数据卷的更新不会影响镜像, 解耦开应⽤和数据;
    • 卷会⼀直存在, 直到没有容器使⽤, 可以安全地卸载它。

    创建数据卷

    创建数据卷使用命令 docker volume create:

    # docker volume create -d local test
    test
    # docker volume list
    DRIVER              VOLUME NAME
    local               9145a9036e96655189d81bd59c16181b1287de6c324cae08d4b5df32778926ff
    local               ac107675a30b3be115772d545130ddf1ba5fd27bfcb62f93a2a533ad4403b616
    local               d2760077757c8b9ef48f37a94032ed0f68a847e1fe0a6c84c16bcaba146fe25f
    local               test
    

    默认 volumes 的存放目录为 /var/lib/docker/volumes

    docker volume 支持以下的子命令:

    • create :创建数据卷
    • inspect :查看数据卷的详细信息,输出格式为 JSON
    • ls :列出所有数据卷
    • prune :删除无用的数据卷
    • rm :删除指定数据卷

    绑定数据卷

    除了使用 volume 子命令来创建管理数据卷外,还可以正在创建容器是指定本地的任意目录挂载到容器作为数据卷,这也称为绑定数据卷。

    在使用 docker [container] run 命令的时候,可以使用选项 --mount 来使用数据卷,它支持三种形式的数据卷:

    • volume: 普通数据卷, 映射到主机/var/lib/docker/volumes路径下,格式 type=bind,source=/path/on/host,destination=/path/in/container
    • bind: 绑定数据卷, 映射到主机指定路径下,格式 type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"
    • tmpfs: 临时数据卷, 只存在于内存中,格式 type=tmpfs,tmpfs-size=512M,destination=/path/in/container

    它们通用的选项有:

    • src, source:源路径
    • dst, destination, target:目标路径
    • ro, readonly:true or false (default),是否只读
    # mkdir /webapp
    # docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp ubuntu
    242a073a4f65aa3814c68147b7e3c5706834ac5a13b19d98d0b5c6ff5afa9c70
    

    该命令等同于 -v 格式的命令,所以上述的命令等价于:

    # docker run -d -P --name web -v /webapp:/opt/webapp ubuntu
    

    如果要只读挂载就成这样:

    # docker run -d -P --name web -v /webapp:/opt/webapp:ro ubuntu
    

    注:本地⽬录的路径必须是绝对路径, 容器内路径可以为相对路径。 如果⽬录不存在, Docker会⾃动创建。

    数据卷容器

    数据卷容器本身也是一个容器,它能为不同的容器提供数据卷,关键命令在于 docker run 的 --volumes-from 选项。

    首先创建一个数据卷容器 dbdata,并创建一个数据卷挂载到 /dbdata:

    # docker run -itd -v /dbdata --name dbdata ubuntu
    

    然后其他容器使用 --volumes-from 来挂载 dbdata 容器中的数据卷:

    # docker run -itd --volumes-from dbdata --name db1 ubuntu
    # docker run -itd --volumes-from dbdata --name db2 ubuntu
    

    此时,容器 db1 和 容器 db2 都挂载同一个数据卷

    选项 --volumes-from 也支持从多个容器挂载多个数据卷:

    # docker run -itd --name db3 --volumes-from db1 --volumes-from 8b41042720 ubuntu
    

    使⽤--volumes-from参数所挂载数据卷的容器⾃⾝并不需要保持在运⾏状态。如果删除了挂载的容器(包括dbdata、 db1和db2) , 数据卷并不会被⾃动删除。 如果要删除⼀个数据卷, 必须在删除最后⼀个还挂载着它的容器时显式使⽤docker rm-v命令来指定同时删除关联的容器。

    利用数据卷容器来迁移数据

    可以利用数据卷对其中的数据卷进行备份和恢复,从而实现数据迁移。

    备份

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

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

    相对复杂点,具体的步骤就是先创建一个 worker 容器,将本地目录挂载进去,使用 --volumes-from 挂载 dbdata 容器的数据卷。容器启动后使用 命令 tar -cvf /backup/backup.tar /dbdata 备份数据到挂载的目录下。选项 --rm 能保证容器执行完命令后自动删除。

    恢复

    如果要恢复到容器,下面的命令:

    # docker run -it --volumes-from dbdata -v $(pwd):/backup --name recover --rm  ubuntu tar -xvf /backup/backup.tar -C /dbdata
    
  • 相关阅读:
    (转载)自己实现spring
    重装mysql步骤
    华为过滤字符串(java)
    华为 去掉最大最小值
    Class.forName()数据库驱动
    线程中Join的使用例子
    基数排序的总结
    javaweb要点复习 jsp和servlet
    Qt实现360安全卫士10.0界面(编译时出现的一些问题)
    VS2010 添加资源文件后,出现 “LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”错误
  • 原文地址:https://www.cnblogs.com/xingyys/p/11397939.html
Copyright © 2011-2022 走看看