Published on

Docker 入门之基本概念

Authors
  • avatar
    Name
    弈秋
    Twitter

Docker 入门之基本概念

缘起

三天不学习,赶不上刘主席,清明也是三天,得学点什么,也好告慰老祖,今天从docker开始,总结一下基本概念。

Docker 和虚拟机(VM)

  1. 虚拟机:通过Hypervisor模拟完整的硬件环境,每个虚拟机都运行着独立的操作系统内核和完整的系统进程
  2. Docker:本质上只是宿主机上的一个进程,通过 Namespace 和 Cgroups 对资源进行隔离,每个容器都运行着独立的进程
对比维度虚拟机(VM)Docker 容器
底层架构虚拟化硬件,运行独立操作系统共享宿主机内核,仅隔离用户空间
启动速度分钟级(需启动完整OS)秒级(直接启动进程)
资源占用高(每个VM都带一个OS)低(仅运行应用+依赖)
可移植性差(依赖特定虚拟化平台)极强(只要支持Docker即可运行)
隔离性强(完整OS隔离)中等(基于命名空间与控制组)

抛开技术概念,从使用感觉上来说:Docker是一个轻量化的虚拟机

Docker 的基本概念

程序员有句口头禅:“我的程序在我的电脑上跑得好好的,怎么一到服务器部署就报错?”

Docker 的出现,正是为了解决这一经典痛点:Docker 是一个开源的容器化平台,它能将应用程序及其所有依赖(代码、库、配置、环境变量等)打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”

三个最核心的概念

镜像(Image):

一个只读的文件系统包。它包含了运行应用所需的一切:文件系统结构、应用程序代码、运行时环境、系统库和配置参数

容器(Container):

容器是镜像的运行实例

这里对程序员来说,最好理解:镜像就是代码文件,容器就是运行中的进程

仓库(Registry):

集中存储和分发镜像的场所:可以理解为软件市场一样的地方

最著名的公共仓库是 Docker Hub

Docker原理的概念

Namespace(命名空间)

命名空间是是 Linux 内核用于实现资源隔离的机制,也可以理解为视图,如果理解数据库的化,就非常好理解了:一个物理表,为了给不同的用户看到各自部分的数据,可以创建一个视图,普通用户只能看到自己的数据,而管理员可以看到所有数据。

在docker中,一共有4个命名空间的概念:

  1. PID Namespace:隔离进程 ID。容器内的第一个进程在其自身的 PID Namespace 中看到的 PID 为 1,而在宿主机上它只是一个拥有普通 PID 的进程。
  2. Mount Namespace:隔离文件系统挂载点。它将镜像中的文件系统挂载为容器的根目录(/),使容器内的文件操作被限制在这个独立的根文件系统之下。
宿主机目录 ────▶ [绑定挂载] ────▶ 容器内部目录
             └─── [命名卷] ────▶ Docker 存储路径(/var/lib/docker/volumes/...
  1. Network Namespace:隔离网络资源。这是 Docker 网络能力的核心。每个容器拥有独立的网络接口、IP 地址、路由表和防火墙规则。Docker 通过创建虚拟网卡对(veth pair),并将一端接入宿主机上的虚拟网桥(如 docker0),来实现容器与宿主机、容器与容器之间的网络通信。
模式描述适用场景
bridge(默认)容器通过 Docker 网桥连接,自动分配IP多容器应用内部通信
host容器直接使用宿主机网络栈高性能网络应用
none无网络,仅保留回环接口安全隔离场景
overlay多主机容器网络(Docker Swarm)集群部署

注:docker 网络值得再写一篇详细解释

  1. 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极大的缓解了开发者和运维者的紧张关系,哈哈