- Published on
Docker 入门之基本概念
- Authors

- Name
- 弈秋
Docker 入门之基本概念
缘起
三天不学习,赶不上刘主席,清明也是三天,得学点什么,也好告慰老祖,今天从docker开始,总结一下基本概念。
Docker 和虚拟机(VM)
- 虚拟机:通过Hypervisor模拟完整的硬件环境,每个虚拟机都运行着独立的操作系统内核和完整的系统进程
- Docker:本质上只是宿主机上的一个进程,通过 Namespace 和 Cgroups 对资源进行隔离,每个容器都运行着独立的进程
| 对比维度 | 虚拟机(VM) | Docker 容器 |
|---|---|---|
| 底层架构 | 虚拟化硬件,运行独立操作系统 | 共享宿主机内核,仅隔离用户空间 |
| 启动速度 | 分钟级(需启动完整OS) | 秒级(直接启动进程) |
| 资源占用 | 高(每个VM都带一个OS) | 低(仅运行应用+依赖) |
| 可移植性 | 差(依赖特定虚拟化平台) | 极强(只要支持Docker即可运行) |
| 隔离性 | 强(完整OS隔离) | 中等(基于命名空间与控制组) |
抛开技术概念,从使用感觉上来说:Docker是一个轻量化的虚拟机
Docker 的基本概念
程序员有句口头禅:“我的程序在我的电脑上跑得好好的,怎么一到服务器部署就报错?”
Docker 的出现,正是为了解决这一经典痛点:Docker 是一个开源的容器化平台,它能将应用程序及其所有依赖(代码、库、配置、环境变量等)打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”
三个最核心的概念
镜像(Image):
一个只读的文件系统包。它包含了运行应用所需的一切:文件系统结构、应用程序代码、运行时环境、系统库和配置参数
容器(Container):
容器是镜像的运行实例
这里对程序员来说,最好理解:镜像就是代码文件,容器就是运行中的进程
仓库(Registry):
集中存储和分发镜像的场所:可以理解为软件市场一样的地方
最著名的公共仓库是 Docker Hub
Docker原理的概念
Namespace(命名空间)
命名空间是是 Linux 内核用于实现资源隔离的机制,也可以理解为视图,如果理解数据库的化,就非常好理解了:一个物理表,为了给不同的用户看到各自部分的数据,可以创建一个视图,普通用户只能看到自己的数据,而管理员可以看到所有数据。
在docker中,一共有4个命名空间的概念:
- PID Namespace:隔离进程 ID。容器内的第一个进程在其自身的 PID Namespace 中看到的 PID 为 1,而在宿主机上它只是一个拥有普通 PID 的进程。
- Mount Namespace:隔离文件系统挂载点。它将镜像中的文件系统挂载为容器的根目录(/),使容器内的文件操作被限制在这个独立的根文件系统之下。
宿主机目录 ────▶ [绑定挂载] ────▶ 容器内部目录
│
└─── [命名卷] ────▶ Docker 存储路径(/var/lib/docker/volumes/...)
- Network Namespace:隔离网络资源。这是 Docker 网络能力的核心。每个容器拥有独立的网络接口、IP 地址、路由表和防火墙规则。Docker 通过创建虚拟网卡对(veth pair),并将一端接入宿主机上的虚拟网桥(如 docker0),来实现容器与宿主机、容器与容器之间的网络通信。
| 模式 | 描述 | 适用场景 |
|---|---|---|
bridge(默认) | 容器通过 Docker 网桥连接,自动分配IP | 多容器应用内部通信 |
host | 容器直接使用宿主机网络栈 | 高性能网络应用 |
none | 无网络,仅保留回环接口 | 安全隔离场景 |
overlay | 多主机容器网络(Docker Swarm) | 集群部署 |
注:docker 网络值得再写一篇详细解释
- User Namespace:隔离用户和用户组 ID。这是重要的安全特性。它通过映射机制,可以将容器内以 root 身份运行的进程,映射到宿主机上的一个普通非特权用户。这样即使容器被攻破,攻击者在宿主机上的权限也受到极大限制,提升了整个系统的安全性。
容器内部: 宿主机:
UID: 0 (root) → UID: 100000 (普通用户)
GID: 0 (root) → GID: 100000
Cgroups(控制组)
Namespace 解决了“看不见”(隔离)的问题,但无法解决“抢不过”(资源争抢)的问题。Cgroups 正是为了解决资源限制问题而生的 Linux 内核机制。
它的作用是限制、记录和隔离进程组对物理资源的使用。Docker 通过 Cgroups 可以对每个容器进行精细的资源控制,如设定内存上限、CPU使用权重、磁盘I/O带宽等。
分层存储与打包:UnionFS(联合文件系统)
UnionFS 是实现 Docker 镜像分层和容器可写层的核心技术。
怎么简单解释这个概念呢?大概就是,一样的东西,只放一份,其他都用超链接。
就好像冷兵器的棍、矛、枪、戈、青龙偃月刀、丈八蛇矛、方天画戟:他们都有一根棍子,换不同的头,
而docker的镜像分层的概念,就是,一个镜像,按照内容拆分很多层,当多个镜像的有相同层时候,就只存一份,其余用超链接。
举个实例:一个基础镜像100M,我放了一个程序a,a是10M,创建了镜像A;
又重新放了一个程序b,创建了镜像B,
猜猜他占用的存储空间是多少?是基础100M+A镜像110M+B镜像110M么?
分层存储也值得再写篇单独实验一次
数据持久化:卷(Volumes)
静态的镜像只是代码,运行中的容器是内存中进程,那运行后的数据呢?难道制作计算,不存储?这种应用很少吧?
所以Docker 引入了 卷(Volume) 的概念,可以将卷挂载到容器内的指定路径,容器对挂载点的所有读写操作都会直接作用于卷,从而实现数据的持久化保存和跨容器共享
就好像给系统插入一个U盘,然后在U盘上存储数据,当系统重启后,U盘还在,数据还在。
分类:
| 类型 | 用途说明 | 适用场景 |
|---|---|---|
| 命名卷(Named Volume) | Docker 管理的持久化存储 | 数据库、配置文件 |
| 绑定挂载(Bind Mount) | 将宿主机目录映射到容器 | 开发调试、日志查看 |
| 临时卷(tmpfs) | 仅在内存中存在,容器停止即消失 | 敏感数据、临时缓存 |
小结
可以说虚拟机开启了云计算的时代,而 Docker 则开启了云开发的时代。
docker极大的缓解了开发者和运维者的紧张关系,哈哈