Docker 面面观

作者: 沪上最强亚巴顿 | 来源:发表于2015-11-21 14:34 被阅读139次

    1. 简介

    • 关注点分离(SOC)
      • 开发人员只需关心容器中运行的应用程序, 运维人员只需关心如何管理容器.
      • 保持开发环境和部署的生产环境的一致性.
    • Docker 在虚拟化的容器执行环境中增加了一个应用程序部署引擎.
      • Docker 容器只能运行在与底层宿主机相同或相似的OS 上.
    • Docker 鼓励采用面向服务的架构和微服务构架.
      • Docker 推荐在单个容器中只运行一个应用程序或进程.
    • Docker是C/S架构.
    • 使用Registry来保存用户构建的镜像。
      • Registry 分为公有和私有。
    • 镜像是Docker 生命周期中的构建或打包阶段.
      • 相当于容器的”源代码”, 体积小易于传播.
    • 容器则是启动或执行阶段。
      • 容器的组成:一个镜像格式; 一系列标准的操作; 一个执行环境.
    • 不需要担心管理状态的持久性.
      • 容器的生命周期比较短,并且重建管理状态的代价通常比传统的状态修复低.
    • 使用Linux 的namesapce 特性, 来隔离文件系统, 进程和网络.
    • copy-on-write模式使得能够快速修改程序.

    2. batteries included but removable

    • **Docker ships its own additions to Docker as late-bound, composable, optional extensions. **
      • **late-bound. **
        • 在Docker 被编译后仍然能够加载Extension.
        • 由于Go 语言没有动态加载库, 所以Extension需要out-of-process.
      • **Composable. **
        • 多个无关的Extensions 能够同时被加载.
      • **Optional. **
        • 能够使用其它厂商的实现,来替换掉Docker 内置默认的extension.
    • Docker 的目标是作为构建应用程序的平台.
    • Docker的困境:
      • 选择1: 仅局限为container runtime, 然后让生态给其提供附加功能.
      • 选择2: 自己把附加功能实现.
      • Docker的做法: 自己会提供附加功能和工具, 但是允许用户替换为自己的实现.

    3. Volume

    • Docker 镜像是由多个文件系统(只读层)叠加而成.
      • 容器启动时, 会加载只读层并在其上自动添加读写层.
      • 当容器中修改文件时, 将只读层复制到读写层, 并隐藏只读层.
      • 容器的修改, �不会反应到镜像中.
      • Union File System(联合文件系统): 只读层和顶部的读写层的组合.
    • Volume 是目录或文件.
      • 用以绕过默认的联合文件系统, 而以正常的文件目录形式存在于宿主机上.
      • 目的: 分离容器以及容器产生的数据.

    4. Container link

      - - - link <name/id>:alias
    
    1. Container拥有内部网络和IP地址.
    • -p可以绑定容器端口到host机上的特定/随机端口.

    • 同时可以指定使用的协议(tcp/udp).

    • 使用link system链接.

      • 信息可以在source 和recipient 之间传递.
      • naming的重要性.
        • Docker依赖于命名来建立link.
        • 使用- - name选项来指定名称.
        • 优势:不需要在网络中暴露source 容器.
    • 信息传递方式

      1. 环境变量.
      • 自动在target 容器中创建环境变量, 并暴露source容器的所有环境变量.
        • 做法:
          • source容器dockerfile 中的ENV命令;
          • docker run命令的-e, —env, —env-file选项
      • 这些变量会被所有链接到source 容器的容器共享.
        • 如果有敏感信息, 会有泄漏的风险.
      • 当source 容器重启后, 环境变量中存储的IP 地址不会自动更新.
        • 推荐使用/etc/hosts 来解析链接的容器的IP地址.
      • 更新/etc/hosts文件.
        • 对于target 容器, 会自动创建两个项目:
          • 使用容器ID作为host名称的.
          • source 容器和IP的链接alias.
        • 当source 容器重启后, 文件内的IP 会自动更新.

    4. - Dockerfile

    4.1 指导原则:

    • ephemeral container.
      • 使用最小的set-up和配置来重建容器.
    • 避免安装不必要的包.
    • 使用.dockerignore文件.
    • 一个container只运行单一process. 易于水平扩展和container复用.
      • 如果需要依赖,使用container link.
    • 最小化layer数目.
      • 在dockerfile 的可读性和layer 数目之间做平衡.
    • 多行参数,且每行以\结尾.

    4.2 build cache

    • 在创建过程中,在没有指定—no-cahe选项时,会首先查看是否能重用cache.
    • 以cache 中以已创建的base image 为起始, 之后的命令只会处理子image与其的差别部分.
    • 在add/copy 指令中,存入image 的文件中的内容会被检查.
      • checksum 会被建立并用在cache lookup.
    • 其它指令,不会检查容器中的文件来决定cache match. 而使用命令字符串来查找match.
    • 一旦cache 失效, 之后的command 会生成新的image.

    4.3 Commands

    • From.尽可能以官方repo作为base image.
    • Run. apt-get update & install -y
    • CMD. 运行image中的软件.
    • Expose. 容器会监听的端口号.
    • ENV.
      • 为了运行新软件,使用ENV Path来更新PATH环境变量
      • 需要容器化的环境变量.
      • 指定软件的Version 信息.
    • ADD/COPY.
      • copy只支持从本地文件到容器的拷贝.
      • 而add支持解压缩和远程URL, 非常适合于自动解压本地文件到容器.
      • 当多个步骤需要多个file执行时,逐文件的copy会减少cache失效(仅当单独特定步骤的文件过时时).
      • 出于image尺寸考虑.使用add来获取remote URL内容应避免.而使用curl/wget.
      • 除了需要使用自动解压缩能力外,优先使用copy.
    • EntryPoint. 设置image的main命令.
    • Volume. 暴露数据库的存储区域, 配置存储, 和容器中创建的文件/目录.
    • User. 改变no-root 用户.

    5. Orchestration

    1. 保证分布式应用系统的可移植性(Portability).
    • 多个小App组成的松耦合的程序架构, 每个App都能独立地变化.
    • 无缝的程序portability:
      • dev 在 dev-build-test 期间使用工具build/ship 程序.
      • 而IT 也能用相同的工具在跨环境和云的情形中run-manage-move 程序.
    • Docker Machine
      • “zero to Docker” in minutes.
      • [machine create]命令自动在宿主机上创建和安装docker.
    • Docker Swarm
      • 本地Docker Engines集群. schedule应用容器的capability.与生态系统结合.
      • discovery token来discovery & agent registration.
    • Docker Compose
      • 针对多容器分布式系统, 简化 build&ship 操作.
      • 使用YAML文件定义子系统及相互关联(link).
      • �启动步骤:
        1. 在dockerfile 中定义app环境.
        • 在docker-compose.yml 中定义组成app的各个service.
        • 运行docker-compose up命令来启动运行整个app.

    相关文章

      网友评论

        本文标题:Docker 面面观

        本文链接:https://www.haomeiwen.com/subject/ywilhttx.html