基本概念

容器通常被类比为集装箱。将应用程序及其所有依赖项打包到一个独立的容器中。因此具有隔离型和可移植性。使开发人员专注应用程序本身,无需过多关注底层差异。

容器的核心特性

主要依赖两个核心特性:

  • 命名空间 Namespace
  • 控制组 cgroups

Namespace技术

以PID Namespace为例:Linux系统中是通过进程号PID来作为程序执行标识的。比如当PID为100的进程后面,本应该是PID为101的进程。但是我们让它以为自己是PID=1,也就是他看不到前面的其他进程,也就是给它创造一个全新的进程空间。这样,就隔离了宿主机的真正进程空间,也隔离了其他PID Namespace的进程空间。

类似地,还有:

  • UTS(Unix Timesharing System)命名空间:容器可以有自己的主机名和域名
  • IPC(Inter-Process Communication)命名空间:容器内的进程无法直接与其他容器或宿主机进行进程间通信
  • Mount(挂载)命名空间:容器可以拥有自己的文件系统视图
  • Network(网络)命名空间:每个容器拥有独立的网络接口、IP地址和路由表

cgroups技术

通过限制容器中的进程资源使用情况,如CPU使用率、内存使用量、磁盘IO等。保证各个容器在运行时不会耗尽宿主机的资源。

以上两个技术是通过调用Linux内核的API来实现的。

容器化的优缺点

优点 原因
轻量级 容器共享宿主机的内核,避免了传统虚拟机的额外操作系统开销,使得容器更加轻量级。
快速启动和停止 容器可以在几秒钟内启动和停止,相比传统虚拟机更快速,提高了应用程序的部署和扩展效率。
灵活可移植 容器可以在任何支持容器运行时的环境中运行,跨平台可移植性非常强,方便在不同环境中部署应用程序。
资源利用率高 由于容器共享宿主机的内核,多个容器可以在同一宿主机上运行,提高了资源利用率和硬件的有效使用。
高度隔离 容器使用命名空间和控制组实现进程之间的隔离,确保应用程序在容器内部运行时与其他容器相互隔离。
便于版本管理 容器镜像可以进行版本控制,方便应用程序版本的追踪和回滚,确保应用程序在不同环境中始终保持一致。
方便横向扩展 容器可以通过水平扩展方式增加或减少实例数量,实现应用程序的弹性伸缩,适应不同负载情况。
缺点 原因
单一内核依赖 容器共享宿主机的内核,如果宿主机的内核存在问题或不稳定,可能会影响到所有容器的运行稳定性。
安全性问题 容器之间的隔离性虽然较高,但不同容器共享同一宿主机的内核,容器的安全性仍需加强,特别是在多租户环境。
资源限制管理 容器的资源限制需要谨慎管理,如果配置不当,可能会导致某个容器占用过多资源,影响其他容器的正常运行。
不适合图形界面应用程序 容器通常用于运行后端服务和命令行应用程序,对于图形界面应用程序的支持相对有限。
复杂性 使用容器涉及到更多的技术栈和工具,如容器编排工具等,对于初学者来说可能需要学习和适应一定的学习曲线。
容器镜像大小 有时候容器镜像的大小可能较大,特别是在包含大量依赖库和文件的情况下,会增加镜像传输和存储的开销。

Docker基本概念

Docker是一种流行的容器化技术。

image.png

镜像(images)

镜像是静态文件,由一组文件构成,提供容器运行时所需的程序库、资源、配置参数等。

这里涉及到一个概念:联合文件系统(UnionFS),docker用到的是其中的AUFS(Advanced Multi-Layered Unification Filesystem)技术。 image.png

特点:每一层都是基于上一层的修改,上层可访问下层。

优点:

  • 方便维护
  • 节省空间 image.png

容器(container)

是由镜像运行后得到的环境,即linux环境。可以在上面部署、运行应用程序。

仓库(Registry)

存放镜像的集合,可用于镜像的共享。存在公有(也称为Docker Hub)和私有的仓库类型。 image.png

image.png

Dockerfile

用于构建镜像的文本文件,里面包含构建镜像的指令和说明,每一条指令对应Docker镜像中的每一层。

Docker Daemon 和 Docker Clinet

前者是Docker守护进程,负责管理Docker对象,如镜像、容器、网络和数据卷等。Docker客户端通过REST API或命令行与Docker Daemon进行通信来执行操作。

后者是Docker客户端。通过docker命令或其他客户端工具(如Docker Compose)与守护进程通信。

Docker网络(Docker Networking)

实现容器间、容器和宿主机之间的通信

Docker数据卷(Docker Volume)

Docker数据卷用于在容器间共享和持久化数据。数据卷可以将主机文件系统路径或其他容器的文件系统路径挂载到容器中,确保数据在容器重启或迁移时不丢失。