docker 依赖技术
1. 容器网络
docker自带的网络docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico,flannel等。
2. 服务发现
容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名。
3. 容器监控
可以通过原生命令docker ps/top/stats查看容器运行状态,零位也可以使用heapster/Prometheus等第三方监控工具监控容器的运行状态。
4. 数据管理
容器的动态迁移会导致其在不同的Host之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等防止解决。
5. 日志收集
docker原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。
docker容器的核心技术
容器规范
容器技术除了docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux基金会、Docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫open container(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了两个规范,分别是runtime spes和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
容器runtime
runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互支持,以便为容器提供相应的运行环境。
目前主流的三种runtime:
Lxc:Linux上早期的runtime,Docker早期就是采用Lxc作为runtime。
runc:目前Docker默认的runtime,runc遵守OCI规范,因此可以兼容lxc。
rkt:是CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器。
容器管理工具
管理工具连接runtime与用户,对用提供图形或命令方式操作,然后管理工具将用户操作传递给runtime执行。
lxc是lxd的管理工具。
Runc的管理工具是docker engine,docker engine包含后台deamon和cli两部分,大家经常提到的Docker就是指的docker engine。
Rkt的管理工具是rkt cli。
容器定义工具
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。
Docker image:是docker 容器的模板,runtime依据docker image 创建容器。
Dockerfile:包含N个命令的文本文件,通过dockerfile创建出docker image。
ACL(App container image):与docker image类似,是CoreOS开发的rkt容器的镜像格式。
Registry
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。
image registry:docker官方提供的私有仓库部署工具。
Docker hub:docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用。
Harbor:vmware提供的自带web界面自带认证功能的镜像仓库,目前有很多公司使用。
编排工具
当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主句从而实现高可用的目的,也无法实现动态伸缩功能,因此需要有一种工具可以实现统一的管理动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎。
容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
Dcker swarm:docker开发的容器编排引擎。
Kubernetes:Google领导开发的容器编排引擎,内部项目为Borg,且其同时支持docker和CoreOS。