zoukankan      html  css  js  c++  java
  • Docker 管理应用程序数据

    1、将Docker主机数据挂载到容器

    Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes , bind mounts 和tmpfs

    volumes:  Docker管理宿主机文件系统的一步分(/var/lib/docker/volumes)

    bind mounts:  可以存储在宿主机系统的任意位置

    tmpfs:  挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

    比如我们容器中启动了mysql数据库,这里我们可以把数据放在宿主机的某一个目录下,这样即使我们删除了mysql这台容器,也不会让我们的数据丢失,docker提供了上面三种数据卷的方式来管理数据

     volume:

    1、创建数据卷

    创建的的数据卷的目录一定是在/var/lib/docker/volumes下的

    2、查看数据卷信息

    [root@node02 volumes]# docker volume ls  (罗列有哪些数据卷)
    DRIVER              VOLUME NAME
    local               1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
    local               1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
    local               20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
    local               2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
    local               76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
    local               7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
    local               a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
    local               adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
    local               d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
    local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
    local               nginx-vol
    [root@node02 volumes]# docker volume inspect nginx-vol (查看nginx-vol数据卷的详细信息,挂载在本地的/var/lib/docker/volumes/nginx-vol/_data位置)
    [
        {
            "CreatedAt": "2018-09-10T16:18:22+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", 数据存储目录
            "Name": "nginx-vol",
            "Options": {},
            "Scope": "local"
        }
    ]
    

      

    [root@node02 volumes]# docker container run -d -it -p 8800:80--name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx (使用nginx:latest镜像创建一个容器,容器名为nginx-vol-test,数据卷名称为nginx-vol,挂载容器的路径地址为/usr/share/nignx/html)
    2b3a8ab12600d4059b3623369a6e34dc8aa222b2a6dc0cbf5f821fa73f81aded
    [root@node02 volumes]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
    2b3a8ab12600        nginx               "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       80/tcp                          nginx-vol-test
    603494fada81        nginx:v1.7.9        "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          443/tcp, 0.0.0.0:8082->80/tcp   nginx8
    a63d1c647fc4        nginx:v1.7.9        "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          443/tcp, 0.0.0.0:8081->80/tcp   nginx7
    b2bd8d583859        nginx               "nginx -g 'daemon of…"   5 hours ago         Up 5 hours          0.0.0.0:8080->80/tcp            nginx5
    1ab0200029d7        busybox             "sh"                     6 hours ago         Up 6 hours                                          bs
    [root@node02 volumes]# 

    [root@node02 volumes]# docker exec -it nginx-vol-test sh
    # cd /usr/share/nginx/html
    # ls
    50x.html index.html
    # touch nginx-vol.html

    这样我们到宿主机的数据卷目录下看一下有没有nginx-vol.html文件

    [root@node02 _data]# pwd
    /var/lib/docker/volumes/nginx-vol/_data
    [root@node02 _data]# ll
    total 8
    -rw-r--r-- 1 root root 537 Apr 10 00:01 50x.html
    -rw-r--r-- 1 root root 612 Apr 10 00:01 index.html
    -rw-r--r-- 1 root root 0 Sep 10 16:30 nginx-vol.html

    我们发现是有的

    这样我们编写一下文件内容

    我们访问一下,发现是有的。这样我们现在做一个测试,我们把容器删除,看一下我们的数据卷上的文件还在不在

    [root@node02 _data]# docker ps -a -q(这个命令是为了展示所有的container id)
    50653a8fd0db
    2b3a8ab12600
    603494fada81
    a63d1c647fc4
    ea028db62306
    b2bd8d583859
    c754e6a5b7e8
    b3eb98a0d6b7
    18c2c16a209e
    82bb6b307f6e
    1ab0200029d7
    598ff14945ba
    f4b333719d2d
    1cb429220472
    c6e1684bf2c8
    11c00cc9a713
    0914dd1fa666
    16dfd95dc305
    815693a995c8
    4d3267b2340d
    7706db50eda8
    e415f74dc6bd
    ace56bc942aa
    879a515a576a
    909a5b87fee0
    
    这样我们根据id来删除所有的容器:
    [root@node02 _data]# docker rm -f $(docker ps -q -a)
    50653a8fd0db
    2b3a8ab12600
    603494fada81
    a63d1c647fc4
    ea028db62306
    b2bd8d583859
    c754e6a5b7e8
    b3eb98a0d6b7
    18c2c16a209e
    82bb6b307f6e
    1ab0200029d7
    598ff14945ba
    f4b333719d2d
    1cb429220472
    c6e1684bf2c8
    11c00cc9a713
    0914dd1fa666
    16dfd95dc305
    815693a995c8
    4d3267b2340d
    7706db50eda8
    e415f74dc6bd
    ace56bc942aa
    879a515a576a
    909a5b87fee0
    [root@node02 _data]# docker ps 
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@node02 _data]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@node02 _data]# 
    所有的容器都已经删除了:
    [root@node02 _data]# pwd
    /var/lib/docker/volumes/nginx-vol/_data
    [root@node02 _data]# ls
    50x.html  index.html  nginx-vol.html
    [root@node02 _data]# docker volume ls
    DRIVER              VOLUME NAME
    local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
    local               nginx-vol
    
    但是我们nginx-vol 这个数据卷还在,这样的话,我们再创建一个容器,指定数据卷路径为nginx-vol 的话,还是可以访问的
    
    [root@node02 volumes]# !1017
    docker container run -d -it -p 8800:80 --name=nginx-vol-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
    6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1
    我们在浏览器上输入:http://10.10.200.97:8800/nginx-vol.html还是可以出现我们的html页面,
    同时我么你可以多个镜像共用这一个数据卷的数据的,
    上面我们src 要是没有指定数据卷名称的话,这里他会自动创建一个匿名卷(一串字符串),也就是说这里分有名卷和匿名卷
    官方文档:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume


    我们可以使用以下命令来删除清理数据卷
    [root@node02 volumes]# docker volume ls
    DRIVER              VOLUME NAME
    local               1a22651fb87dd211bbd2156ce645225d6127edd00150bd879d20f5d9f3490762
    local               1b54af29a1eb19e7a359b44793b19c7b049801c4ffe475dac4f9cebfcc47cde4
    local               20e91019905da93898d6491de200f471f3251d9e2900263859fad9ef30989737
    local               2e1ac775ad2d475af68d9e78b94ecf0d0ef07b1031a77fc90704020de4a9f54f
    local               76052c2502fae1f858c28a6be02c4f3982d320ec3bb3c77534f57bb2fe8da1c7
    local               7f397b7401f21a985c40376908dd8d8ebcf9a8d7c79093f23b2e718485f0032b
    local               a326fce6d638fc2d8971f8b00880eea8c376c9e7bdd45ef323a8ea764939afee
    local               adb8cc97e3ac4d782d3098fdf828f6ca2d108153c4c8d437f02e939e101dbb99
    local               d93c61ffe74cfea942f6edaa42747506ffbec29feda846f9a93a22a1db79652e
    local               e14da5a9196841c146833cb8e71c8e0138257dd6d0601f267e91e91abdd3a8aa
    local               nginx-vol
    [root@node02 volumes]# docker volume rm nginx-vol
    Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
    [root@node02 volumes]# docker ps 
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    6fef45218a46        nginx               "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:8800->80/tcp   nginx-vol-test2
    [root@node02 volumes]# docker container stop nginx-vol-test2
    nginx-vol-test2
    [root@node02 volumes]# docker volume rm nginx-vol
    Error response from daemon: unable to remove volume: remove nginx-vol: volume is in use - [6fef45218a46e6bf1304113c6899a9baea9ebdbbc629059488e76ea111d252f1]
    [root@node02 volumes]# docker container rm nginx-test
    Error: No such container: nginx-test
    [root@node02 volumes]# docker container rm nginx-vol-test2
    nginx-vol-test2
    [root@node02 volumes]# docker volume rm nginx-vol
    nginx-vol
    
    删除数据倦怠额时候,这里我们一定要保证没有容器使用,所以这里我么得先停了使用这个数据卷的容器,然后删除这个容器(这一步没有想明白),最后才可以删除数据卷

    Bind Mounts:

    这个就是绑定宿主机中本身就存在的一个目录,然后挂载到容器中(不需要想之前volume一样去创建数据卷什么的,bind mounts方式是宿主机本身就存在的目录)

    用卷创建一个容器:
    # docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
    # docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
    验证绑定:
    # docker inspect nginx-test
    清理:
    # docker container stop nginx-test
    # docker container rm nginx-test
    注意:
    1. 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
    2. 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
    官方文档: https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount
    总结:

    Volume 特点:
      多个容器之前共享数据

      当容器停止或者移除的时候,该卷还是存在的、

      多个容器可以同时挂载相同的数据卷

      当明确删除数据卷的时候,卷才会被删除(保证无容器使用情况下才可操作)

      将容器的数据存储到远程主机或者其他的存储上

      将数据从一台Docker主机迁移到另外一台的时候,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

    Bind Mountst特点:

      从主机共享配置文件到容器,默认情况下,挂载主机的/etc/resolv.conf到每一个容器,提供DNS解析

      在Docker主机上的开发环境和容器之间共享源代码,例如,可以将Maven target 目录挂载到容器中,每次Docker主机上构建Maven项目的时候,容器都可以访问构建的额项目包

      当Docker主机的文件或者目录结构保证和容器所需要的绑定挂载一致的时候

     博客总结来源于:http://edu.51cto.com/course/10659.html

  • 相关阅读:
    【bzoj2280】[Poi2011]Plot 二分+倍增+二分+最小圆覆盖
    【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法
    【bzoj4999】This Problem Is Too Simple! 树链剖分+动态开点线段树
    【bzoj3435】[Wc2014]紫荆花之恋 替罪点分树套SBT
    【bzoj3217】ALOEXT 替罪羊树套Trie树
    【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
    【bzoj4012】[HNOI2015]开店 动态点分治+STL-vector
    【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治
    【bzoj1095】[ZJOI2007]Hide 捉迷藏 动态点分治+堆
    【bzoj3329】Xorequ 数位dp+矩阵乘法
  • 原文地址:https://www.cnblogs.com/smail-bao/p/9621322.html
Copyright © 2011-2022 走看看