Docker 简介

Docker 是什么

Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker 也为容器提供更强的业界的隔离兼容。

Docker 平台就是一个软件集装箱化平台,这就意味着我们自己可以构建应用程序,将其依赖关系一起打包到一个容器中,然后这容器就很容易运送到其他的机器上进行运行,而且非常易于装载、复制、移除,非常适合软件弹性架构。

Docker 的底层运行原理,如下图:

Docker 服务启动 -> 下载镜像 -> 启动该镜像得到一个容器 -> 容器里运行着我们想要的程序;

  • 主机(Host): 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node 节点;
  • 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API;
  • 镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 就好似 Python 中的类和对象,镜像就是类,容器就是对象。
  • 容器(container):Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。 它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
  • 仓库(repository):仓库(Repository)是集中存放镜像文件的场所。 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括阿里云、腾讯云等,也可以搭建私有仓库 Harbor;

需要正确的理解镜像、容器、仓库的概念

有人会误以为,Docker 就是容器,但 Docker 不是容器,而是管理容器的引擎。

我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

一个容器运行一种服务,当我们需要的时候,就可以通过 docker 客户端创建一个对应的运行实例,也就是我们的容器。

仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。

Docker 容器通过 Docker 镜像来创建。镜像与容器的关系类似于面向对象编程中的类与对象的关系。

Docker 面向对象
镜像
容器 对象

为什么要使用 Docker?

作为一种新兴的虚拟化方式, Docker 跟传统的虚拟化方式相比具有众多的优势。

首先, Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。

其次, Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。

传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。

具体说来, Docker 在如下几个方面具有较大的优势。

  1. 更快速的交付和部署:对开发和运维( devops )人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快。容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
  2. 更高效的虚拟化:Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
  3. 更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
  4. 更简单的管理:使用 Docker ,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发 和更新,从而实现自动化并且高效的管理。

对比传统虚拟机

特性 普通虚拟机 Docker
跨平台 通常只能在桌面级系统运行,例如 Windows、Mac,无法在不带图形界面的服务器上运行 支持的系统多,各种 Windows、Linux 都支持
性能 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来 性能好,只虚拟软件所需运行环境,最大化减少没用的配置
自动化 需要手动安装所有东西 一个命令、或者一个文件就可以自动部署好所需环境
稳定性 稳定性不高,不同系统差异大 稳定性好,不同系统都一样部署方式

当然 Docker 也是存在缺点的,就是隔离性差,多个容器共用宿主机的内核, 各应用之间的隔离不如虚拟机彻底

Docker 与 Vibe Coding 的关系

Vibe Coding 把"写代码"外包给了 AI,产出速度快了十倍。但有一件事没有外包出去——环境仍然是你的。

而且 AI 生成代码是概率性的:它不是一次写对,而是反复试错、反复安装依赖。让 AI 试十次,你的本地环境就被折腾成一个全世界独一份、你自己也解释不清的状态。能跑,但你不敢碰,更不敢换台机器复现。

这就是 Vibe Coding 的隐藏代价:写代码的时速,会等比例转化成环境变乱的时速。​

Docker 在这里扮演三个角色。

  1. 试错成本归零 你的 AI 助手拥有 shell 权限。它可能执行 rm -rf、全局装一堆包、改动系统配置——而"不看它敲了什么,全盘接受"恰恰是 Vibe Coding 的常态。在宿主机上这么玩,是在拿系统赌 AI 不犯傻。

    放进容器后逻辑完全不同:跑崩了删掉重来,几十秒复原,宿主机毫发无损。AI 想装什么装什么,装废了只是一层镜像的事。

    这件事的重要性,Docker 官方已经用产品给出了答案——2026 年发布的 Docker Sandboxes 用 microVM 级别的隔离运行 AI agent,网络策略默认全部拒绝。连 Docker 自己都认定了:容器在 AI 时代的角色,是让你可以放心地不看懂代码。

  2. 终结"在我机器上能跑" Vibe Coding 最经典的翻车现场:本地 localhost 跑得好好的,一部署就崩。错的不是代码,是环境——本地 Python 3.12,服务器是 3.9;本地有某个库,服务器没有。而 AI 有明显的快乐路径(happy path)​倾向,只保证"能跑通"的最简情况,它并不知道你的生产环境长什么样。

    Docker 把环境本身变成可交付物。镜像一打包,本地跑通的那个状态可以原封不动搬到任何机器。这不只是在解决部署问题,更是在给 AI 生成的代码兜底——你不需要搞清楚 AI 到底依赖了什么,镜像替你记住了。

  3. Dockerfile 是人与 AI 之间的环境契约 Dockerfile 是纯文本的、声明式的、可版本控制的——这恰好是 AI 最擅长生成、也最擅长读懂的格式。

    |问法|得到的| |"这个项目怎么配环境?"| 一段散文,还得你自己执行、自己排错| |"给我写个 Dockerfile"|一份可执行的、能反复重建的说明书|

反过来,把项目里的 Dockerfile 贴给 AI,它立刻知道你用的什么运行时、装了哪些依赖,不需要猜测。在 Vibe Coding 的语境里,Dockerfile 是你和 AI 之间关于环境的唯一可靠契约。

总结来说,Vibe Coding 让你以十倍速写出代码,Docker 让你敢以十倍速写。没有 Docker,你只是把混乱的速度也一起放大了十倍。Vibe Coding 是油门,Docker 是刹车——只装油门的车你不敢开快