zoukankan      html  css  js  c++  java
  • docker数据管理

    用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。

    Docker提供三种方式将数据从宿主机挂载到容器中:
    •volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
    •bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
    •tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

    volumes

    创建数据卷

    [root@localhost ~]# docker volume create nginx-vol
    nginx-vol
    [root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/
    _data

    查看数据卷信息

    [root@localhost ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               nginx-vol

    查看数据卷的详细信息

    [root@localhost ~]# docker volume inspect nginx-vol
    [
        {
            "CreatedAt": "2018-11-20T15:58:54+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
            "Name": "nginx-vol",
            "Options": {},
            "Scope": "local"
        }
    ]

    使用已有镜像创建容器,并挂载数据卷到容器里的路径/usr/share/nginx/html

    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              62f816a209e6        13 days ago         109MB
    [root@localhost ~]# docker run -itd -p 80:80 --name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
    f96f73d2688f398d5efeb3f466769fc9b11318a81248f263fabdaf63cb37a635
    [root@localhost ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    f96f73d2688f        nginx               "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       0.0.0.0:80->80/tcp   nginx-vol-test

    在数据卷目录准备一个测试页

    [root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
    50x.html  index.html
    [root@localhost ~]# echo "volume test111" > /var/lib/docker/volumes/nginx-vol/_data/test.html
    [root@localhost ~]# cat /var/lib/docker/volumes/nginx-vol/_data/test.html
    volume test111

    访问容器

    删除容器后数据卷里数据还在,这样的话再创建容器的时候指定数据卷路径还是可以访问

    [root@localhost ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    f96f73d2688f nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp nginx-vol-test
    [root@localhost ~]# docker stop nginx-vol-test
    nginx-vol-test
    [root@localhost ~]# docker rm nginx-vol-test
    nginx-vol-test
    [root@localhost ~]# docker volume ls
    DRIVER VOLUME NAME
    local nginx-vol
    [root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
    50x.html index.html test.html

     多个容器共用一个数据卷的数据

    [root@localhost ~]# docker run -itd -p 81:80 --name=volume-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
    bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba
    [root@localhost ~]# docker run -itd -p 82:80 --name=volume-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
    af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd
    [root@localhost ~]# curl http://192.168.0.191:81/test.html
    volume test111
    [root@localhost ~]# curl http://192.168.0.191:82/test.html
    volume test111

    删除数据卷命令

    [root@localhost ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               nginx-vol
    [root@localhost ~]# docker volume rm nginx-vol  #确保该卷没有容器正在使用才能删除,所以先删除容器
    Error response from daemon: remove nginx-vol: volume is in use - [bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba, af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd]
    [root@localhost ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    af2ab077bdaa        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:82->80/tcp   volume-test2
    bb2677a06385        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:81->80/tcp   volume-test1
    [root@localhost ~]# docker stop `docker ps -aq`
    af2ab077bdaa
    bb2677a06385
    [root@localhost ~]# docker container rm  `docker ps -aq`
    af2ab077bdaa
    bb2677a06385
    [root@localhost ~]# docker volume rm nginx-vol
    nginx-vol

    创建容器时也可以不指定数据卷,此时docker将自动创建一个匿名的volume

    [root@localhost ~]# docker run -itd --name=myweb -v /data:/data nginx
    eec4af49b3fd284d00eecbd85171130aefee5035ec982e697154c2ca22dc8948
    [root@localhost ~]# ls /var/lib/docker/volumes/
    3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f metadata.db
    [root@localhost ~]# docker volume ls
    DRIVER VOLUME NAME
    local 3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f

    bind mount

    用卷创建一个容器:
    # 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 stop nginx-test
    # docker rm nginx-test
    注意:
    1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
    2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

    Volume特点:
    •多个运行容器之间共享数据。
    •当容器停止或被移除时,该卷依然存在。
    •多个容器可以同时挂载相同的卷。
    •当明确删除卷时,卷才会被删除。
    •将容器的数据存储在远程主机或其他存储上
    •将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

    Bind Mounts特点:
    •从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
    •在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
    •当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

    数据卷容器

    如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它来提供数据卷供其他容器挂载使用。

    创建数据卷容器,并在其中创建一个数据卷挂载到/data

    [root@localhost ~]# docker run -it -v /dbdata --name dbdata centos
    [root@8e6719c92634 /]# ls
    anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

    创建容器,通过volume-from来挂载dbdata容器中的数据卷 (--volumes-from可以多次使用挂载多个卷)

    [root@localhost ~]# docker run -it --volumes-from dbdata --name myweb nginx /bin/bash
    root@9fce51370304:/# ls /dbdata/
    root@9fce51370304:/# touch /dbdata/test.txt

    查看dbdata容器是否有数据

    [root@localhost ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    9fce51370304 nginx "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago myweb
    8e6719c92634 centos "/bin/bash" 12 minutes ago Up 13 seconds dbdata
    [root@localhost ~]# docker exec -it 8e6719c92634 /bin/bash
    [root@8e6719c92634 /]# ls /dbdata/
    test.txt

     利用数据卷容器迁移数据

    备份

    [root@localhost ~]# docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata
    /dbdata/
    /dbdata/test.txt
    tar: Removing leading `/' from member names
    [root@localhost ~]# ls /backup/
    backup.tar
    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    de52379b0635        centos              "tar cvf /backup/bac…"   42 seconds ago      Exited (0) 41 seconds ago                       work
    9fce51370304        nginx               "/bin/bash"              16 hours ago        Exited (0) 16 hours ago                         myweb
    8e6719c92634        centos              "/bin/bash"              16 hours ago        Up 16 hours                                     dbdata
    首先利用centos镜像创建了一个容器work,使用--volumes-from dbdata参数来让容器挂载dbdata容器的数据卷(即dbdata数据卷);
    -v /backup:/backup参数来将本地的备份目录(/backup)挂载到work容器的/backup目录。work容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下的内容备份为容器内的/backup/backup.tar,
    即宿主机/backup目录下的/backup/backup.tar

    恢复

    [root@localhost ~]# docker run -itd -v /dbdata --name db3 centos bash
    100cacc5aa24ac39606b89c21dc9ef6ec010f4eb82ac666762546aadb827ad13
    [root@localhost ~]# docker run --volumes-from db3 -v /backup:/backup --name db4 centos tar xvf /backup/backup.tar 
    dbdata/
    dbdata/test.txt
    [root@localhost ~]# docker exec -it db3 bash -c 'ls /dbdata'
    test.txt

    首先利用centos镜像新建一个db3的容器,然后通过--volumes-from参数挂载db3容器的数据卷(/dbdata)新建容器,
    并将本地的/backup目录映射到db4容器中。而后对/backup/backup.tar进行解压到/dbdata目录下,从而实现db3恢复/dbdata数据

  • 相关阅读:
    editable : false与 readonly 的区别
    Ubuntu环境下使用Jupyter Notebook查找桌面.csv文档的方法
    实验01——java模拟银行ATM系统
    Wannafly挑战赛26 御坂网络
    Wannafly挑战赛29 御坂美琴(递归,模拟)
    牛客练习赛31 龙魂合一萨坎与晶石
    牛客练习赛31
    Codeforces Round #520 (Div. 2)A. A Prank
    (花里胡哨)New Game!(牛客国庆集训派对Day1)
    Educational Codeforces Round 54 (Rated for Div. 2)A. Minimizing the String(签到题)
  • 原文地址:https://www.cnblogs.com/yuezhimi/p/9990530.html
Copyright © 2011-2022 走看看