关于Docker,我们首先要搞清楚这是个什么东西。一般来说只有当我们需要与本地截然不同的运行环境(或者需要模拟服务器),但是真正运行的内容又很少不想搞虚拟机的时候,我们就会选择使用Docker来构建一套运行环境支持特定的软件运行。
用AI的话说就是,当我们需要一个隔离、可复现、可移植的运行环境,又不想使用完整虚拟机时,可以用 Docker 把应用和依赖打包成容器来运行。
Docker长这样,人送外号小鲸鱼。

网址在这:Get Started | Docker

Docker 的基本使用流程是:先编写 Dockerfile 描述应用需要的运行环境、依赖安装方式和启动命令,然后用 docker build 构建成镜像,再用 docker run 从镜像启动容器;如果需要多个服务协同运行,比如应用、数据库、Redis,则编写 docker-compose.yml,用 docker compose up 一次性启动整套环境。简单说就是:写 Dockerfile -> 构建镜像 -> 运行容器 -> 用 Compose 管理多个容器
真正看使用教程的可以自己去问AI或者看看别的帖子,Docker 教程 | 菜鸟教程这是菜鸟中的教程,今天我写这个帖子更多想聊聊他的底层原理,因为他其中涉及到了一部分操作系统。比如说,当你在使用的时候,会不会有这些问题:

Docker为什么可以做到在一台计算机上实现完全不同的配置,如何保证与本机的配置不产生冲突?Docker的底层原理是什么?为什么可以这样做?

Docker 之所以能在一台计算机上提供“看起来完全不同”的运行配置,是因为它不是直接使用本机的应用环境,而是为程序创建了一个隔离的运行空间。容器里的程序看到的是镜像提供的文件系统、依赖库、环境变量、启动命令和网络环境,而不是宿主机原本的配置。比如本机没有安装 Redis、Python 3.11 或 nginx,容器里依然可以有这些软件;本机装的是 Python 3.9,容器里也可以运行 Python 3.11。它们不会冲突,是因为容器默认不会把自己的 /usr/bin/etc、依赖库等内容写到宿主机系统目录里,容器的改动通常只发生在自己的可写层中。

Docker 的底层原理主要依赖操作系统内核的隔离能力。在 Linux 中,Docker 使用 namespace 隔离进程、文件系统挂载点、网络、主机名、用户和进程间通信;使用 cgroups 限制 CPU、内存、磁盘 IO 等资源;使用 OverlayFS 这类联合文件系统把镜像分成多层,并在运行容器时叠加一层可写层。这样,容器本质上仍然是宿主机上的进程,但这个进程被限制在一个独立的“视角”里:它看到自己的进程列表、自己的网络端口、自己的根文件系统和自己的环境变量。

因此,Docker 能保证和本机配置不冲突,关键在于“隔离”和“显式连接”。容器默认和宿主机隔开,只有当你主动做端口映射、目录挂载、环境变量传入时,容器才会和宿主机发生明确联系。例如容器内部可以监听 80 端口,但只有执行 -p 8080:80 时,宿主机的 8080 端口才会转发到容器的 80 端口;容器内部修改文件,也不会影响宿主机目录,除非你用 -v 把宿主机目录挂载进去。

所以 Docker 并不是像虚拟机那样完整模拟一台新电脑,也不是安装了另一个完整操作系统。它更像是利用操作系统内核提供的隔离机制,把应用进程包在一个独立环境里运行。正因为容器共享宿主机内核,而不是每个容器都启动一个完整系统,所以 Docker 比传统虚拟机更轻量、启动更快。但也正因为共享内核,Linux 容器依赖 Linux 内核能力;在 Windows 或 macOS 上运行 Linux 容器时,Docker Desktop 背后通常会通过轻量 Linux 虚拟机来提供这些内核能力。

最后一句话总结:Docker 的基本底层原理是:利用 Linux 内核的 namespace 做环境隔离、cgroups 做资源限制、OverlayFS 做分层文件系统,把应用进程包装成一个相对独立、可移植、轻量的容器运行环境。

更多推荐