文章转载自:https://www.skynemo.cn/archives/01-docker-synopsis
相关网站
Docker官网:https://www.docker.com/
Docker帮助文档:https://docs.docker.com/
Docker官方镜像仓库:https://hub.docker.com/
Docker中文网:https://www.docker.org.cn/
Docker组成
结构图
主要组成部分
- Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker 服务进程和容器,也称为宿主机、node 节点
- Docker 服务端(Server):Docker 守护进程(Docker daemon),运行 Docker 容器
- Docker 客户端(Client):客户端使用
docker
命令或其他工具调用 Docker API - Docker 镜像(Images):镜像可以理解为创建实例使用的模板
- Docker 仓库(Registry):保存镜像的仓库,提供类似于 git 的版本控制(官方仓库:https://hub.docker.com/)
- Docker 容器(Container):容器是从镜像生成的一个或一组服务,其本质就是镜像实例化后生成的进程
容器的优劣势
容器对比虚拟机
虚拟机
传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行应用软件。
容器
容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相比于虚拟机更加轻量化
容器相较于虚拟机
- 资源利用率更高:开销更小,不需要启动单独的虚拟机系统
- 启动速度更快:可以在数秒内完成启动
- 占用空间更小:容器占用磁盘空间一般已MB为单位,而虚拟机一般以GB为单位
- 集成性更好:与CI/CD(持续集成、持续部署)相关技术的结合性更好
项目容器化的优缺点
优点
- 快速部署:可以短时间内部署并启动成百上千个应用,实现快速交付
- 高效虚拟化:不需要额外hypervisor支持,基于Linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率
- 节省开支:提高服务器的资源利用率,降低支出
- 简化配置:直接将运行环境打包保存至容器,使用时启动即可
- 环境统一:将开发、测试、生产的应用运行环境进行标准化和统一,减少因环境不同带来的各种问题
- 快速迁移和扩展:可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从 A 宿主机迁移到 B 宿主机,甚至是 A 平台迁移到 B 平台
- 更好地实现面向服务的架构:一般一个容器只运行一个应用,可以实现分布的应用模型,并且方便进行横向扩展。符合开发中高内聚、低耦合的要求,可以减少不同服务之间的相互影响
缺点
- 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
- 由于和宿主机之间的进程也是隔离的,需要进入容器査看和调试容器内进程等资源,变得比较困难和繁琐
- 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费
相关的技术
Namespace
隔离类型 | 功能 | 系统调用参数 | 开始支持的内核版本 |
---|---|---|---|
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19+ |
IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力,包括信号量、消息队列和共享内存 | CLONE_NEWIPC | 2.6.19+ |
UTS Namespace(UNIX Time sharing System) | 提供内核、主机名、域名隔离能力 | CLONE_NEWUTS | 2.6.19+ |
PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24+ |
Net Namespace (network) | 提供网络隔离能力,包括网络设备、网络栈、端口等 | CLONE_NEWNET | 2.6.29+ |
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8+ |
Control Groups
Linux Control Groups,及cgroup,其最主要的作用就是限制一个进程能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如将进程挂起和恢复等操作)
cgroup具体实现
- blkio: 块设备IO限制
- cpu: 使用调度程序为cgroup任务提供cpu的访问
- cpuacct: 产生cgroup任务的cpu资源报告
- cpuset: 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存
- devices: 允许或拒绝cgroup任务对设备的访问
- freezer: 暂停和恢复cgroup任务
- memory: 设置每个cgroup的内存限制以及产生内存资源报告
- net_cls: 标记每个网络包以供cgroup方便使用
- ns: 命名空间子系统
- perf_event: 增加了对每cgroup的监测跟踪的能力,可以监测属于某个特定的group的所有线程以及运行在特定cpu上的线程
Docker核心技术
容器规范
OCI 官网:https://opencontainers.org/
为了保证容器生态的标准性和健康可持续发展,包括Linux基金会、Docker、微软、红帽、谷歌和IBM等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范。目前OCI一共发布了两个规范,分别是runtime_spec和image-spec,即运行时规范的镜像规范,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性
容器运行时(runtime)
runtime是真正运行容器的地方,因此为了运行不同的容器,runtime需要和操作系统内核紧密合作、相互支持、以便为容器提供相应的运行环境
「runtime类型」
- LXC:早期的Docker采用LXC作为runtime
- libcontainer: 随着Docker的发展,将底层的实现抽象化为一组接口,即libcontainer,也为Docker之后的跨平台实现打下基础
- runc: 目前Docker默认的runtime,遵守OCI规范;早期libcontainer是Docker公司控制的一个开源项目,OCI成立后,Docker把libcontainer项目移交给OCI组织,runc就是在libcontainer的基础上进化而来
- rkt: CoreOS开发的容器runtime,符合OCI规范,所以在rkt上也可以运行Docker
容器管理工具
容器管理工具是用户与runtime的交互工具;它连接runtime,并对用户提供图形或命令方式操作,将用户操作传递给runtime执行
管理工具类型
runc的管理工具是 docker-engine
,docker-engine
包含后台服务deamon和客户端工具cli两部分,平时提到的Docker就是指的docker-engine
示例-查看 docker-engine
docker version
容器定义工具
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建
docker image
: Docker容器的模版,即Docker镜像,runtime依据dcoker image创建容器dockerfile
: 包含N个命令的文本文件,通过dockerfile创建出docker image
镜像仓库
集中保存多个不同版本镜像,并提供镜像管理、下载服务的地方
「常用的仓库」
- Docker Hub: Docker官方公共仓库,国内访问较慢
- 阿里云、网易云: 第三方镜像公共仓库
- Image registry: Docker官方提供的私有仓库部署工具,无web页面,目前使用较少
- Harbor: vmware公司提供的私有仓库,带认证、有web页面,目前使用较多
容器编排工具
当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容器出错。而且也无妨实现某一台主机宕机后,容器自动迁移到其他主机,从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎
容器编排通常包括容器管理、调度、集群定义和服务发现等功能
「常用的编排工具」
- Docker compose: Docker官方的单机容器编排工具
- Docker swarm: Docker官方的容器编排引擎
- Kubernetes:容器编排工具的事实标准
Docker依赖技术
容器网络
docker服务自带的网络docker network仅支持管理单机的容器网络,当多主机运行的时候需要使用第三方开源网络,例如:calico、flannel等
服务发现
容器的动态扩容特性决定了容器IP会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名
容器监控
可以通过原生命令docker ps|top|stats
查看容器运行状态,另外也可以使用Prometheus、heapster等第三方监控工具监控容器的运行状态
数据管理
容器的动态迁移会导致其在不同的host之间迁移,因此需要保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷存储挂载等方式解决
日志收集
docker服务自带日志查看工具docker logs
,但是容器内部的日志需要通过ELK等专门的日志收集和展示工具处理
评论区