云原生核心技术 (2/12): Docker 入门指南——什么是容器?为什么它比虚拟机更香?

摘要

本文是云原生核心技术系列的第二篇,旨在为初学者铺平通往容器世界的大道。我们将深入浅出地剖析 Docker 的三大核心概念:镜像 (Image)、容器 (Container) 和仓库 (Repository)。通过生动的比喻和架构对比,你将清晰地理解为什么容器技术相比传统虚拟机(VM)更轻量、更高效。最后,我们会手把手指导你在不同操作系统上完成 Docker 的安装,并通过运行经典的 hello-world 来验证你的第一个容器环境,为你后续的实战之旅打下坚实基础。


引言:从理想到现实的第一步

在上一篇文章中,我们描绘了云原生的宏伟蓝图,理解了它为何是软件开发的未来趋势。而要将这个蓝图变为现实,我们必须掌握其最核心的基石技术------容器化 。今天,我们将聚焦于容器技术的代名词:Docker

你可能听过 Docker,但它究竟是什么?它和我们熟悉的虚拟机有什么本质区别?为什么大家都说它"更香"?

别急,这篇文章将为你一一解答。我们将从 Docker 的核心概念入手,为你揭开它的神秘面纱,并带领你完成环境搭建,迈出云原生实践的第一步!


一、Docker 核心三剑客:镜像、容器、仓库

要理解 Docker,首先要搞懂它的三个基本组成部分。我们可以用一个非常贴切的比喻来理解它们:做披萨

  1. 镜像 (Image) - "披萨的配方和面团"

    • 定义: Docker 镜像是一个只读的模板,它包含了运行一个应用所需的一切:代码、运行时库、环境变量和配置文件。
    • 比喻: 镜像就像一个制作披萨的"完美配方",上面详细记录了需要哪些面粉(基础系统)、蔬菜(依赖库)、肉类(应用代码),以及烤箱的温度和时间(启动命令)。它是一个静态的、不会被改变的模板。
  2. 容器 (Container) - "烤箱里正在烘焙的披萨"

    • 定义: 容器是镜像的一个运行实例。镜像是静态的,而容器是动态的。我们可以从同一个镜像创建出任意多个相互隔离的容器。
    • 比喻: 如果说镜像是配方,那么容器就是根据这个配方,在烤箱里真正运行、烘焙的那个热气腾腾的披萨。你可以用同一个配方(镜像),同时烤出好几个一模一样的披萨(容器),它们之间互不影响。
  3. 仓库 (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 内核的两个核心技术:

  1. 命名空间 (Namespaces):实现"隔离"

    • 它像给每个容器带上了一副"VR眼镜"。当一个容器启动时,Linux 内核会为它创建一个独立的命名空间。在这个空间里,容器会以为自己拥有独立的进程树(看不到宿主机的其他进程)、网络栈(有自己的IP地址)、挂载点等。它感觉自己就是一台独立的计算机,从而实现了环境的隔离。
  2. 控制组 (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 帮你做了很多事:

  1. Docker 客户端连接到 Docker 守护进程。
  2. 守护进程在本地 查找名为 hello-world 的镜像,发现没有。
  3. 守护进程去公共仓库 Docker Hub 拉取 (pull) 这个镜像。
  4. 下载完成后,守护进程以这个镜像为模板,创建了一个新的容器
  5. 容器启动,执行了镜像中预设的程序,打印出 "Hello from Docker!" 这段信息。
  6. 程序执行完毕,容器自动停止。

总结与预告

恭喜你!你已经成功搭建了 Docker 环境,并亲手运行了你的第一个容器。

今天,我们重点掌握了:

  • Docker 的三大核心组件:镜像 (模板)、容器 (实例)、仓库(商店)。
  • Docker 相比虚拟机的核心优势:轻量、快速
  • Docker 的安装与基础验证。

现在,你已经不再是 Docker 的门外汉了。但是,运行别人做好的镜像只是第一步,真正的乐趣在于创造属于我们自己的东西。

下一篇预告:【云原生核心技术 (3/12): Docker 实战入门------亲手构建并运行你的第一个 Web 应用容器】

我们将带你把一个简单的 Web 应用,打包成一个属于你自己的 Docker 镜像,并让它在容器中欢快地运行起来。真正的实战即将开始,敬请期待!

相关推荐
明长歌1 小时前
【docker】docker registry搭建私有镜像仓库
运维·docker·容器
movie__movie1 小时前
如何正确的配置eureka server集群
云原生·eureka
藥瓿亭4 小时前
K8S认证|CKS题库+答案| 11. AppArmor
运维·服务器·docker·云原生·容器·kubernetes·cks
955.4 小时前
k8s从入门到放弃之Ingress七层负载
云原生·容器·kubernetes
被一米六支配的恐惧4 小时前
argocd部署cli工具并添加k8s集群
docker·kubernetes·argocd
江池俊5 小时前
通过Docker和内网穿透技术在Linux上搭建远程Logseq笔记系统
linux·笔记·docker
昌sit!7 小时前
K8S项目需求分析
云原生·容器·kubernetes
David爱编程9 小时前
Docker 安全全揭秘:防逃逸、防漏洞、防越权,一篇学会容器防御!
后端·docker·容器
广州山泉婚姻10 小时前
高并发场景下的智慧零工平台开发:Spring Boot 3+MyBatis-Flex架构深度实践
分布式·爬虫·云原生
上海运维Q先生10 小时前
Cilium动手实验室: 精通之旅---23.Advanced Gateway API Use Cases
云原生·k8s·cilium