zoukankan      html  css  js  c++  java
  • DOCKER学习_003:Docker的存储

    一 简介

    docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:

    • 挂载主机目录(Bind mounts)
    • 数据卷容器(Data Volumes)

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

    • 数据卷可以在容器之间共享和重用
    • 数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
    • 对数据卷的修改会立马生效
    • 对数据卷的更新不会影响镜像
    • 卷会一直存在,只到没有容器使用

    挂载主机目录

    删除所有容器

    [root@docker-server1 ~]# docker ps -aq|xargs docker rm -f

    创建一个数据卷

    [root@docker-server1 ~]# docker run -d -P --name web -v /webapp docker.io/centos:6 /bin/bash

    Unable to find image 'centos:6' locally
    6: Pulling from library/centos
    ff50d722b382: Pull complete 
    Digest: sha256:dec8f471302de43f4cfcf82f56d99a5227b5ea1aa6d02fa56344986e1f4610e7
    Status: Downloaded newer image for centos:6
    a306908b2740202fa19d25b3b99a62981960b728f66992d099cb130694e6e207

    选项说明:

    -d:将容器放入后台运行
    -P:将容器中的端口暴露到宿主机的一个随机端口
    -v:创建一个数据卷,这个数据卷会自动映射到宿主机的某个目录,一般在/var/lib/docker/vfs下

    挂载一个宿主机目录作为数据卷
    [root@docker-server1 ~]# docker run -d -P --name web1 -v /data:/webapp docker.io/centos:6 /bin/bash

     #将宿主机的/data目录挂载至容器的/webapp目录

    4ee7b1a64be5eefb339ff73f25de3420c57f4d08dfdd611fd347e95c4ad4c278                               

    二  数据卷容器

    2.1 创建一个数据卷容器

    [root@docker-server1 ~]# docker run -it -v /dbdata --name dbdata docker.io/centos:6

    #创建一个数据卷容器dbdata,并创建一个数据卷挂载至/dbdata

    其他容器可以通过--volumes-from来挂载dbdata容器中的数据卷:

    [root@docker-server1 ~]# docker run -it --volumes-from dbdata --name db1 centos:6

    [root@docker-server1 ~]# docker run -it --volumes-from dbdata --name db2 centos:6

    容器db1和db2都挂载同一个数据卷到/dbdata目录,三个容器任何一方在该目录的写入,其他容器都能看到

    --volumes-from参数可以多次使用,从多个容器挂载多个数据卷

    如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器。

    利用数据卷容器迁移数据

    2.2 备份数据

    #先创建一个容器worker,并使用--volumes-from将dbdata挂载到worker容器,然后使用-v参数将容器的/backup目录映射到宿主机的backup目录。然后在容器中执行备份操作,这样就把数据备份到宿主机的/backup目录中了

    [root@docker-server1 ~]# docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos:6

    [root@e0ed338e565a /]# tar zcf /backup/backup.tar.gz /dbdata

    [root@e0ed338e565a /]# exit

    [root@docker-server1 ~]# ll /backup/backup.tar.gz

    -rw-r--r-- 1 root root 109 Nov  9 08:29 /backup/backup.tar.gz

    2.3 还原数据

    #创建一个新容器,并用-v参数挂载本地的备份目录,然后执行解压操作,将备份文件解压至/dbdata目录

    [root@docker-server1 ~]# docker run -it -v /dbdata --name dbdata2 centos:6 /bin/bash

    [root@9cd7c00cbfd7 /]# exit

    #创建一个容器dbdata2

    [root@docker-server1 ~]# docker run -it --volumes-from dbdata2 -v /backup:/backup centos:6 tar xf /backup/backup.tar.gz

    2.4 删除数据盘

    查看主机上现有的数据盘

    [root@docker-server1 ~]# docker volume ls

    DRIVER              VOLUME NAME
    local               8a55cbee9e17257a1075821453f93f3e607f6332f4225fe4419000ec1173bc9b
    local               011c8b324617c79971e5bb907e821f9e240a6c5b350c1e2556724fc5fc539383
    local               c187ebc912eca05f6ea6bd2d212c7d0fccb2fc8d8f737f0e909c96a8ea7ca66d
    默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
    docker volume ls -f dangling=true
    如果想要删除没有使用的数据盘,使用如下指令:
    docker volume rm VOLUME_NAME
    删除掉容器时,同时删掉数据盘,则使用:
    docker rm -v container_name

    三 挂载主机目录

    把本地的一个目录挂载到容器,修该本地的目录就可以达到修改容器的目的

    3.1 创建一个挂载的容器

    [root@docker-server1 ~]# docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4

    Unable to find image 'httpd:2.4' locally
    2.4: Pulling from library/httpd
    8d691f585fa8: Already exists 
    8eb779d8bd44: Pull complete 
    574add29ec5c: Pull complete 
    30d7fa9ec230: Pull complete 
    ede292f2b031: Pull complete 
    Digest: sha256:35fcab73dc9ae55db5c4ac33f5e0c7e76b7735aaddb628366bab04db6f8ae96e
    Status: Downloaded newer image for httpd:2.4
    a69423b85fb5fd7dbe25e14fa54767b9761259404721a781d7fa393827981e46

    [root@docker-server1 ~]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                NAMES
    a69423b85fb5        httpd:2.4           "httpd-foreground"       38 seconds ago      Up 37 seconds                 0.0.0.0:80->80/tcp   goofy_kowalevski

    访问192.168.132.131:80

     3.2 在物理机写入数据

    [root@docker-server1 ~]# echo "Hello Docker"  >>   /data/index.html
    Hello Docker /data/index.html

     [root@docker-server1 data]# echo "This is teat"  >> /data/test.html

    3.3 查看

    进入容器

    [root@docker-server1 data]# docker exec -it a69423b85fb5 /bin/bash
    root@a69423b85fb5:/usr/local/apache2# cd /usr/local/apache2/htdocs/
    root@a69423b85fb5:/usr/local/apache2/htdocs# ls -l
    total 8
    -rw-r--r-- 1 root root 13 Nov  9 13:59 index.html
    -rw-r--r-- 1 root root 13 Nov  9 14:00 test.html
    root@a69423b85fb5:/usr/local/apache2/htdocs# cat index.html 
    Hello Docker
    root@a69423b85fb5:/usr/local/apache2/htdocs# exit
    exit

    3.5 删除容器测试

    [root@docker-server1 data]# docker rm -f a69423b85fb5

    [root@docker-server1 data]# docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4

    3b821b608a83f0dffb44ac8f53422806775258cbf5451502ed28b66d210680f9

    进入容器查看

    [root@docker-server1 data]# docker exec -it 3b821 /bin/bash
    root@3b821b608a83:/usr/local/apache2# cd /usr/local/apache2/htdocs/
    root@3b821b608a83:/usr/local/apache2/htdocs# ls -l
    total 8
    -rw-r--r-- 1 root root 13 Nov  9 13:59 index.html
    -rw-r--r-- 1 root root 13 Nov  9 14:00 test.html
    root@3b821b608a83:/usr/local/apache2/htdocs# cat index.html 
    Hello Docker
    root@3b821b608a83:/usr/local/apache2/htdocs# exit
    exit

    访问测试

    测试再次创建的容器数据还在

    docker挂载数据卷的默认为权限为读写(rw),用户也可以通过ro指定为只读:

    [root@docker-server1 data]# docker run -d -p 81:80 -v /data:/usr/local/apache2/htdocs:ro  httpd:2.4

    354fe8e46850d21b1f986c6f9ad39f5dc012bf47127e1ce627736cd0759c3505

    也可以访问

    进入容器

    [root@docker-server1 data]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS                NAMES
    354fe8e46850        httpd:2.4           "httpd-foreground"       2 minutes ago       Up 2 minutes                     0.0.0.0:81->80/tcp   zealous_boyd

    [root@docker-server1 data]# docker exec -it 354fe8e46850 /bin/bash

    root@354fe8e46850:/usr/local/apache2# cd htdocs/
    root@354fe8e46850:/usr/local/apache2/htdocs# touch test-1.html   #不可写
    touch: cannot touch 'test-1.html': Read-only file system

    博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

  • 相关阅读:
    学习笔记1:性能问题在于你想不到的任何地方!
    React Native控件之PullToRefreshViewAndroid下拉刷新组件解说(20)
    CSDN-markdown编辑器之导入导出文档功能
    无名管道与有名管道通讯编程
    LeetCode Remove Nth Node From End of List
    libpcap出错信息调试函数pcap_geterr, pcap_perror
    工作流学习——Activiti流程实例、任务管理四步曲
    B
    oracle学习笔记 oracle软件安装和数据库的创建
    路由器逆向分析------MIPS系统网络的配置(QEMU)
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/11830238.html
Copyright © 2011-2022 走看看