第一章: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 全流程才能跑得顺畅。