第一章:Docker基础入门

1.1 Docker是什么?

Docker,说白了就是一个「集装箱」系统。

你想想看,我们做软件交付最头疼的是什么?环境不一致。开发说「我这儿跑得好好的」,运维说「我这儿就是起不来」。这种扯皮事儿,我干了十年运维,见得太多了。

Docker 的解决思路很简单——把你的应用和它需要的所有依赖,打包成一个标准化的单元。这个单元就叫容器。容器里包含了代码、运行时、系统工具、库文件……总之,应用跑起来需要的一切,都在里面。

我个人习惯把 Docker 理解成「轻量级的虚拟机」,但它的底层原理完全不同。后面我会详细讲。

一句话总结:Docker 是一个开源的容器化平台,让你能把应用及其依赖打包、分发、运行在任何环境中。

1.2 Docker与传统虚拟化对比

很多刚接触 Docker 的同学会问:这不就是虚拟机吗?

还真不是。我刚开始学的时候也这么想,直到我亲手在虚拟机里装了个 MySQL,又在 Docker 里跑了个 MySQL……那体验差距,简直天壤之别。

咱们直接看对比表格:

对比维度 传统虚拟机 Docker 容器
启动速度 分钟级(要加载完整操作系统) 秒级(共享宿主机内核)
资源占用 大(每个 VM 有独立 OS) 小(共享宿主机内核)
磁盘占用 GB 级别 MB 级别
隔离性 强(完全隔离) 进程级隔离(依赖内核特性)
性能损耗 较高(硬件虚拟化层) 几乎无(直接调用宿主机内核)

为什么会这样?

虚拟机是在硬件层面做虚拟化,每个 VM 都要跑一个完整的 Guest OS。你想想,光一个操作系统就占了多少资源?而 Docker 容器直接共享宿主机的操作系统内核,只隔离用户空间。说白了,容器就是一个被隔离的进程。

我的经验:在 CI/CD 流水线里,Docker 的秒级启动简直是救命稻草。以前用虚拟机做构建,等环境启动就要 3 分钟,现在 Docker 几秒搞定。一天跑几十次构建,省下的时间相当可观。

1.3 Docker核心概念

Docker 有三个核心概念:镜像、容器、仓库。我习惯把它们类比成「类、实例、代码仓库」。

1.3.1 镜像(Image)

镜像是一个只读的模板,包含了运行应用所需的文件系统和配置。你可以把它理解成「容器的蓝图」。

镜像采用分层结构。每一层都是只读的,当你修改镜像时,实际上是在原有层之上叠加新层。这种设计让镜像复用变得极其高效。

我记得有一次,团队里有人问:「为什么我拉个 Ubuntu 镜像才 100 多 MB,而虚拟机 ISO 要 1 个多 G?」

原因很简单——Docker 镜像只包含最小化的文件系统,没有内核、没有驱动、没有图形界面。够用就好,这是 Docker 的设计哲学。

关键命令:

# 查看本地镜像
docker images

# 拉取镜像
docker pull ubuntu:22.04

# 删除镜像
docker rmi ubuntu:22.04

1.3.2 容器(Container)

容器是镜像的运行实例。镜像启动后,就变成了容器。

你可以对容器进行启动、停止、删除等操作。容器之间相互隔离,每个容器都有自己的文件系统、网络、进程空间。

我曾经在项目中遇到过一个问题:两个微服务都依赖 Redis,但版本不同。一个要 Redis 6,一个要 Redis 7。怎么办?

用 Docker 就简单了——启动两个容器,一个跑 Redis 6,一个跑 Redis 7。互不干扰,各自安好。

注意:容器是临时的。当你删除容器时,容器内产生的数据也会丢失。所以数据库这类有状态服务,一定要用数据卷(Volume)来持久化数据。这个后面会详细讲。

关键命令:

# 启动容器
docker run -d --name my-nginx nginx:latest

# 查看运行中的容器
docker ps

# 停止容器
docker stop my-nginx

# 删除容器
docker rm my-nginx

1.3.3 仓库(Registry)

仓库是存放镜像的地方。你可以把镜像推送到仓库,也可以从仓库拉取镜像。

最常用的公共仓库是 Docker Hub。但企业里,我建议搭建私有仓库。为什么?安全和速度。

我曾经见过一个团队,每次构建都从 Docker Hub 拉镜像,结果某天 Docker Hub 被墙了,整个 CI 流水线瘫痪了一整天。从那以后,我坚持在内部搭建 Harbor 私有仓库。

我的建议:生产环境一定要用私有仓库。可以用 Harbor、Nexus 或者阿里云/腾讯云的镜像仓库服务。把基础镜像缓存到内网,构建速度能提升 80% 以上。

关键命令:

# 登录仓库
docker login

# 给镜像打标签
docker tag my-app:latest my-registry.com/my-app:latest

# 推送镜像
docker push my-registry.com/my-app:latest

# 拉取镜像
docker pull my-registry.com/my-app:latest

1.4 Docker安装与验证

安装 Docker 其实很简单。我以 Ubuntu 22.04 为例,走一遍流程。

1.4.1 安装步骤

# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新包索引
sudo apt-get update

# 3. 安装依赖
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 4. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 5. 设置仓库
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

# 6. 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

1.4.2 验证安装

安装完成后,跑几个命令验证一下:

# 查看 Docker 版本
docker --version

# 查看 Docker 详细信息
docker info

# 运行 Hello World 容器
docker run hello-world

如果看到「Hello from Docker!」的输出,说明安装成功了。

避坑指南:我曾经遇到过一个问题——安装完成后,普通用户执行 docker 命令报权限错误。这是因为 Docker 守护进程默认以 root 权限运行。解决方案是把当前用户加入 docker 用户组:

sudo usermod -aG docker $USER
# 然后退出重新登录

注意:加入 docker 组的用户拥有 root 权限,生产环境要谨慎管理。

1.4.3 配置镜像加速

国内拉取 Docker Hub 镜像经常很慢。我建议配置镜像加速器。

# 创建或修改 /etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

我的经验:配置完镜像加速后,拉取速度从原来的几百 KB/s 提升到了几十 MB/s。嗯,这差距,谁用谁知道。

本章小结

这一章我们聊了 Docker 是什么、它和虚拟机的区别、三个核心概念(镜像、容器、仓库),以及怎么安装和验证。

说白了,Docker 就是帮你解决「在我机器上能跑」这个世纪难题的。下一章,我们会深入 Docker 的常用操作,包括镜像管理、容器管理、数据卷和网络配置。到时候我会分享更多实战中的坑和技巧。

记住一句话:容器化不是银弹,但它确实是现代 DevOps 的基石。打好基础,后面的 CI/CD 全流程才能跑得顺畅。