一: 容器介绍
简介
1.0 云计算三层架构:
IaaS:基础设施即服务(毛坯房)
- 云厂商给虚拟机 / ECS 服务器。你自己装系统、搭环境、部署代码
PaaS:平台即服务(精装拎包入住,适合开发)
-
底层硬件 + 操作系统 + 运行时全部托管。
开发者只管业务代码。
典型产品:云数据库 RDS、Redis、函数计算、Heroku、Cloud Foundry、K8s 平台
SaaS:软件即服务(酒店)
-
直接使用成品软件,不用开发。
例子:钉钉、腾讯文档、企业微信
2.0 容器的简介:PaaS理想状态
- 容器是一种沙盒技术。沙盒类似于"集装箱",是把我们的应用装起来的技术;
- 因此应用与应用之间有了边界就不会相互打扰;
- 被集装箱装起来的应用也可以搬来搬去
docker介绍
1.0 docker简史:
-
和虚拟机一样,容器技术也是一种资源隔离的虚拟化技术。
-
爆发阶段:2013 年推出到现在为止最为流行和使用最广泛的容器 Docker(Docker 发布),相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。
-
2015年:OCI(Open Container Initiative)成立,制定了容器镜像标准(OCI Image Spec) 和容器运行时标准(OCI Runtime Spec),打破 Docker 的垄断,让容器技术走向标准化;同时 Kubernetes(K8s)发布,解决了容器的编排、调度、集群管理问题,成为容器集群的事实标准。
注意:OCI是开放容器倡议,目标:镜像一次构建,任意符合 OCI 标准的工具都能运行,打破厂商锁定。
2.0 docker需求成因:
- 平滑迁移:应用从集中式部署转向分布式部署;不同环境(虚拟机,公有云,私有云)里面的应用可能会随时迁移;docker的出现是让程序到哪里都可以运行,不用针对不同环境修改配置。
- 类比于运输业:docker采用集装箱思想;Docker 可以将任何应用和他的依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。这样容器就可以跑在任何环境中,
3.0 docker和传统模式区别:
部署模式区别:
-
传统:先安装,再配置,最后再运行
-
Docker部署模式:复制后直接运行
容器和虚拟机区别:
- docker运行速度快:键盘回车多快,容器运行就有多快
- 容器用宿主机内核,而虚拟机使用独立内核
- 容器是一个进程,而虚拟机不是
- 容器是进程之间的隔离(容器之间共用宿主机内核);虚拟机是所有资源的完全隔离;
4.0 容器应用场景:
- 所有硬件:它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用
- 统一开发环境:Docker给应用提供了一个从开发到上线均一致的环境
- 提高开发效率:开发者希望本地环境和线上一致,又希望环境好搭建。Docker 轻量化,低配电脑也能同时运行大量服务,兼顾环境一致性与资源开销问题。
- 隔离应用
- 快速部署
虚拟化和容器
背景:
-
硬件辅助虚拟化(虚机)解决了性能和兼容问题,但 "重虚拟化" 的弊端逐渐显现:每个虚机的独立内核导致资源开销大、启动速度慢(分钟级)、镜像体积大(GB 级)、资源调度效率低。
-
随着云计算、微服务、DevOps 的发展,企业对轻量、快速、高效、可移植的虚拟化需求激增,容器作为操作系统级虚拟化技术,应运而生并快速成为主流。
核心原理:
- Docker通过内核的隔离特性(Linux 的 cgroups+namespaces,Windows 的 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 + Cgroups
- Namespace 的作用:实现容器之间的资源隔离
- 让每个容器看起来像独立的操作系统,互不干扰
Linux Namespace 是实现容器资源隔离的核心技术,Docker 基于 LXC,依靠 6 种命名空间实现容器隔离,系统时钟无法被 Namespace 隔离。
-
pid 名字空间
隔离进程 PID;不同命名空间可存在相同 PID,实现进程隔离,支持容器嵌套。
-
net 名字空间
隔离网络;拥有独立网卡、IP、路由表、/proc/net;Docker 默认使用 veth pair 连接容器与宿主机网桥 docker0。
-
ipc 名字空间
隔离进程间通信;容器内信号量、消息队列、共享内存、socket 等 IPC 资源拥有独立 ID,容器间 IPC 相互隔离。
-
mnt 名字空间
隔离文件系统挂载;各容器拥有独立目录视图,比 chroot 更强,独立挂载点列表。
-
uts 名字空间
隔离主机名与域名;容器可以设置独立 hostname,网络层面看起来是独立节点。
-
user 名字空间
隔离用户 / 组 ID;容器内用户 ID 和宿主机可以不一致,容器内可使用自身独立用户,不和宿主机用户混用。