摘要
本文是云原生核心技术系列的第二篇,旨在为初学者铺平通往容器世界的大道。我们将深入浅出地剖析 Docker 的三大核心概念:镜像 (Image)、容器 (Container) 和仓库 (Repository)。通过生动的比喻和架构对比,你将清晰地理解为什么容器技术相比传统虚拟机(VM)更轻量、更高效。最后,我们会手把手指导你在不同操作系统上完成 Docker 的安装,并通过运行经典的 hello-world
来验证你的第一个容器环境,为你后续的实战之旅打下坚实基础。
引言:从理想到现实的第一步
在上一篇文章中,我们描绘了云原生的宏伟蓝图,理解了它为何是软件开发的未来趋势。而要将这个蓝图变为现实,我们必须掌握其最核心的基石技术------容器化 。今天,我们将聚焦于容器技术的代名词:Docker。
你可能听过 Docker,但它究竟是什么?它和我们熟悉的虚拟机有什么本质区别?为什么大家都说它"更香"?
别急,这篇文章将为你一一解答。我们将从 Docker 的核心概念入手,为你揭开它的神秘面纱,并带领你完成环境搭建,迈出云原生实践的第一步!
一、Docker 核心三剑客:镜像、容器、仓库
要理解 Docker,首先要搞懂它的三个基本组成部分。我们可以用一个非常贴切的比喻来理解它们:做披萨。
-
镜像 (Image) - "披萨的配方和面团"
- 定义: Docker 镜像是一个只读的模板,它包含了运行一个应用所需的一切:代码、运行时库、环境变量和配置文件。
- 比喻: 镜像就像一个制作披萨的"完美配方",上面详细记录了需要哪些面粉(基础系统)、蔬菜(依赖库)、肉类(应用代码),以及烤箱的温度和时间(启动命令)。它是一个静态的、不会被改变的模板。
-
容器 (Container) - "烤箱里正在烘焙的披萨"
- 定义: 容器是镜像的一个运行实例。镜像是静态的,而容器是动态的。我们可以从同一个镜像创建出任意多个相互隔离的容器。
- 比喻: 如果说镜像是配方,那么容器就是根据这个配方,在烤箱里真正运行、烘焙的那个热气腾腾的披萨。你可以用同一个配方(镜像),同时烤出好几个一模一样的披萨(容器),它们之间互不影响。
-
仓库 (Repository) - "披萨连锁店的中央厨房"
- 定义: 仓库是集中存放和分发镜像的地方。
- 比喻: 仓库就像一个巨大的"披萨配方"存储中心。最著名的公共仓库是 Docker Hub,它像一个全球性的应用商店,你可以在上面找到几乎所有常用软件的官方镜像(如 Nginx, Redis, MySQL)。当然,你也可以搭建自己的私有仓库,存放公司的项目镜像。
三者关系总结: 我们从仓库 (Repository) 下载一个镜像 (Image) ,然后以这个镜像为模板,运行一个(或多个)容器 (Container)。
二、Docker vs. 虚拟机 (VM):一场轻与重的对决
很多人会问:"容器听起来和虚拟机好像,都是隔离环境,它们到底有什么区别?"
区别巨大!一张图就能看懂:
虚拟机 (VM):
- 架构: 在物理服务器的操作系统之上,安装一个Hypervisor (虚拟化管理程序),然后在其上创建多个虚拟机。每个虚拟机都包含一个完整的、独立的客户机操作系统 (Guest OS)。
- 缺点: 因为每个 VM 都自带一个操作系统,所以它非常"重"。一个典型的 VM 镜像大小可能是几十 GB,启动需要数分钟。
Docker 容器:
- 架构: 在物理服务器的操作系统之上,安装一个Docker 引擎 。所有容器共享宿主机的操作系统内核,容器内部只打包应用运行所需的库和二进制文件。
- 优点: 因为不包含独立的操作系统,所以它极其"轻"。一个 Docker 镜像大小通常只有几十 MB 到几百 MB,启动是秒级的!
简单总结: 虚拟机是硬件级别 的隔离,模拟了一整台电脑;而 Docker 是进程级别的隔离,更加轻量和高效。这就像住酒店,虚拟机是给你分了一栋独立别墅(配套齐全但笨重),而 Docker 是给了你一个精装单间(共享酒店设施但拎包入住)。
三、Docker 的工作原理:两大幕后英雄
Docker 如此神奇,它到底是如何实现隔离的呢?这主要归功于 Linux 内核的两个核心技术:
-
命名空间 (Namespaces):实现"隔离"
- 它像给每个容器带上了一副"VR眼镜"。当一个容器启动时,Linux 内核会为它创建一个独立的命名空间。在这个空间里,容器会以为自己拥有独立的进程树(看不到宿主机的其他进程)、网络栈(有自己的IP地址)、挂载点等。它感觉自己就是一台独立的计算机,从而实现了环境的隔离。
-
控制组 (Cgroups):实现"限制"
- 如果说命名空间是"看不见别人",那么控制组就是"管好自己"。Cgroups 负责限制和审计一个进程组(也就是一个容器)可以使用的资源,比如 CPU 的使用率、内存的上限、磁盘 I/O 的速度等。这确保了单个容器不会因为资源滥用而拖垮整个宿主机。
一句话总结: Namespaces 负责让容器感觉自己是独立的,Cgroups 负责限制这个容器能用多少资源。
四、实践环节:安装你的 Docker 环境
理论讲完了,让我们动手吧!
1. Windows / macOS 用户
对于桌面用户,最简单的方式是安装 Docker Desktop。它是一个集成了 Docker 引擎、Kubernetes 和图形化管理界面的强大工具。
- 下载地址: https://www.docker.com/products/docker-desktop/
- 安装要求:
- Windows: 建议使用 Windows 10/11 Pro 或更高版本,并启用 WSL 2 (Windows Subsystem for Linux 2) 功能。安装程序会自动引导你完成。
- macOS: 支持较新的 macOS 版本即可。
- 安装步骤: 下载安装包,双击运行,像安装普通软件一样按提示操作即可。安装完成后,启动 Docker Desktop。
2. Linux 用户 (以 Ubuntu 为例)
对于 Linux 服务器,我们通常安装 Docker Engine。
bash
# 1. 卸载旧版本(如果有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 设置 Docker 的 APT 仓库
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# 3. 添加 Docker 的官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 4. 设置仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 6. (可选但推荐) 将当前用户添加到 docker 组,避免每次都用 sudo
sudo usermod -aG docker $USER
# 注意:执行此命令后,你需要退出当前终端会话并重新登录才能生效!
五、验证安装:运行你的第一个容器!
无论你使用哪种系统,安装完成后,打开你的终端(Windows 用户可以使用 PowerShell 或 CMD),让我们来验证一下。
第一步:检查 Docker 版本
输入以下命令,如果能看到版本信息,说明 Docker 已成功安装并运行。
bash
docker --version
输出可能类似:Docker version 24.0.5, build ...
第二步:运行 hello-world
容器
这是 Docker 官方提供的一个教学镜像,让我们运行它!
bash
docker run hello-world
当你敲下回车后,会看到类似下面的输出:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
...
Digest: sha256:...
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
发生了什么?
这个简单的命令背后,Docker 帮你做了很多事:
- Docker 客户端连接到 Docker 守护进程。
- 守护进程在本地 查找名为
hello-world
的镜像,发现没有。 - 守护进程去公共仓库 Docker Hub 拉取 (pull) 这个镜像。
- 下载完成后,守护进程以这个镜像为模板,创建了一个新的容器。
- 容器启动,执行了镜像中预设的程序,打印出 "Hello from Docker!" 这段信息。
- 程序执行完毕,容器自动停止。
总结与预告
恭喜你!你已经成功搭建了 Docker 环境,并亲手运行了你的第一个容器。
今天,我们重点掌握了:
- Docker 的三大核心组件:镜像 (模板)、容器 (实例)、仓库(商店)。
- Docker 相比虚拟机的核心优势:轻量、快速。
- Docker 的安装与基础验证。
现在,你已经不再是 Docker 的门外汉了。但是,运行别人做好的镜像只是第一步,真正的乐趣在于创造属于我们自己的东西。
下一篇预告:【云原生核心技术 (3/12): Docker 实战入门------亲手构建并运行你的第一个 Web 应用容器】
我们将带你把一个简单的 Web 应用,打包成一个属于你自己的 Docker 镜像,并让它在容器中欢快地运行起来。真正的实战即将开始,敬请期待!