Docker 入门:发展史、核心概念与应用场景

说起 Docker,我最早接触是 2014 年。那时候公司正被「环境不一致」折腾得够呛——开发同学说「我机器上跑得好好的」,运维同学一看日志就炸了。说白了,Docker 就是来终结这种扯皮的。它把应用和依赖打包成一个轻量、可移植的容器,让你再也不必重复「在我这没问题」的尴尬。

1.1 Docker 发展史

Docker 不是凭空冒出来的。它底层依赖了 Linux 容器技术(LXC),但 LXC 用起来门槛高,管理也费劲。2013 年,dotCloud 公司(后来改名 Docker Inc.)开源了 Docker 项目,一下子把容器的使用门槛降到了「一条命令启动应用」的地步。

时间节点 关键事件 我的观察
2008 年 LXC 技术出现在 Linux 内核 当时我还在折腾虚拟机,觉得 LXC 太底层,普通开发者根本用不了
2013 年 Docker 项目开源 第一次跑 docker run 时,我看着秒级启动的容器,心想这玩意儿绝对能改命
2014 年 Docker 1.0 发布,引入镜像仓库 Docker Hub 从那时起,我们团队开始用 Docker 做持续集成环境,每人一台虚拟机的好日子结束了
2015 年 OCI 标准成立,Docker 贡献了 runC 开放容器标准让社区不再依赖单一公司,我参与的很多项目开始放心上容器

为什么要聊这段历史?因为不理解容器技术的演进,你就很难明白为什么 Docker 的「镜像」「容器」「仓库」这三个概念如此关键。它们不是凭空设计的,而是从真实痛点里长出来的。

1.2 三大核心概念

很多人第一次接触 Docker 会被术语绕晕。我习惯用一个类比:镜像 = 类,容器 = 实例,仓库 = 代码托管平台。

说白了,镜像是一个只读的模板,容器是镜像运行起来的进程环境,仓库是存储和分发镜像的地方。

镜像(Image)

镜像是一个轻量、可执行的软件包,包含应用代码、运行时、系统工具、库文件等。它是只读的,通过 Dockerfile 构建。我在项目中遇到过两次踩坑:第一次是忘了清理中间层镜像,结果磁盘被占满;第二次是镜像里装了太多调试工具,导致生产环境镜像体积逼近 2GB。

避坑指南:我曾经只用一条 rm -rf /var/lib/docker 粗暴清理镜像,结果容器数据全丢了。一定用 docker system prune 等安全的命令。

容器(Container)

容器是镜像的运行时实例。它的生命周期包括创建、启动、停止、删除。容器拥有自己的文件系统、网络栈和进程空间,但共享宿主机内核。这也是为什么容器比虚拟机轻量——不需要模拟一个完整操作系统。

你可以用 docker run 一次性完成创建+启动,也可以用 docker create + docker start 分开操作。

# 从 nginx 镜像启动一个容器,映射宿主机 8080 端口到容器 80 端口
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 进入容器交互式终端
docker exec -it my-nginx /bin/bash

# 查看运行中的容器
docker ps

# 停止并删除容器
docker stop my-nginx
docker rm my-nginx

仓库(Registry)

镜像仓库就像 GitHub 但存的是镜像。Docker Hub 是官方的公共仓库,也有企业用的 Harbor、AWS ECR 等。记住:镜像命名规则是 仓库地址/用户/镜像名:标签。

注意:不要在生产环境直接拉取 latest 标签,我吃过亏——某次拉下来的是两天前的新版本,依赖的配置格式变了,服务直接起不来。一定指定明确的版本号。

1.3 应用场景

Docker 能火遍技术圈不是没有理由的。我从个人经验列几个高频场景:

  • 开发环境标准化:团队用同一个 Dockerfile 构建镜像,新人入职只需一条 docker run,半小时就能跑起来应用,省了半天的踩坑时间。
  • CI/CD 流水线:每个构建步骤在独立容器内执行,环境隔离,构建结果就是容器镜像,天然可重复。
    (我以前接过一个项目,因为 Jenkins 节点上残留了旧依赖,构建失败查了两天,用了 Docker 后再没出过这种幺蛾子。)
  • 微服务部署:每个微服务一个容器,资源相互隔离,扩缩容就是启动/停止容器数量。配合编排工具(如 Kubernetes)秒级扩容。
  • 测试环境快速创建:需要 MySQL 5.7 + Redis + RabbitMQ?一条 docker-compose 全搞定,用完即毁,不留垃圾。

下表总结了 Docker 和传统虚拟机的关键对比,方便你理解为什么它更适合现代化应用:

特性 容器 虚拟机
启动速度 秒级 分钟级
内核占用 共享宿主机内核 独立 Guest OS
资源开销 极低(只多一层进程隔离) 高(需要完整 OS)
镜像大小 通常几十 MB 到几百 MB 通常几 GB
环境一致性 从头到尾一致 依赖 Hypervisor 配置

1.4 安装与验证

安装 Docker 本身不难,但我建议无论你用哪个系统,都先读一遍官方文档。下面是我常用的快速安装方式:

Linux(Ubuntu/Debian)

sudo apt-get update
sudo apt-get install ca-certificates curl
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
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

macOS / Windows

直接下载 Docker Desktop(https://docs.docker.com/get-docker/),安装后启动即可。注意 Windows 上需要启用 WSL 2 后端,不然性能会打折扣。

验证安装

安装完成后,跑一条超级经典的 hello-world:

docker run hello-world

如果看到下面这样的输出,说明一切正常:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...(省略后续提示)

接着建议运行一个 nginx 容器做进一步验证:

docker run -d -p 8080:80 nginx:alpine
# 打开浏览器访问 http://localhost:8080,看到 nginx 欢迎页即成功

个人习惯:验证通过后第一时间执行 docker version 和 docker info,检查客户端和服务端版本匹配,以及存储驱动配置是否合理(推荐使用 overlay2)。

知识体系总览

下面这张 SVG 图帮你把本章的核心知识点连起来看:

Docker 核心知识体系 发展史 2013 → LXC → OCI 镜像 (Image) 只读模板,Dockerfile构建 容器 (Container) 镜像的运行实例 仓库 (Registry) 存储/分发镜像 应用场景 CI/CD · 微服务 · 测试 安装与验证 docker run hello-world Docker 核心流程: 写 Dockerfile → 构建镜像 → 推送到仓库 → 拉取并运行容器

嗯,看到这里你应该对 Docker 的来龙去脉、核心组件和典型用法有了整体印象。接下来的章节,我会带你深入 Dockerfile 的编写技巧、镜像优化、多阶段构建等实战内容——不急,一步步来。