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.
- **late-bound. **
- Docker 的目标是作为构建应用程序的平台.
- Docker的困境:
- 选择1: 仅局限为container runtime, 然后让生态给其提供附加功能.
- 选择2: 自己把附加功能实现.
- Docker的做法: 自己会提供附加功能和工具, 但是允许用户替换为自己的实现.
3. Volume
- Docker 镜像是由多个文件系统(只读层)叠加而成.
- 容器启动时, 会加载只读层并在其上自动添加读写层.
- 当容器中修改文件时, 将只读层复制到读写层, 并隐藏只读层.
- 容器的修改, �不会反应到镜像中.
- Union File System(联合文件系统): 只读层和顶部的读写层的组合.
- Volume 是目录或文件.
- 用以绕过默认的联合文件系统, 而以正常的文件目录形式存在于宿主机上.
- 目的: 分离容器以及容器产生的数据.
4. Container link
- - - link <name/id>:alias
- Container拥有内部网络和IP地址.
-
-p可以绑定容器端口到host机上的特定/随机端口.
-
同时可以指定使用的协议(tcp/udp).
-
使用link system链接.
- 信息可以在source 和recipient 之间传递.
- naming的重要性.
- Docker依赖于命名来建立link.
- 使用
- - name
选项来指定名称. - 优势:不需要在网络中暴露source 容器.
-
信息传递方式
- 环境变量.
- 自动在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 会自动更新.
- 对于target 容器, 会自动创建两个项目:
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
- 保证分布式应用系统的可移植性(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).
- �启动步骤:
- 在dockerfile 中定义app环境.
- 在docker-compose.yml 中定义组成app的各个service.
- 运行
docker-compose up
命令来启动运行整个app.
网友评论