Frank's Lab

Back

“明明在我的电脑上是可以运行的。”

在部署 OpenChain 时,我曾深陷环境配置的泥潭。虚拟机当然可以解决环境隔离问题,但它也带来了资源占用高、操作冗余、启动缓慢等问题。相比之下,Docker 更轻,也更适合开发环境复现。

另外,在摸索用 Docker 配置 Ubuntu 环境运行 DataLab 时,我发现网上教程并不多。已有内容也经常充满术语和跳步,对新手不太友好。所以这篇文章会尽量用平实的方式,把 Docker 基本概念和 DataLab 环境配置讲清楚。

1. Docker 介绍#

1.1 容器化是什么#

Docker 是一个开源容器化平台。它通过操作系统级虚拟化技术,把应用程序及其依赖环境(代码、运行时、系统工具、系统库等)打包成标准化、轻量级的容器(Container)。

相较于传统虚拟机:

特性Docker容器虚拟机
虚拟化层级OS级硬件级
启动速度秒级分钟级
资源占用MB级GB级
性能损耗<5%15-20%
镜像大小通常<100MB通常>1GB

(数据来源:Docker官方基准测试报告)

1.2 核心概念解析#

  • 镜像(Image):不可变的模板文件,包含构建容器所需的完整指令。
  • 容器(Container):镜像的可运行实例,拥有独立文件系统和资源隔离。
  • 仓库(Registry):用于存储和分发镜像的服务,例如 Docker Hub。
  • Volume:持久化数据存储方案,用来突破容器生命周期限制。

2. Docker安装#

2.1 Windows 11 专业版安装指南#

  1. 访问 Docker Desktop for Windows -> 下载安装包。

  2. 启用系统级支持:

    • 控制面板 → 程序 → 启用或关闭 Windows 功能;
    • 勾选「Hyper-V」和「Windows Subsystem for Linux」。
  3. 安装时选择 WSL2 后端:

    # 验证 WSL 版本
    wsl --list --verbose
    
    # 设置默认版本
    wsl --set-default-version 2
    powershell
    • 架构选择建议
      • WSL2:推荐开发使用,提供完整 Linux 内核,I/O 性能更好。
      • Hyper-V:适合企业级应用,支持动态内存分配、故障转移集群等高级虚拟化功能。

2.2 镜像加速配置#

针对国内网络环境,可以配置 USTC 镜像源,提升镜像下载稳定性和速度。

image.png

打开 Docker Desktop → Settings → Docker Engine,替换 daemon.json 配置:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "features": {
    "buildkit": true // 启用新一代构建工具
  },
  "experimental": false // 生产环境禁用实验特性
}
json

应用配置并重启服务:

systemctl restart docker  # Linux
Get-Service docker | Restart-Service  # PowerShell
bash

3. 配置 Docker 镜像与容器#

3.1 拉取 Ubuntu 镜像#

可以直接在 Docker Desktop 图形界面中搜索 Ubuntu,然后拉取最新版本:

也可以使用命令行:

docker pull ubuntu:latest
bash

3.2 创建容器#

图形化创建时,重点关注几个配置:

image.png

  • Container name:容器名称,自定义即可。
  • Port:端口映射,根据实际服务需要配置。
  • Volume:卷挂载,用于设置主机和容器之间的共享目录。这样可以在主机上编辑代码,在容器内编译和运行。
  • Environment variables:环境变量,DataLab 场景下暂时可以不配置。

命令行创建示例:

docker run -it -v <Host path>:<Container path> --name <Container name> ubuntu:latest
bash

4. 配置 DataLab 环境#

进入容器后,按下面步骤配置 DataLab:

  1. 更新软件包列表:

    apt-get update
    bash
  2. 安装 wget

    apt-get install -y wget
    bash
  3. 切换到共享文件夹:

    cd CSapp
    bash
  4. 从官网下载 DataLab 源码包:

    wget http://csapp.cs.cmu.edu/3e/datalab-handout.tar
    bash
  5. 解压源码包:

    tar xvf datalab-handout.tar
    bash
  6. 进入 datalab-handout 文件夹。

  7. 安装编译所需工具:

    apt install -y build-essential
    bash

    build-essential 包含 GCC、G++、make 以及其他编译所需的基础库和头文件。

5. Finish#

接下来就可以在本机编辑器中编写 bit.c,再到 Docker 里的 Ubuntu 环境中编译和运行代码。

容器化不是银弹,但它确实是现代软件工程的基本技能。当再次面对 “Works on my machine” 的困境时,我们至少可以更有底气地说:It works on Docker.

References#

Docker 从入门到实践:以 DataLab 环境配置为例
https://frank-whw.com/blog/articles/docker-datalab-practice
Author Frank
Published at 2025年2月7日