引言
面向具备基础 Linux 操作经验的开发者/运维人员,本文将从核心原理到动手实战,带你掌握 Docker 核心用法,快速搭建轻量、隔离的应用运行环境。


- 引言
- 目录
-
- [一、引言:容器化技术与 Docker 的核心价值](#一、引言:容器化技术与 Docker 的核心价值)
- [二、Docker 核心概念解析](#二、Docker 核心概念解析)
-
- [2.1 核心术语](#2.1 核心术语)
- [2.2 Docker 轻量隔离的底层原理(Linux 内核特性)](#2.2 Docker 轻量隔离的底层原理(Linux 内核特性))
- [三、环境准备与安装(Ubuntu 22.04)](#三、环境准备与安装(Ubuntu 22.04))
-
- [3.1 卸载旧版本(如有)](#3.1 卸载旧版本(如有))
- [3.2 配置软件源](#3.2 配置软件源)
- [3.3 安装 Docker 引擎](#3.3 安装 Docker 引擎)
- [3.4 验证安装并配置非 root 用户(可选)](#3.4 验证安装并配置非 root 用户(可选))
- [四、Docker 基础操作演示](#四、Docker 基础操作演示)
-
- [4.1 核心命令实战](#4.1 核心命令实战)
- [4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例)](#4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例))
- [4.3 使用 docker-compose 启动多容器应用(Web + Redis)](#4.3 使用 docker-compose 启动多容器应用(Web + Redis))
-
- [步骤 1:编写 docker-compose.yml](#步骤 1:编写 docker-compose.yml)
- [步骤 2:启动/停止多容器](#步骤 2:启动/停止多容器)
- 验证效果
- [4.4 可视化工作流(Mermaid 流程图)](#4.4 可视化工作流(Mermaid 流程图))
- 五、实战场景:快速部署隔离的开发测试环境
-
- [5.1 前置条件](#5.1 前置条件)
- [5.2 完整流程](#5.2 完整流程)
- [5.3 核心优势](#5.3 核心优势)
- 六、结语
- 总结
目录
一、引言:容器化技术与 Docker 的核心价值
在传统开发与运维流程中,"代码在我机器上能跑"是高频痛点------环境差异导致的配置兼容问题、资源浪费的虚拟机部署方式,都严重影响研发效率。容器化技术的出现彻底改变了这一现状:它基于 Linux 内核特性实现轻量级隔离,无需模拟完整操作系统,启动速度以秒级计,资源占用仅为虚拟机的 1/10 甚至更低。
Docker 作为容器化技术的事实标准,已成为现代 DevOps 与微服务架构的核心基础设施:它将应用及其依赖打包为可移植的镜像,实现"一次构建、处处运行";在微服务场景中,每个服务可独立封装为容器,简化部署、扩缩容与版本管理;同时,Docker 也是 CI/CD 流水线的关键环节,打通了开发、测试、生产环境的一致性链路。
二、Docker 核心概念解析
2.1 核心术语
| 术语 | 核心定义 |
|---|---|
| 镜像(Image) | 只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件,是容器的"静态蓝本"。 |
| 容器(Container) | 镜像的运行实例,是动态的、可读写的隔离环境,一个镜像可创建多个独立容器。 |
| 仓库(Registry) | 存储和分发镜像的服务,如官方的 Docker Hub、私有仓库 Harbor 等。 |
| Dockerfile | 文本格式的构建脚本,定义了如何从基础镜像构建自定义镜像,是镜像的"源代码"。 |
2.2 Docker 轻量隔离的底层原理(Linux 内核特性)
Docker 并非"新发明",而是对 Linux 内核已有隔离技术的封装,核心依赖两大特性:
- Namespace(命名空间) :实现资源隔离,为每个容器创建独立的"视图"。Docker 主要使用 6 类 Namespace:
- PID Namespace:隔离进程 ID(容器内的 PID 1 与宿主机 PID 完全独立);
- Network Namespace:隔离网络栈(容器有独立的网卡、IP、端口);
- Mount Namespace:隔离文件系统挂载点;
- UTS Namespace:隔离主机名和域名;
- IPC Namespace:隔离进程间通信;
- User Namespace:隔离用户和组 ID。
- Cgroups(控制组):实现资源限制,如限制容器可使用的 CPU 核数、内存大小、磁盘 IO 等,避免单个容器占用宿主机全部资源。
与虚拟机相比,Docker 无需虚拟化内核,直接复用宿主机 Linux 内核,因此启动更快、资源占用更低------这也是"轻量"的核心原因。

三、环境准备与安装(Ubuntu 22.04)
以下命令均需以 root 或 sudo 权限执行,确保操作可复现:
3.1 卸载旧版本(如有)
bash
sudo apt-get remove docker docker-engine docker.io containerd runc
3.2 配置软件源
bash
# 更新 apt 包索引并安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 稳定版源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
3.3 安装 Docker 引擎
bash
sudo apt-get update
# 安装最新版 Docker Engine、Containerd 和 Docker Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
3.4 验证安装并配置非 root 用户(可选)
bash
# 验证 Docker 服务是否启动
sudo systemctl status docker
# 运行测试容器,输出 "Hello Docker!" 则安装成功
sudo docker run --rm hello-world
# 配置非 root 用户免 sudo 使用 Docker(需重新登录生效)
sudo usermod -aG docker $USER
四、Docker 基础操作演示
4.1 核心命令实战
bash
# 1. 拉取镜像(以 Nginx 为例)
docker pull nginx:1.25 # 拉取指定版本,不指定则默认 latest
# 2. 查看本地镜像
docker images
# 3. 运行容器(后台运行 + 端口映射 + 命名容器)
docker run -d --name my-nginx -p 8080:80 nginx:1.25
# 参数说明:
# -d:后台运行
# --name:指定容器名称
# -p 宿主机端口:容器端口:端口映射,访问宿主机 8080 即访问容器 80
# 4. 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 5. 查看容器日志
docker logs my-nginx # 实时日志加 -f 参数:docker logs -f my-nginx
# 6. 进入容器交互终端
docker exec -it my-nginx /bin/bash
# 7. 停止/启动/删除容器
docker stop my-nginx
docker start my-nginx
docker rm my-nginx # 删除停止的容器,运行中容器需先 stop 或加 -f 强制删除
# 8. 删除镜像(需先删除基于该镜像的容器)
docker rmi nginx:1.25
4.2 编写 Dockerfile 构建自定义 Web 服务(Flask 示例)
创建目录并编写文件:
bash
mkdir flask-demo && cd flask-demo
步骤 1:编写 Flask 应用(app.py)
python
from flask import Flask
import os
app = Flask(__name__)
# 从环境变量获取 Redis 地址(后续多容器场景用)
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
@app.route('/')
def hello():
return f"Hello Docker! Redis Host: {REDIS_HOST}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
步骤 2:编写 Dockerfile
dockerfile
# 指定基础镜像(Python 3.9 轻量版)
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY app.py .
# 暴露端口(仅声明,实际映射靠 docker run -p)
EXPOSE 5000
# 容器启动命令
CMD ["python", "app.py"]
步骤 3:编写 requirements.txt
txt
flask==2.3.3
步骤 4:构建镜像
bash
docker build -t my-flask-app:v1 .
# 参数说明:-t 打标签(名称:版本),. 指定 Dockerfile 所在目录
步骤 5:运行自定义镜像
bash
docker run -d --name flask-app -p 5000:5000 my-flask-app:v1
# 访问验证:curl http://localhost:5000
# 输出:Hello Docker! Redis Host: localhost
4.3 使用 docker-compose 启动多容器应用(Web + Redis)
docker-compose 可通过 YAML 文件定义多容器依赖关系,简化多服务启动。
步骤 1:编写 docker-compose.yml
yaml
version: '3.8' # Compose 文件版本
services:
# Flask 服务
web:
build: . # 基于当前目录的 Dockerfile 构建
ports:
- "5000:5000"
environment:
- REDIS_HOST=redis # 引用 Redis 服务名(Compose 自动解析为容器 IP)
depends_on:
- redis # 依赖 Redis 服务,启动时先启动 redis
# Redis 服务
redis:
image: redis:7.2-alpine # 直接使用官方轻量版 Redis
ports:
- "6379:6379"
volumes:
- redis-data:/data # 挂载数据卷,持久化 Redis 数据
# 定义数据卷(持久化 Redis 数据)
volumes:
redis-data:
步骤 2:启动/停止多容器
bash
# 启动(后台运行加 -d)
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志(指定服务加服务名,如 docker-compose logs web)
docker-compose logs
# 停止并删除容器(保留数据卷)
docker-compose down
# 停止并删除容器+数据卷
docker-compose down -v
验证效果
bash
curl http://localhost:5000
# 输出:Hello Docker! Redis Host: redis
4.4 可视化工作流(Mermaid 流程图)
否
是
修改 Dockerfile/应用代码重新构建
docker build 构建镜像
镜像存储到本地/仓库
docker run/docker-compose up 运行容器
容器启动应用服务
宿主机/外部访问服务
服务是否正常?
查看容器日志/进入容器调试
容器持续运行
五、实战场景:快速部署隔离的开发测试环境
假设你需要为一个 Python Web 项目搭建隔离的开发测试环境,要求包含 Web 服务、Redis 缓存,且环境与本地系统隔离,步骤如下:
5.1 前置条件
- 宿主机已安装 Docker + Docker Compose;
- 项目代码已准备(复用上述 Flask 示例)。
5.2 完整流程
-
环境隔离准备:无需在宿主机安装 Python、Redis,避免污染本地环境;
-
编写配置文件 :创建
docker-compose.yml(复用 4.3 节),确保所有依赖都通过容器提供; -
一键启动环境 :
bash# 进入项目目录 cd flask-demo # 启动所有服务(首次运行会自动拉取镜像、构建 Web 镜像) docker-compose up -d -
开发调试 :
- 代码修改后,重新构建并重启 Web 服务:
docker-compose build web && docker-compose restart web; - 查看 Redis 数据:
docker exec -it flask-demo-redis-1 redis-cli;
- 代码修改后,重新构建并重启 Web 服务:
-
环境清理 :测试完成后,一键销毁环境,不留残留:
bashdocker-compose down -v
5.3 核心优势
- 隔离性:测试环境依赖(Python 版本、Redis 版本)与宿主机完全隔离,避免版本冲突;
- 一致性 :团队成员使用相同的
docker-compose.yml,一键启动完全相同的环境; - 轻量高效:相比虚拟机,启动仅需数秒,资源占用极低;
- 可复用:配置文件可纳入代码仓库,随项目版本管理。
六、结语
Docker 通过封装 Linux 内核的 Namespace 和 Cgroups 特性,实现了轻量级的应用隔离,其"镜像-容器"模型彻底解决了环境一致性问题,大幅提升了开发、测试、部署的效率:
- 对开发者:无需手动配置复杂依赖,一键搭建隔离环境;
- 对运维人员:应用打包为镜像后,部署流程标准化、可自动化。
当然,Docker 仅解决了单节点容器管理问题,在生产环境的大规模微服务场景中,还需借助 Kubernetes(K8s)实现容器的编排、扩缩容、自愈等能力;同时,Docker 可无缝集成到 CI/CD 流水线(如 Jenkins、GitLab CI),实现"代码提交 → 自动构建镜像 → 自动部署测试环境"的全流程自动化。
掌握 Docker 基础后,进一步学习 K8s 核心概念(Pod、Deployment、Service)、容器网络、数据持久化等,将是打通云原生技术栈的关键一步。
总结
- Docker 核心是基于 Linux Namespace(隔离)和 Cgroups(资源限制)实现轻量级容器,核心实体包括镜像(静态)、容器(动态)、仓库(分发);
- 实战中,Dockerfile 定义镜像构建规则,docker-compose 简化多容器应用管理,可快速搭建隔离的开发测试环境;
- Docker 解决了环境一致性问题,是 DevOps 和微服务的基础,生产环境可延伸至 Kubernetes 实现容器编排。
✨ 坚持用 清晰易懂的图解 + 代码语言, 让每个知识点都 简单直观 !
🚀 个人主页 :不呆头 · CSDN
🌱 代码仓库 :不呆头 · Gitee
📌 专栏系列 :
💬 座右铭 : "不患无位,患所以立。"
