您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:在容器中处理数据,Docker学习笔记

新葡亰496net:在容器中处理数据,Docker学习笔记

发布时间:2019-07-05 12:48编辑:奥门新萄京娱乐场浏览(115)

    (1)Docker 安装及基本用法

    Docker Volume是啥? & Docker Volume作用?

    想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

    为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

    Volume指令用来向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化功能。

           数据卷可以在容器之间共享和重用

           一个容器可以不是必须和其他容器共享卷

           对数据卷的修改会立马生效

           对数据卷的更新,不会影响镜像

           数据卷默认会一直存在,即使容器删除

           类似于Linux下对目录或文件进行的mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示的是挂载的数据卷

    卷功能可以让我们将数据(如源代码)、数据库、或者其他内容添加到镜像中*而不是*将这些内容提交到镜像中,并且允许我们在多个容器间共享这些内容。

    我们可以利用此功能来测试容器内部的应用程序代码,管理日志,或者处理容器内部的数据库

     

    volume的创建

    (2)Docker 镜像

    Docker Volume原理

    Docker的数据的本质是容器中一个特殊的文件或目录(挂载点)。在容器的创建过程中,这个挂载点会被 挂载一个宿主机上的指定的目录 (一个以volumeID为名称的目录 或者指定的宿主机目录)。

    例1: docker run -v /data busybox /bin/sh

    //将宿主机上的volume_id目录绑定挂载到rootfs中指定的挂载点/data上 mount("/var/lib/docker/vfs/dir/volume_id","rootfs/data","none",MS_BIND,NULL);

    例2: docker run -v /var/log:/data busybox /bin/bash

    //将宿主机上的/var/log目录绑定挂载到rootfs中指定的挂载点/data上 mount("/var/log","rootfs/data","none",MS_BIND,NULL);

    以上两种挂载方法的区别除了挂载的源目录不一样外,root/data目录下原来的文件在例1下是不存在的,但在例2下是仍旧存在的。

    创建Volume

    volume的来源只有3种:即从容器挂载、从宿主机挂载和从他容器共享。内部通过Mount对象来维护逻辑。

    删除Volume

    如果删除容器时带有-v标签或是这个容器运行时带有一个--rm标签,删除容器时会尝试删除这个容器所使用的volum。在将自己从volume的Container列表中删除后,判断volume的Container的列表是否为空,如果这个volume不被任务容器使用,则将这个volume删除 ,然后做以下两件事:

    删除这个volume对应的配置文件;

    如果这个volume是从容器挂载的,所以只需要删除宿主机上对应的volume_id文件夹。

    volume的相关配置文件

    Docker的每个容器在docker/containers文件夹下有一个以容器ID命名的子文件夹,这个子文件夹中的config.json文件是这个容器的配置文件,可以从中看到这个容器所使用的volume ID以及它们的可写情况。 如果你要查看volume的具体信息,你可以在docker/volumes文件夹下找与volume id命名的子文件夹,这个子文件夹中的config.json文件包含了volume的具体信息。

    数据管理的两种方法

    为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念.简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上.

    (3)新葡亰496net,Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境

    Docker Volume原理

    挂载一个主机目录作为数据据卷

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

    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

    当然, 一次可以挂载多个数据卷。

    查看数据卷的具体信息,docker inspect web 查看volume字段信息。

    挂载一个本地主机文件作为数据卷

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

    数据卷容器

    首先, 创建一个名为dbdata的数据卷容器

    sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

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

    $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres

    $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

    可以使用超过一个的 --volumes-from 参数来指定从多个容器挂载不同的数据卷。 也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。

    $ sudo docker run -d --name db3 --volumes-from db1 training/postgres

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

    数据卷备份

    首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:

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

    容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。

    数据卷恢复

    如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。

    $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

    然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

    $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

    为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

    $ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata

    思考:

    1、列出Docker Volume的几个应用场景?

    2、这个Volume是不是一方修改会导致多方修改?那么安全性如何保证?

    3、比如工作时候,如果换了同事的宿主机的话,那是不是同事就运行不了这个容器内(需要此挂载)的应用了啊?

    • Data volumes
    • Data volume containers

    我们可以通过两种方式来初始化Volume,这两种方式有些细小而又重要的差别.我们可以在运行时使用-v来声明Volume:

    (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源

     

    [root@node1 volume]# docker run -it --name container-test -h CONTAINER -v /data busybox /bin/sh  
    / # 
    / # ls /data
    

    新葡亰496net:在容器中处理数据,Docker学习笔记4。(5)Docker 网络

    Data volumes

    上面的命令会将/data挂载到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录.任何在该镜像/data路径的文件的文件都会被复制到Volume.我们可以使用docker inspect命令找到Volume在主机上的存储位置:

    (6)若干企业生产环境中的容器网络方案


    $docker inspect container-test  
        "Mounts": [  
            {  
                "Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",  
                "Source": "/var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data",  
                "Destination": "/data",  
                "Driver": "local",  
                "Mode": "",  
                "RW": true  
            }  
        ],
    

    (7)Docker 存储 - AUFS

     

    这说明Docker把在/var/lib/docker下的某个目录挂载到了容器内的/data目录下.让我们从主机添加文件都此文件夹下:

    (8)Docker 存储 - Volume

    data volumes 对数据的持久化和分享提供一些很有用的特性。

    root@node1:~# touch /var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data/test-file
    

     

    • volumes 在容器创建的时候被初始化。
      • 如果容器依赖的镜像包含指定点的数据,
      • 则在新容器建立时将已经存在的数据复制到volumes在初始化volumes的时候
    • Data volumes 可以被分享,也可以在多个容器中重复 使用
    • 更改数据直接
    • 当你更新image时 data volumes 的更改将不会包含其中
    • data volumes 持久化在硬盘的,哪怕使用的 容器删除之后。

    进入容器

    1. Docker volume 的几种形态

        有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。

     

    root@node1:~# docker exec -it  container-test /bin/sh  
    root@CONTAINER:/# ls /data/  
    test-file
    

    1.1 无 - 不使用 Docker volume

    默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。

    增加数据卷

    只要将主机的目录挂载到容器的目录上,那改变就会立即生效.我们可以在Dockerfile中通过使用VOLUME指令来达到相同的目的:

    1.2 Data volume (数据卷)

    一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:

    (1)使用 “-v 容器内目录” 形式

    docker run -d -P --name web -v /webapp training/webapp python app.py
    

    使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 webapp 目录了:

    "Mounts": [
                {
                    "Name": "f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b",
                    "Source": "/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data",
                    "Destination": "/webapp",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    

    其实,在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。

    (2)使用 -v 来挂载一个主机上的目录到容器的目录

    docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py
    

    主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。

    其实这种形式和第一种没有本质的区别,容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标。

    (3)使用 -v 来挂载主机上的一个文件到容器内的一个文件

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

     

    FROM ubunut VOLUME /data

    1.3 使用 data container

    如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:

    创建一个 data container:

    docker create -v /dbdata --name dbstore training/webapp  /bin/true
    

    启动一个 app container:

    docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py
    

    其实,对 web3 这个容器来说,volume 的本质没变,它只是将 dbstore 容器的 /dbdata 目录映射的主机上的目录映射到自身的 /dbdata 目录。

    "Mounts": [
                {
                    "Name": "5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330",
                    "Source": "/var/lib/docker/volumes/5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330/_data",
                    "Destination": "/dbdata",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    

    但是,其好处是,可以不管其目录的临时性而不断地重复使用它。

    -v

    但是还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录.例如:
    (冒号前面是主机的目录 : 冒号后面是docker容器的目录)

    1.4 使用 docker volume 命令

    Docker 新版本中引入了 docker volume 命令来管理 Docker volume。

    (1)使用默认的 ‘local’ driver 创建一个 volume

    root@docker1:/home/sammy# docker volume create --name vol1
    vol1
    root@docker1:/home/sammy# docker volume inspect vol1
    [
        {
            "Name": "vol1",
            "Driver": "local",
            "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
            "Labels": {},
            "Scope": "local"
        }
    ]
    

    (2)使用这个 volume

    docker run -d -P --name web4 -v vol1:/volume training/webapp python app.p
    

    结果还是一样的,即将 vol1 对应的主机上的目录挂载给容器内的 /volume 目录。

    "Mounts": [
                {
                    "Name": "vol1",
                    "Source": "/var/lib/docker/volumes/vol1/_data",
                    "Destination": "/volume",
                    "Driver": "local",
                    "Mode": "z",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],
    
    • docker create 和 docker run 命令一起使用
    • 可以多次使用,来挂载多个数据卷。

    root@node1:~# docker run -v /data/mysql:/data/mysql busybox

    1.5 Volume 删除和孤单 volume 清理

     

    新葡亰496net:在容器中处理数据,Docker学习笔记4。该命令将挂载主机的/data/mysql目录到容器内的/data目录上.任何在/data/mysql目录下的文件都会出现在容器内.这对于在主机和容器之间共享文件是非常有用的,例如挂载需要编译的源代码.为了保证可移植性,挂载主机目录不需要从Dockerfile指定.当使用-v参数时,镜像目录下的任何文件都不会被复制到Volume中.

    1.5.1 在删除容器时删除 volume

    可以使用 docker rm -v 命令在删除容器时删除该容器的卷。

    root@docker1:/home/sammy# docker run -d -P --name web5 -v /webapp training/webapp python app.py
    69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
    root@docker1:/home/sammy# docker volume ls
    DRIVER              VOLUME NAME
    local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
    local               838f4dd99721a9445be22a6b42d35e04cb43ad145ecf26107a9025f428587f76
    local               vol1
    root@docker1:/home/sammy# docker rm -vf web5
    web5
    root@docker1:/home/sammy# docker volume ls
    DRIVER              VOLUME NAME
    local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
    local               vol1
    

    挂载单个数据卷

    数据共享
    如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run

    1.5.2 批量删除孤单 volumes

    从上面的介绍可以看出,使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理:

    root@docker1:/home/sammy# docker volume ls -qf dangling=true
    244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
    c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
    f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
    root@docker1:/home/sammy# docker volume rm $(docker volume ls -qf dangling=true)
    244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
    c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
    f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
    root@docker1:/home/sammy# docker volume ls
    DRIVER              VOLUME NAME
    local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
    local               vol1
    

    github 上有很多脚本可以自动化地清理孤单卷,比如:

    •  

    1.6 小结

    对以上内容的两点小结:

    • 容器内的数据是临时性的,它会随着容器生命周期的结束而消失
    • 默认的 Docker volume (driver = ‘loclal’)不管是哪种形式,本质上都是将容器所在的主机上的一个目录 mount 到容器内的一个目录,因此,它不具备可移植性。
    zane@zane-V:~$ docker run -d -P --name web -v /webapp training/webapp python app.py
    8a1626618e6ad963e18021a42847034196686745b202395d0412e35beb85976d
    
    root@node1:~# docker run -it -h NEWCONTAINER --volumes-from container-test busybox /bin/bash  
    root@NEWCONTAINER:/# ls /data/  
    test-file
    

    2. Flocker:容器的分布式存储平台

    第一部分提到过,原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。先来看看 Flocker volume 和 Docker 原生 volume 的对比:

    新葡亰496net 1

    启动一个使用 Flocker 卷的容器:

    docker run --volume-driver flocker -v flocker-volume:/container/dir --name=container-xyz
    

    它带来的好处包括:

    • 容器的数据会被写入 Flocker 后端存储而不是主机上,因此,在主机出现故障时可以保证数据不丢失
    • 在容器迁移时,Flocker 会自动地将卷从一个 host 移植到另一个 host

    Flocker 的结构:

    新葡亰496net 2

     

    值得注意的是,就算你这个时候把container-test停止了,它仍然会起作用.只要有容器连接Volume,他就不会被删除,如果这个时候你执行:

     

    这会在容器里创建一个新数据卷 /webapp

    root@node1:~# docker rm container-test  
    Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f  
    Error: failed to remove containers: [container-test]
    

     

    数据容器
    通常使用数据容器来持久化数据库和数据文件。

    当然也可以在Dockerfile中添加一个或多个新的数据卷。

    $ docker run --name dbdata mysql echo "data only"

     

    创建了一个名为dbdata的数据容器,运行完echo之后就停止了。数据容器是不需要运行的,只要创建好了就可以了。

    定位数据卷

    $ docker run -d --volumes-from dbdata --name db1 mysql

     

    启动一个数据库服务容器,连接到dbdata数据容器上。

    使用docker inspect 命令在本机中定位数据卷

    注意:

     

    数据容器不需运行,纯粹是在浪费资源
    不需为数据容器单独使用一个小的镜像,直接使用数据库镜像本身就可以了
    删除Volumes
    这个功能太重要了,如果你已经使用docker run来删除你的容器,那可能会有很多孤立的Volume仍在占用着空间.

    $ docker inspect web
    .....
       "Mounts": [
                {
                    "Name": "c72823cb4542875fdb1103362dc3b743c87057bfdfe29a7cf66af65f73d16d07",
                    "Source": "/var/lib/docker/volumes/c72823cb4542875fdb1103362dc3b743c87057bfdfe29a7cf66af65f73d16d07/_data",
                    "Destination": "/webapp",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    .....
    

    Voulume可以被删除的条件:
    1.该容器可以用docker rm -v来删除且没有其他容器连接到该Volume(以及主机目录是也没被指定为Volume).注意,-v是必不可少的.
    2.docker run中使用rm参数.

    source:指定了在本机中的位置

    数据备份
    如果要备份mysql数据库,我们需要备份数据容器中的/var/lib/mysql文件夹。

    destination:指定了在容器中的位置

    $ docker run --rm --volumes-from dbdata -v $(pwd):/backup ubuntu tar zcvf /backup/mysql.tar.gz /var/lib/mysql
    此时就会在当前目录下生成一个mysql.tar.gz文件。

    RW:数据卷是否具有读写权限

     

    挂载本地目录作为数据卷

    zane@zane-V:~$  docker run -d -P --name webb -v /src/webapp:/webapp training/webapp python app.py
    3b34d9907b5bae0e5e038b11b6e1f62e6579df5d11aeb850df7907f309f0c060
    

    挂载本地目录/src/webapp 到容器中的 /webapp,如果容器中的/webapp已经存在,则覆盖,但是不会删除/webapp中原有的数据。这个与Linux mount 命令的行为一致。

     

    注意: 本地目录以及容器内的目录 都要求是 绝对路径。

     

    默认权限是可以读写的

    当然也可以指定read-only 权限

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

     

    挂一个共享存储卷作为一个数据卷

    一些Docker volume 插件允许,挂载共享存储例如 iscsi ,NFS, FC。

    使用共享存储的一个好处就是,他们与主机无关。也就是说,

    只要有访问共享存储且已经安装插件,就可以在容器启动的任何主机上使用该共享卷。

     

    通过docker run 命名使用 卷驱动。卷驱动 通过名称 创建 卷,而不是像其他例子一样使用目录。

     

    下面的例子使用 flocker(是一个多主机便携式卷) 卷驱动,创建一个叫 my-named-volume 卷。

    并使用在 容器的 /webapp 目录中。在使用命令之前需要先安装flocker ,如果不想安装则可以使用

    local 替代 flocker 。从而使用本地的 local 驱动。

    zane@zane-V:~$ docker run  -d -P --volume-driver=local -v my-named-volume:/webapp --name weeb training/webapp python app.py
    99736975af3d8c2f6224b957ac24ef6ff4a833cb6bd56b64678858c01ba2463a
    

     

    当然也可以使用docker volume create 命令创建一个 volume 在它被容器使用之前。

    $ docker volume create -d flocker --opt o=size=20GB my-named-volume
    $ docker run -d -P  -v my-named-volume:/webapp  --name web training/webapp python app.py
    

     

    挂载一个主机文件作为数据卷

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

     

    Create Data Volume Container


     

    如果你想和其他的容器分享已经持久化的数据或者想从其他非持久化的容器中使用。

    最好的方式就是创建一个命名的数据卷容器,然后从这里挂载数据。

     

    创建一个共享数据卷的命名的容器

    zane@zane-V:~$ docker create -v /dbdata --name dbstore training/postgres /bin/true
    603ccc61bb00ef29943a76ce3bc8da7694482f49f0a62a282743a39aa81e592a
    

     

    然后可以使用 --volumes-from 这个参数去挂载 /dbdata 数据卷 在其他的容器中使用。

    注意: 使用的名称是 上面创建的容器的名称,实际使用的数据卷 是 /dbdata

    zane@zane-V:~$ docker run -d --volumes-from dbstore --name db1 training/postgres
    1532719b9bc2bb0a2b0570077e7e8d03cdd6feddb84d406901548163fe15a953
    
    zane@zane-V:~$ docker run -d --volumes-from dbstore --name db2 training/postgres
    1ca6bbde65d12f7bbb40ad0854bff346bfad56e374775d08f8583c9913c9240e
    

    这case 就像 dbstore 是主,db1,db2是从。但是都是可写的。

    当然也支持联级,就是继续把db1 为主 往下发展从。

    zane@zane-V:~$ docker run -d --name db3 --volumes-from db1 training/postgres
    5a1bebcc03c4c945197eb717f4e7575cd0ad4fefdb33df1c4d033dacf8517d56
    

     

    当你删除了容器如上面的 dbstore,db1 ,db2 是不会删除数据卷的。

    要删除数据卷使用明确的命令 docker rm -v 

     

    备份恢复迁移数据卷

     

    备份

    $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu && tar cvf /backup/backup.tar /dbdata
    

     

    --rm :如果容器已经存在则删除

    --volumes-from :指定使用哪个数据源

    -v : 数据卷源具体挂载 这个容器的 /backup 目录

    Ubuntu:image

    tar:将这个刚刚挂载的目录 备份。

     

    恢复

     

    $ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
    
    Then un-tar the backup file in the new container`s data volume.
    
    $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
    
    You can use the techniques above to automate backup, migration and restore testing using your preferred tools.
    

     

    删除 数据卷

    使用:

    docker run  --rm 

     

    总结


      • Data volumes
        • 特性
          • volumes 在容器创建的时候被初始化
          • Data volumes 可以被分享
          • data volumes 持久化在硬盘的,哪怕使用的 容器删除之后
        • 操作
          • 增加数据卷
            • -v 
              • docker run -d -P --name web -v /webapp training/webapp python app.py
          • 定位数据卷
            • docker inspect
          • 挂载一个共享存储卷作为数据卷
      • Create Data volume container
        • 主从库,从库以主库数据卷为基础,创建自己的数据卷
          • docker create -v /dbdata --name dbstore training/postgres /bin/true
          • docker run -d --volumes-from dbstore --name db1 training/postgres
      • 备份恢复迁移数据卷
        • $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu && tar cvf /backup/backup.tar /dbdata
          • --rm :如果容器已经存在则删除
          • --volumes-from :指定使用哪个数据源
          • -v : 数据卷源具体挂载 这个容器的 /backup 目录
          • Ubuntu:image
          • tar:将这个刚刚挂载的目录 备份。

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:在容器中处理数据,Docker学习笔记

    关键词:

上一篇:pyntho经典面试题,Python基础面试题库

下一篇:没有了