Docker 面面观

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 :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 面面观)