首页
/ Docker 与 CS 自学:从 Image、Container 到环境部署的完整指南(cs-self-learning)

Docker 与 CS 自学:从 Image、Container 到环境部署的完整指南(cs-self-learning)

2026-09-04 17:20:38作者:牧宁李

本文基于 cs-self-learning(计算机自学指南)的 Docker 章节 展开:先讲清楚 Docker 为什么能解决“配环境”这一自学路上的最大障碍,再梳理 Image、Container 等核心概念与日常最常用的命令行操作,最后给出原文档推荐的完整学习路径,以及本仓库中多门课程使用 Docker 作为实验环境的真实佐证。读完之后,你将能够用 Docker 快速拉起任意开源课程或项目的运行环境,并为进一步学习容器技术(如 Kubernetes)建立清晰路线。

一、为什么使用 Docker:配环境是自学路上最大的障碍

使用别人写好的软件或工具,最大的障碍往往不是代码本身,而是配环境。依赖版本不对、系统库缺失、编译链冲突……这些环境配置带来的折磨会极大地消解你对软件和编程本身的兴趣。

虚拟机(Virtual Machine)可以解决配环境的一部分问题:把整个操作系统装进一个文件里,环境再乱也不会污染宿主机。但虚拟机庞大笨重——启动慢、占资源多,为了某个应用的环境配置去模拟一整套全新的操作系统,往往得不偿失。

Docker 的思路是:用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的运行环境被打包为一个个 image(镜像),可以在不同平台的一个个 container(容器)中自由运行,这极大地节省了所有人的时间成本。

从原理上看,两者的差别在于隔离的层次:

维度 虚拟机 容器(Docker)
隔离对象 完整的客户机操作系统(模拟硬件) 宿主机的用户态运行环境(共享宿主内核)
启动速度 分钟级(要启动整个 OS) 秒级甚至更快(只是拉起进程)
资源开销 GB 级内存、独立磁盘镜像 通常只需应用本身占用的内存与磁盘
典型用途 运行不同内核/发行版、硬件级隔离 同一宿主内核上的应用级打包与部署

可以简单总结为:虚拟机隔离的是“硬件上的操作系统”,容器隔离的是“操作系统内的运行环境”。正因为不重复携带内核与引导系统,容器才能做到“即拉即用”,这也正是它在课程实验、CI/CD、服务部署中无处不在的原因。

二、核心概念:Image、Container 与 Registry

要熟练使用 Docker,需要先建立几个核心概念的对应关系。

Image(镜像):只读的应用模板,包含应用代码、运行时、库和一切依赖文件。它采用分层结构(layered filesystem),每一层对应构建时的一步操作,层可以被复用和缓存,这是镜像下载快、体积省的根本原因。

Container(容器):镜像的运行实例。镜像提供“装好了什么”,容器决定“正在跑什么”。同一个镜像可以同时启动多个容器,彼此的文件系统、进程、网络相互隔离。

Registry(镜像仓库):存放和分发镜像的中心化服务,docker pull / docker push 的对象就是仓库中的镜像。

Dockerfile:以声明式指令描述“如何构建一个镜像”的文本文件,docker build 按其中的指令逐层执行并生成新镜像。

Docker Engine(守护进程):后台常驻的 dockerd,负责镜像管理、容器生命周期和网络/存储驱动。你在终端输入的 docker ... 命令由客户端程序解析后发给 daemon 执行(在 Linux 上通常经由 Unix socket 通信)。适用前提说明:Docker 的容器本质上是 Linux 容器;在 Windows/macOS 上使用桌面端时,Linux 内核由一个轻量虚拟化层承载,这是平台实现细节,不影响日常命令的使用方式。

原文档 cs-self-learning 学习规划 中对 Docker 的一句话定位也可以作为记忆锚点:“一款相较于虚拟机更轻量级的软件打包与环境部署工具”。

三、日常最常用的 Docker 命令实操

官方文档当然是最好的初学教材,但正如原文档所说——“最好的导师一定是你自己,尝试去使用 Docker 才能享受它带来的便利”。下面这套命令覆盖了绝大多数日常场景,可以直接复制练习。

3.1 拉取与运行

# 拉取一个镜像
docker pull nginx

# 查看本地已有镜像
docker images

# 用 nginx 镜像启动一个后台 Web 服务,映射宿主机 8080 端口到容器 80 端口
docker run -d --name web -p 8080:80 nginx

参数说明:

  • -d:后台(detached)运行,不把容器日志打印到当前终端;
  • --name web:给容器起名,后续用名字而不是容器 ID 操作;
  • -p 8080:80:端口映射,格式为 宿主机端口:容器端口
  • 不加 -it 是因为这是长期运行的服务;若是交互式命令行场景(例如进入一个 shell),则用 -it(分配伪终端并保持标准输入打开)。

3.2 查看与排查

# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 查看某个容器的输出日志
docker logs web

# 在运行中的容器里执行命令(如进入 shell 调试)
docker exec -it web sh

3.3 停止、清理与删除

docker stop web        # 停止容器
docker start web       # 重新启动
docker rm web          # 删除容器(需先停止)
docker rmi nginx       # 删除镜像

3.4 带数据卷的完整示例

容器是临时的,但数据不应该随容器消失。-v 可以把宿主机目录挂载进容器:

# 把当前目录下的 ./html 挂载到容器的 /usr/share/nginx/html
docker run -d --name static -p 8081:80 -v ./html:/usr/share/nginx/html nginx

./html 中的修改会实时反映在 Web 页面中,这是开发调试中最常用的技巧之一。

3.5 图形界面:桌面端

