本文翻译自我的英文博客,最新修订内容可随时参考:Docker入门指南
Docker 是日常开发中非常实用的工具,和 Git 一样,你可以在 30 分钟内快速掌握它的核心概念和用法。
一、为什么需要 Docker?
传统软件开发测试完成后,输出的是程序或可执行文件(如 Java 字节码)。为了让程序顺利运行,开发团队需要准备完整的部署文件和运行环境,这给运维部署带来了诸多麻烦。而 Docker 的出现,使得我们可以将应用运行所需的系统环境(除操作系统内核外)自底向上地打包成镜像(Image),彻底解决了环境配置的一致性问题。
二、Docker 核心概念
Docker 是一个容器运行时载体和管理引擎,基于 Go 语言开发的开源项目,目标是实现“Build, Ship and Run Any App, Anywhere”,解决软件容器化的环境配置难题。
1. 镜像(Image)
- 定义:只读模板,用于创建容器,类似面向对象中的“类”。
- 特点:多层只读文件系统叠加而成,支持版本化管理(如
ubuntu:22.04 表示特定版本的 Ubuntu 镜像)。
2. 容器(Container)
- 定义:基于镜像创建的运行实例,可看作轻量级的 Linux 环境,包含独立的进程空间、网络空间和文件系统。
- 特点:共享宿主机内核,启动速度毫秒级,资源占用远低于传统虚拟机。
3. 仓库(Repository)
- 定义:集中存储镜像的服务,类似 Maven 仓库或 GitHub 代码仓库。
- 分类:
- 公共仓库:如官方的 Docker Hub,提供海量基础镜像。
- 私有仓库:企业内部使用的镜像存储服务(如 Harbor),保障镜像安全。
三、Docker 工作流程
Docker 采用 C/S(客户端/服务器)架构,核心组件包括:
- Docker 客户端(Docker Client) :用户通过命令行或图形界面(如 Docker Desktop)发送操作指令(如拉取镜像、启动容器)。
- Docker 守护进程(Docker Daemon) :运行在宿主机后台,接收客户端请求,负责镜像构建、容器管理等底层操作。
- Docker 引擎(Docker Engine) :执行具体任务(如创建容器、网络配置),通过驱动模块与操作系统交互。
- 镜像仓库(Docker Registry) :存储和管理镜像,支持从公共仓库(Docker Hub)或私有仓库拉取/推送镜像。
工作流程示意图
四、Docker 技术底层原理
1. Linux 基础概念
- bootfs(引导文件系统) :包含内核和引导加载程序(如 GRUB),系统启动后会卸载,释放内存。
- rootfs(根文件系统) :包含操作系统的根目录(如
/bin、/etc),启动时以只读模式挂载,启动后转为读写模式。 - UnionFS(联合文件系统) :
- 将多个文件系统分支透明叠加,形成单一文件系统(如镜像的多层只读层 + 容器的可写层)。
- 采用 写时复制(Copy-on-Write) :修改只读层文件时,会先复制到可写层再修改,避免直接修改底层镜像。
2. 镜像分层机制
- 每个镜像由多层只读文件系统组成,例如
FROM ubuntu 会加载 Ubuntu 基础镜像的多层文件。 - Dockerfile 最佳实践:
# 合并多条 RUN 命令减少层数
RUN apt-get update && apt-get install -y \
python3 \
python3-pip && \
rm -rf /var/lib/apt/lists/* # 清理缓存减小镜像体积
- 最大层数限制:UnionFS 最多支持 127 层,需避免冗余操作。
五、Docker vs 传统虚拟机
| 维度 | 传统虚拟机(VM) | Docker 容器 |
|---|---|---|
| 虚拟化层次 | 硬件级虚拟化(模拟完整硬件) | 内核级虚拟化(共享宿主机内核) |
| 启动速度 | 分钟级 | 毫秒级 |
| 资源占用 | 数十 GB(含操作系统) | 数十 MB(仅应用和依赖) |
| 隔离性 | 操作系统级隔离 | 进程级隔离(通过 Namespace/Cgroups) |
| 典型场景 | 多操作系统共存(如开发测试环境) | 单应用容器化(如微服务部署) |
六、Docker 安装与配置
1. 安装前提
- 系统要求:仅支持 Linux 内核(Windows/macOS 需通过 Docker Desktop 运行虚拟机)。
- 验证命令:
docker run hello-world # 首次运行会自动拉取测试镜像并验证安装
2. 权限配置(Linux)
将当前用户加入 docker 组,避免每次命令使用 sudo:
sudo usermod -aG docker $USER
newgrp docker # 重新加载用户组权限
3. 镜像加速(国内用户)
使用阿里云镜像加速器提升拉取速度:
- 创建配置文件:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
- 添加镜像地址(替换
your-aliyun-id 为阿里云账号 ID):
{
"registry-mirrors": ["https://your-aliyun-id.mirror.aliyuncs.com"]
}
- 重启 Docker 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
七、快速上手命令
| 操作场景 | 命令示例 | 说明 |
|---|---|---|
| 拉取镜像 | docker pull ubuntu:22.04 | 从 Docker Hub 拉取 Ubuntu 镜像 |
| 启动容器 | docker run -it --name my-ubuntu ubuntu:22.04 | 以交互模式启动容器 |
| 查看运行中容器 | docker ps | 列出所有运行中容器 |
| 停止容器 | docker stop my-ubuntu | 停止指定容器 |
| 构建自定义镜像 | docker build -t my-app . | 根据当前目录的 Dockerfile 构建 |
| 推送镜像到仓库 | docker push my-app:v1 | 推送镜像到 Docker Hub 或私有仓库 |
更多命令参考:Docker 命令速查表
总结
Docker 通过镜像分层、内核级虚拟化和容器隔离,解决了传统部署中的环境一致性难题,显著提升了开发、测试和部署效率。掌握 Docker 的核心概念(镜像、容器、仓库)和常用命令,即可快速开启容器化之旅。如需深入学习 Docker Compose、Kubernetes 等进阶内容,欢迎访问博客获取最新资源。