每天5分钟玩转容器技术-读书笔记-第六章

前言

因为开发过程中各种环境的部署是一件让人非常头疼的事情,所以容器技术一直是笔者比较感兴趣的技术领域,工作之余找到了一本国人写的容器好书 每天5分钟玩转Docker容器技术,书名看起来比较不靠谱,实际在豆瓣评分中高居前列,评论也纷纷表扬该书是本入门的好书。这系列文章是该书的读书笔记。笔者主要以 问题和解答 作为读书笔记的写作形式,这样可以方便大家准备面试。

系列文章:

每天5分钟玩转容器技术-读书笔记-第一章到第三章
每天5分钟玩转容器技术-读书笔记-第四章到第五章

容器

  1. 简单说说docker提供的几种存储数据的方式?

    docker提供两种存储数据的方式。

    • storage driver:docker启动时默认会选择宿主机的storage driver,driver中适合保存无状态容器的临时数据,随着容器的销毁而销毁
    • data volume: data volume适合存储有状态容器的数据,比如数据库系统的数据库文件。
  2. 对于data volume,docker提供了两种类型的volume,简单说说

    • bind mount:将host上已经存在的目录或者文件mount到容器的文件系统中。

      ging@ubuntu:~$ sudo docker run -d -p 81:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd //ro表示容器中不能修改文件,只能读。
      
      • 应用场景:
        • 把host中的源代码直接mount到容器中,host修改源代码后,容器可以实时显示最新效果。
        • 把mysql中的数据放在bind mount中,可以方便host备份迁移数据。
      • 缺点:因为需要指定host的具体目录,可移植性较差。
    • docker managed volume:使用时不需要指定mount的源(由docker指定一个本地的路径),只需要指定mount point即可。

      ging@ubuntu:~$ sudo docker run -d -p 82:80 -v /usr/local/apache2/htdocs httpd 
      
      • 优点:因为由docker选择的源目录,不需要自己指定,所以可移植性强
      • 缺点:
        • 不支持单个文件的mount,只能支持文件夹
        • 默认读写权限都有,不可以控制单独的读写权限

  3. 容器和host如何共享数据?

    可以通过两种方式实现共享。

    • bind mount:指定一个本地目录,然后容器启动的时候mount过去即可

    • docker managed volume:这个需要注意下,因为host的目录是在容器启动后才生成的,所以需要再手动复制需要共享的内容到mount源目录即可。

      ging@ubuntu:~/htdocs$ sudo docker cp index.html 24b3:/usr/local/apache2/htdocs
      
  4. 容器和容器之间如何共享数据?

    • bind mount:可以通过多个容器指定同一个mount源路径,实现容器之间共享数据

    • volume container:一个专门用于mount的容器(不需要运行),其他容器mount到这个volume容器即可实现共享

      创建volume container
      ging@ubuntu:~/htdocs$ sudo docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox
      查看volume container mount配置
      ging@ubuntu:~/htdocs$ sudo docker inspect vc_data
      
      把其他容器mount到这个容器中
      ging@ubuntu:~/htdocs$ sudo docker run -d -p 80 --volumes-from vc_data httpd 
      
    • data-packed volume container:需要利用Dockerfile构建一个新的镜像,构建镜像的时候就把host的文件存入镜像文件中(初始化一个统一的内容),并且指定了一个docker managed volme的目标路径,这样volume容器就和本地的一个路径自动关联起来了,其他容器需要--volumes-from 关联这个容器,即可实现数据共享。

      • Dockerfile:
      FROM busybox:latest
      ADD htdocs /usr/local/apache2/htdocs
      VOLUME /usr/local/apache2/htdocs
      
      • 构建指令:
      ging@ubuntu:~/datapack$ sudo docker build -t datapack .
      
      • 优点:创建volume容器的时候不需要像第二种方式需要再手动指定 -v /other/useful/tools了,可移植性最强(因为镜像中已经包含了需要共享的文件)。
  5. 如何进行data volume的备份 恢复 迁移和删除?

    • 备份:因为data volume对应的就是我们host中的文件,所以定期备份文件系统中的文件即可
    • 恢复:如果数据损坏了,可以利用之前备份的问题复制到对应的容器mount文件夹即可
    • 迁移:如果想使用更新版本的镜像,可以利用-v直接把本地的文件夹mount到新容器中即可
    • 删除:
      • bind mount的本地路径,docker不会进行维护,需要手动删除
      • docker managed volume,可以通过指定 sudo docker rm -v 删除容器的时候一起删除volume
原文地址:https://www.cnblogs.com/ging/p/13969265.html