云原生核心技术 (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 镜像,并让它在容器中欢快地运行起来。真正的实战即将开始,敬请期待!

相关推荐
努力打怪升级几秒前
ACA云原生工程师认证知识点脑图
云原生
龙门吹雪24 分钟前
Docker 安装 canal 详细步骤
运维·docker·容器·canal·mysql binlog 日志·增量数据订阅消费
杨浦老苏2 小时前
文件共享应用程序Palmr
docker·群晖·网盘
小白不想白a3 小时前
【Ansible】使用ansible部署k8s集群前的准备工作脚本
容器·kubernetes·ansible
啥也不会的小胡3 小时前
深入理解 Docker:从入门到实践
docker·容器
极客天成ScaleFlash9 小时前
极客天成让统一存储从云原生‘进化’到 AI 原生: 不是版本升级,而是基因重组
人工智能·云原生
Lin_Aries_042110 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
小闫BI设源码10 小时前
Dockerfile
云原生·eureka·日志收集·自动重启·容器监控·健康检查·生产环境部署
人逝花落空.11 小时前
docker容器的三大核心技术UnionFS(下)
运维·docker·容器
Insist75311 小时前
基于OpenEuler部署kafka消息队列
分布式·docker·kafka