• 欢迎访问蜷缩的蜗牛博客 蜷缩的蜗牛
  • 微信搜索: 蜷缩的蜗牛 | 联系站长 kbsonlong@qq.com
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Docker 面面观

Zookeeper 蜷缩的蜗牛 5个月前 (05-25) 64次浏览 已收录

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

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 会自动更新.

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.

本文转载自 Docker 面面观


蜷缩的蜗牛 , 版权所有丨如未注明 , 均为原创丨 转载请注明Docker 面面观
喜欢 (0)
[]
分享 (0)