Docker 在工业界发展迅猛并已经非常成熟,如果你偏好用图形界面管理镜像、容器、网络与卷,可以下载它的桌面端(Docker Desktop),用可视化方式完成上面所有操作,命令行与图形界面操作的是同一个 daemon。

四、构建自己的镜像:一份可直接使用的 Dockerfile

打包“应用 + 环境”正是 Docker 的核心价值。一个典型的 Python 应用 Dockerfile 如下,每一行都对应前文讲过的“分层”概念:

# 基于官方 Python 精简镜像,作为构建起点
FROM python:3.12-slim

# 设置容器内的工作目录
WORKDIR /app

# 先只复制依赖清单:利用层缓存,代码变动时不必重复安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 再复制全部应用代码
COPY . .

# 声明容器对外服务的端口(元信息,实际映射仍靠 docker run -p)
EXPOSE 8000

# 容器启动时执行的默认命令
CMD ["python", "app.py"]

构建与运行:

# 在 Dockerfile 所在目录执行,-t 为镜像命名并打标签
docker build -t myapp:1.0 .

# 运行刚构建的镜像
docker run -d --name myapp -p 8082:8000 myapp:1.0

几个值得注意的工程细节:

  • FROM 选择的基础镜像决定容器的整体体积与安全性,优先选 -slimalpine 之类的精简变体;
  • COPY 依赖清单再 COPY 代码,是为了让依赖安装这一层尽量命中缓存——这是分层结构带来的直接收益;
  • 需要定义由多个容器组成的应用(例如 Web + 数据库)时,可以使用 Docker Compose,用一份 YAML 文件声明全部服务及其网络与依赖关系,一次性启动。

五、如何学习 Docker:原文档推荐的完整路径

本节完整继承 Docker.md(对应英文版本见 Docker.en.md)给出的学习建议:

  1. 官方文档打底:Docker 官方文档是最好的初学教材,概念解释严谨且持续更新,建议与本文的概念章节对照阅读。
  2. 以用代学:最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。哪怕只是把某个练习项目的运行环境搬进容器,也是扎实的一步。
  3. 桌面端辅助:如前所述,桌面端提供图形界面,适合在命令行还不熟练时建立直观感受。
  4. 造轮子加深理解:如果你和我(原作者)一样是疯狂的造轮子爱好者,不妨亲手写一个“迷你 Docker”(作者的项目 rubber-docker)来加深理解——实现一个简化版容器构建器,会倒逼你真正弄懂镜像分层、chroot、挂载这些底层机制。
  5. 系统课程补强:KodeKloud 的《Docker for the Absolute Beginner》课程全面介绍了 Docker 的基础功能,有大量配套练习,并提供免费的云环境完成练习,不会在本地环境问题上卡壳。作者同时强烈推荐其云相关进阶课程(如 Kubernetes):虽然需要付费,但讲解非常仔细,适合从 0 开始的新手,且配有 Kubernetes 实验环境,不用被搭建环境劝退。
  6. 配合仓库内的 Linux 课程:如果还想补齐 Linux 基础,可以参考本仓库推荐的 UCB Sysadmin DeCal 课程,该课程十二周内容覆盖 Linux 基础、shell 编程、包管理、Git,以及 Docker、Kubernetes、CUDA 等主题,与 Docker 学习形成良好衔接。

六、仓库实证:Docker 如何支撑 CS 自学实验环境

“容器解决配环境”这句话在 cs-self-learning 收录的多门课程中都有真实落地,这也说明 Docker 能力对自学者是刚需而非锦上添花:

  • 操作系统实验CS162(北大操作系统实验班) 使用 Pintos 作为课程项目,作者团队“利用 Docker 配置了跨平台的实验环境”,自学的同学可以直接按实验文档在容器里完成操作系统实验,而无需在宿主机上折腾交叉编译链。
  • 编译原理实验PKU-Compilers 明确“提供基于 Docker 的实验环境,一键配置”,环境中还附带自动测试脚本,可以一键测试你写出的编译器——这正是“镜像打包环境 + 容器即开即用”价值的典型体现。
  • 系统安全实验SEED Labs 提供基于虚拟机与 Docker 的现成攻防环境,覆盖软件安全、网络安全、Web 安全、操作系统安全等方向,自学者无需从零搭建靶场。
  • 学习规划定位:在 CS 学习规划 中,Docker 被列为“必学工具”之一;同一页面还推荐了 DevOps-Guide 开源项目作为扩展学习资源,其中涵盖 Docker、Kubernetes、Linux、CI-CD、GitHub Actions 等运维基础知识与教程。

这些案例可以归纳出一条自学路径:先用容器“借环境”学课程 → 再写 Dockerfile“造环境”打包自己的项目 → 最后走向 Kubernetes 等编排系统做“管环境”

七、小结

  • Docker 用轻量容器替代整套虚拟机来解决“配环境”问题,应用连同环境被打包为 image,以 container 的形式在平台间自由运行;
  • 掌握 pull / run / ps / logs / exec / stop / rm-p-v-it-d 等参数,就覆盖了绝大多数日常操作;
  • 会写 Dockerfile(FROM 起步、合理分层、COPY 依赖清单在前)是从“用 Docker”走向“用 Docker 交付”的关键一步;
  • 学习路径上:官方文档打底、亲手使用为主、桌面端辅助、迷你 Docker 造轮子深化原理、KodeKloud 课程系统补强,再衔接 Kubernetes 进阶;
  • 本仓库中 CS162、PKU-Compilers、SEED Labs 等课程均用 Docker 承载实验环境,可直接作为练习素材,验证本文全部命令与概念。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
982
502
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384