docker核心概念 一: 容器介绍简介1.0 云计算三层架构IaaS基础设施即服务毛坯房云厂商给虚拟机 / ECS 服务器。你自己装系统、搭环境、部署代码PaaS平台即服务精装拎包入住适合开发底层硬件 操作系统 运行时全部托管。开发者只管业务代码。典型产品云数据库 RDS、Redis、函数计算、Heroku、Cloud Foundry、K8s 平台SaaS软件即服务酒店直接使用成品软件不用开发。例子钉钉、腾讯文档、企业微信2.0 容器的简介PaaS理想状态容器是一种沙盒技术。沙盒类似于“集装箱”,是把我们的应用装起来的技术因此应用与应用之间有了边界就不会相互打扰被集装箱装起来的应用也可以搬来搬去docker介绍1.0 docker简史:和虚拟机一样容器技术也是一种资源隔离的虚拟化技术。爆发阶段2013 年推出到现在为止最为流行和使用最广泛的容器 DockerDocker 发布相比其他早期的容器技术Docker 引入了一整套容器管理的生态系统包括分层的镜像模型容器注册库友好的 Rest API。2015年OCIOpen Container Initiative成立制定了容器镜像标准OCI Image Spec 和容器运行时标准OCI Runtime Spec打破 Docker 的垄断让容器技术走向标准化同时 KubernetesK8s发布解决了容器的编排、调度、集群管理问题成为容器集群的事实标准。​ 注意OCI是开放容器倡议目标镜像一次构建任意符合 OCI 标准的工具都能运行打破厂商锁定。2.0 docker需求成因:平滑迁移应用从集中式部署转向分布式部署不同环境(虚拟机,公有云,私有云)里面的应用可能会随时迁移docker的出现是让程序到哪里都可以运行不用针对不同环境修改配置。类比于运输业docker采用集装箱思想Docker 可以将任何应用和他的依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。这样容器就可以跑在任何环境中3.0 docker和传统模式区别部署模式区别传统先安装再配置最后再运行Docker部署模式复制后直接运行容器和虚拟机区别docker运行速度快键盘回车多快容器运行就有多快容器用宿主机内核而虚拟机使用独立内核容器是一个进程而虚拟机不是容器是进程之间的隔离(容器之间共用宿主机内核)虚拟机是所有资源的完全隔离4.0 容器应用场景:所有硬件它能让你将运行环境和配置放在代码中然后部署同一个Docker的配置可以在不同的环境中使用统一开发环境Docker给应用提供了一个从开发到上线均一致的环境提高开发效率开发者希望本地环境和线上一致又希望环境好搭建。Docker 轻量化低配电脑也能同时运行大量服务兼顾环境一致性与资源开销问题。隔离应用快速部署虚拟化和容器背景硬件辅助虚拟化虚机解决了性能和兼容问题但 “重虚拟化” 的弊端逐渐显现每个虚机的独立内核导致资源开销大、启动速度慢分钟级、镜像体积大GB 级、资源调度效率低。随着云计算、微服务、DevOps 的发展企业对轻量、快速、高效、可移植的虚拟化需求激增容器作为操作系统级虚拟化技术应运而生并快速成为主流。核心原理Docker通过内核的隔离特性Linux 的 cgroupsnamespacesWindows 的 Hyper-V 隔离 / WSL实现进程级的资源隔离与限制。所有容器共享宿主机的 OS 内核容器本质是被隔离的、独立的进程组虚拟化层容器引擎仅为容器分配独立的网络、进程、文件系统、用户等命名空间并通过 cgroups 限制其 CPU、内存、磁盘、网络等资源的使用上限。docker核心技术Namespaces命名空间实现隔离性为每个容器创建独立的 “系统环境”容器内的进程无法看到宿主机和其他容器的资源包括PID进程号、NET网络、MNT文件系统、IPC进程通信、UTS主机名、USER用户cgroups控制组实现资源限制对容器的 CPU、内存、磁盘 IO、网络带宽等资源做精细化分配和限制防止单个容器占用所有宿主机资源联合文件系统UnionFS如 AUFS、Overlay2实现容器镜像的分层存储让容器镜像体积大幅减小MB 级并支持镜像的快速构建、推送和拉取二: Docker核心概念docker系统Docker系统有两个程序Docker服务端和Docker客户端服务端是一个服务进程管理着所有的容器。docker engine客户端扮演着docker服务端的远程控制器可以用来控制docker的服务端进程docker核心组件1.0 docker仓库用来保存镜像有私有和公有区分2.0 docker镜像Docker镜像是容器运行时的只读模版每一镜像由一系列层组成Docker 使用 UnionFS 来将这些层联合到单独的镜像中UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖形成一个单独连贯的文件系统升级程序到新的版本一个新的层会被创建因此不需要重新建立镜像。层使得分发 Docker 镜像变得简单和快速每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像3.0 docker容器:每一个 Docker 容器都是从 Docker 镜像创建的Docker 容器和文件夹很类似一个Docker容器包含了所有的某个应用运行所需要的环境每一个 Docker 容器都是独立和安全的应用平台Docker 容器是 Docker 的运行部分4.0 镜像和容器的区别Docker容器是在镜像层上面加上了一个可写层并且可写层有运行在cpu上面的进程因此有运行态和退出态对容器的变更是写入到容器的文件系统的可写层而不是写入到Docker镜像中的我们可以用同一个镜像启动多个Docker容器这些容器启动后都是活动的彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身如果对容器的底层镜像进行修改那么当前正在运行的容器是不受影响的不会发生自动更新现象5.0 名字空间:namespace(名字空间)是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。容器 进程 一组 Namespace CgroupsNamespace 的作用实现容器之间的资源隔离让每个容器看起来像独立的操作系统互不干扰Linux Namespace 是实现容器资源隔离的核心技术Docker 基于 LXC依靠 6 种命名空间实现容器隔离系统时钟无法被 Namespace 隔离。pid 名字空间隔离进程 PID不同命名空间可存在相同 PID实现进程隔离支持容器嵌套。net 名字空间隔离网络拥有独立网卡、IP、路由表、/proc/netDocker 默认使用 veth pair 连接容器与宿主机网桥 docker0。ipc 名字空间隔离进程间通信容器内信号量、消息队列、共享内存、socket 等 IPC 资源拥有独立 ID容器间 IPC 相互隔离。mnt 名字空间隔离文件系统挂载各容器拥有独立目录视图比 chroot 更强独立挂载点列表。uts 名字空间隔离主机名与域名容器可以设置独立 hostname网络层面看起来是独立节点。user 名字空间隔离用户 / 组 ID容器内用户 ID 和宿主机可以不一致容器内可使用自身独立用户不和宿主机用户混用。