一、Docker 是什么?—— 用生活中的例子来理解
1.1 一句话解释
Docker 是一种软件打包和运行技术。它能把一个软件和它所需的所有环境(依赖库、配置文件、系统工具等)打包在一起,形成一个独立的"小盒子",无论放在哪台电脑上都能一模一样地运行。
1.2 三个核心概念
Docker 的世界只需要理解三样东西:
| 概念 | 生活类比 | 解释 |
|---|---|---|
| 镜像 (Image) | 蛋糕模具 / 压缩包 | 一个"模板",包含了运行软件所需的一切。可以复制、分享给别人 |
| 容器 (Container) | 用模具做出的蛋糕 / 解压出来的文件 | 基于镜像创建的、实际运行的软件实例。一个镜像可以创建多个容器 |
| 仓库 (Registry) | 应用商店 | 存放和分享镜像的地方。Docker Hub 是官方的公共仓库 |
💡 打个比方:你在网上下载了一个游戏安装包(镜像),安装后运行起来就是一个游戏程序(容器),而下载游戏的那个网站就是仓库。
1.3 容器 vs 虚拟机 —— 为什么 Docker 更好?
你可能听说过"虚拟机",Docker 容器跟虚拟机的目标类似(都是隔离运行环境),但实现方式完全不同:
| 对比项 | 虚拟机 | Docker 容器 |
|---|---|---|
| 系统内核 | 每个虚拟机都有完整的操作系统 | 所有容器共享宿主机的系统内核 |
| 体积 | 很大(几个 GB) | 很小(通常几十 MB) |
| 启动速度 | 慢(分钟级) | 极快(秒级) |
| 资源消耗 | 高 | 低 |
🎯 核心区别:虚拟机是"每人一栋房子",Docker 容器是"合租一栋楼里的独立房间"——共用地基和楼体(系统内核),但各自空间完全隔离。
二、Docker 的技术原理 —— 它是怎么做到隔离的?
Docker 依赖 Linux 系统的两大原生功能实现容器化:
- Cgroups(控制组):给每个容器设定资源"配额"。比如限定某个容器最多只能用 2GB 内存,防止一个容器吃光所有资源。
- Namespaces(命名空间):让每个容器"以为"自己是独占一台电脑。容器看到的进程列表、网络、文件系统都是隔离的。
📌 本质:Docker 容器其实就是宿主机上一个特殊的进程。但通过以上两项技术,进入容器内部后,看起来就像一个独立的操作系统。
三、Docker 安装指南
Docker 本质上是基于 Linux 的技术。在 Windows 和 Mac 上,Docker 会通过虚拟化一个 Linux 子系统来运行。Linux 系统是最佳的 Docker 运行环境。
3.1 各平台安装方式
🐧 Linux 系统
# 方法一:使用官方脚本(推荐)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 方法二:通过包管理器
# RedHat / CentOS:
yum install docker
# Alpine:
apk add docker
⚠️ 非 root 用户需要在所有 docker 命令前加
sudo。
🪟 Windows 系统
-
启用 Windows 功能:勾选"Virtual Machine Platform"和"适用于 Linux 的 Windows 子系统"
-
重启电脑
-
安装 WSL2(管理员打开命令提示符):
wsl --set-default-version 2 wsl --update --web-download -
下载安装 Docker Desktop(从官网下载 AMD64 版本)
-
验证安装:
docker --version # 输出示例:Docker version 28.3.3, build 980b856
⚠️ 使用过程中必须保持 Docker Desktop 处于运行状态,否则命令会报错。
🍎 Mac 系统
根据芯片类型(Intel 或 Apple Silicon)从官网下载对应的 Docker Desktop 安装包即可。
💡 虽然 Docker Desktop 提供了可视化界面,但命令行在各操作系统上通用,因此掌握命令行是最重要的。
四、Docker 镜像管理
镜像是 Docker 的"原材料",必须先有镜像才能创建容器。
4.1 镜像名称的完整结构
一个镜像的完整地址由 4 部分组成:
docker.io / library / nginx : latest
───┬──── ──┬──── ──┬── ──┬───
仓库地址 命名空间 镜像名 版本标签
(官方可省略) (官方可省略) (latest可省略)
所以 docker pull docker.io/library/nginx:latest 可以简写为 docker pull nginx。
仓库 vs 镜像库:整个 Docker Hub 网站是一个 Registry(注册表/仓库),而
docker.io/library/nginx是一个 Repository(镜像库),存放 nginx 镜像的所有版本。
4.2 常用镜像命令
# 📥 下载镜像
docker pull nginx # 下载官方最新版 Nginx
docker pull docker.n8n.io/n8nio/n8n # 从私有仓库下载
# 📋 查看本地所有镜像
docker images
# 🗑️ 删除镜像
docker rmi nginx # 按名称删除
docker rmi <镜像ID> # 按 ID 删除
# 🏗️ 拉取指定 CPU 架构的镜像
docker pull --platform=arm64 nginx
4.3 国内镜像源配置
国内网络下载 Docker 镜像可能失败,可以配置镜像加速站:
- Linux:修改
/etc/docker/daemon.json,添加镜像源后重启 Docker 服务 - Windows/Mac:在 Docker Desktop → Settings → Docker Engine 中配置
{
"registry-mirrors": ["https://docker.1ms.run"]
}
4.4 CPU 架构注意事项
- Docker 默认自动选择匹配当前 CPU 架构的镜像
- Mac M 系列芯片(ARM64)运行 AMD64 镜像时,会通过 QEMU 模拟,可能有兼容性问题和性能损耗
- 部分低功耗设备(如香橙派)使用 ARM64 架构,需确认镜像是否支持
五、Docker 容器管理 —— 最核心的部分
5.1 docker run —— 最重要的命令
docker run 用来创建并运行一个容器。如果本地没有对应镜像,会自动先拉取。

5.2 docker run 的常用参数速查表
以下是 docker run 最常用的参数,用一个完整示例来展示:
docker run -d \ # 后台运行,不阻塞终端
--name my_nginx \ # 给容器起个名字
-p 8080:80 \ # 端口映射:宿主机 8080 → 容器 80
-v /my/html:/usr/share/nginx/html \ # 目录映射:持久化数据
-e MY_VAR=hello \ # 传递环境变量
--restart unless-stopped \ # 异常停止时自动重启
nginx # 使用的镜像
| 参数 | 作用 | 详细说明 |
|---|---|---|
-d | 后台运行 | 不占用当前终端,只返回容器 ID |
--name | 自定义名称 | 给容器起个好记的名字,名称在宿主机上必须唯一 |
-p 宿主机端口:容器端口 | 端口映射 | 容器网络默认隔离,必须映射端口才能从外部访问 |
-v 宿主机目录:容器目录 | 目录映射 | 实现数据持久化,容器删除后数据仍保留在宿主机上 |
-e KEY=VALUE | 环境变量 | 常用于传数据库密码等配置信息 |
-it | 交互式终端 | 进入容器内部的命令行,用于调试 |
--rm | 退出后自动删除 | 常与 -it 配合用于临时调试 |
--restart | 重启策略 | always=始终重启;unless-stopped=手动停止的不重启 |
5.3 端口映射详解
容器的网络和宿主机是隔离的,就像两个不同的房间。端口映射就是在两个房间之间开一扇"门":

语法:
-p 宿主机端口:容器端口(先外后内)
5.4 数据持久化 —— 挂载卷
容器删除后,容器内的数据会全部丢失!挂载卷就是把容器内的文件夹"连接"到宿主机,数据保存在宿主机上,即使容器被删了,数据还在。
Docker 提供两种挂载方式:
| 类型 | 语法 | 特点 |
|---|---|---|
| 绑定挂载 | -v /宿主机路径:/容器路径 | 直接指定宿主机目录。⚠️ 宿主机内容会覆盖容器内原有内容 |
| 命名卷 | -v 卷名:/容器路径 | Docker 自动管理存储位置。首次使用时会从容器同步初始文件 |

卷管理命令
docker volume create my_volume # 创建命名卷
docker volume ls # 查看所有卷
docker volume inspect my_volume # 查看卷的详细信息(包括真实存储路径)
docker volume rm my_volume # 删除卷
docker volume prune # 删除所有未使用的卷
5.5 容器的启停与生命周期管理
# 📋 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
# ⏹️ 停止 / ▶️ 启动
docker stop <容器ID或名称> # 停止容器
docker start <容器ID或名称> # 重新启动(保留之前所有配置参数)
# 🗑️ 删除容器
docker rm <容器ID或名称> # 删除已停止的容器
docker rm -f <容器ID或名称> # 强制删除运行中的容器
# 🔍 查看详细信息
docker inspect <容器ID或名称> # 输出 JSON 格式的完整配置信息
# 🆕 仅创建不启动
docker create nginx # 创建容器但不运行
💡 用
stop/start启停容器时,之前设置的端口映射、挂载卷、环境变量等全部自动保留,不需要重新设置。
5.6 进入容器内部与调试
# 进入正在运行的容器内部(获得交互式命令行)
docker exec -it <容器ID或名称> /bin/bash # 或 /bin/sh
# 在容器外部执行容器内部的命令
docker exec my_nginx ps -ef # 查看容器内进程
# 查看容器日志
docker logs <容器ID或名称> # 查看全部日志
docker logs -f <容器ID或名称> # 实时滚动查看日志
⚠️ 容器内部是一个极简操作系统,很多工具(如
vim)默认不存在,需要手动安装(如apt update && apt install vim)。
六、Dockerfile —— 制作你自己的镜像
Dockerfile 是一个文本文件,记录了如何一步步构建一个镜像,就像一份"镜像制作说明书"。
6.1 Dockerfile 常用指令
| 指令 | 作用 | 注意事项 |
|---|---|---|
FROM | 选择基础镜像 | 必须是 Dockerfile 的第一行 |
WORKDIR | 设置工作目录 | 后续所有操作都在此目录下执行 |
COPY | 复制文件到镜像内 | 第一个参数是宿主机路径,第二个是镜像内路径 |
RUN | 构建时执行命令 | 常用于安装依赖,如 pip install、npm install |
EXPOSE | 声明服务端口 | 仅为声明,实际映射仍需 -p 参数 |
CMD | 容器启动命令 | 一个 Dockerfile 只能有一个 CMD |
ENTRYPOINT | 入口命令 | 优先级高于 CMD,不容易被覆盖 |
6.2 完整实战示例
假设我们有一个 Python Web 项目:
项目结构:
my_project/
├── Dockerfile
├── main.py
└── requirements.txt
Dockerfile:
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python3", "main.py"]
构建并运行:
# 构建镜像(-t 指定名称,. 表示当前目录)
docker build -t my_app .
# 运行容器
docker run -d -p 8000:8000 my_app
# 测试访问
curl http://127.0.0.1:8000
# 返回:{"hello":"dbkuaizi"} ✅
6.3 推送镜像到 Docker Hub
把你做好的镜像分享给全世界:
# 1. 登录 Docker Hub
docker login
# 2. 给镜像打标签(必须包含你的用户名作为命名空间)
docker tag my_app your_username/my_app:v1.0
# 3. 推送
docker push your_username/my_app:v1.0
# 🎉 全世界都可以通过 docker pull your_username/my_app:v1.0 下载使用了!
七、Docker 网络 —— 容器之间怎么通信?
Docker 提供了三种网络模式:
7.1 三种网络模式对比
| 模式 | 特点 | 使用场景 |
|---|---|---|
| Bridge(默认) | 容器有独立内部 IP(172.17.x.x),通过端口映射对外通信 | 大多数场景 |
| Host | 容器直接共享宿主机网络,无需端口映射 | 需要高网络性能或解决复杂网络问题 |
| None | 完全断网 | 安全隔离场景 |
7.2 自定义子网 —— 容器间用名字访问
默认的 Bridge 网络下,容器之间只能用 IP 互访。创建自定义子网后,同一子网内的容器可以直接用容器名称互相访问(Docker 内置 DNS 能力):
# 创建子网
docker network create my_network
# 启动容器并加入子网
docker run -d --network my_network --name web nginx
docker run -d --network my_network --name db mongo
# 此时 web 容器内可以直接用 "db" 作为主机名访问 mongo
# 不同子网之间默认互相隔离
7.3 网络管理命令
docker network ls # 查看所有网络
docker network create my_network # 创建自定义网络
docker network rm my_network # 删除网络(默认的 bridge/host/none 不可删除)
八、Docker Compose —— 一键管理多个容器
8.1 为什么需要 Docker Compose?
一个真实的应用通常由多个部分组成(前端 + 后端 + 数据库)。每个部分应该单独容器化,但这带来了新问题:
8.2 Compose 文件结构 —— 对照 docker run 理解
Docker Compose 本质上就是把多个 docker run 命令写进一个 YAML 文件:
docker run 命令 → docker-compose.yml 对应写法
───────────────────────────────── ─────────────────────────────
--name my_mongodb → services 下的服务名
-e MONGO_INITDB_ROOT_USERNAME=xx → environment:
-v /data:/data/db → volumes:
-p 8080:80 → ports:
(手动创建子网 + --network) → 自动创建,无需配置
(无对应功能) → depends_on: (控制启动顺序)
8.3 完整示例:MongoDB + 管理界面
services:
my_mongodb:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: name
MONGO_INITDB_ROOT_PASSWORD: pass
volumes:
- /my/datadir:/data/db
my_mongodb_express:
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: my_mongodb
ME_CONFIG_MONGODB_ADMINUSERNAME: name
ME_CONFIG_MONGODB_ADMINPASSWORD: pass
depends_on:
- my_mongodb
💡 亮点:同一个 Compose 文件中的所有容器自动加入同一个子网,可以直接用服务名访问(如
my_mongodb),无需手动配置网络。
8.4 Compose 常用命令
# 🚀 启动所有服务(后台运行)
docker compose up -d
# ⏹️ 停止并删除所有容器和网络
docker compose down
# ⏸️ 仅停止(不删除容器)
docker compose stop
# ▶️ 重新启动已停止的服务
docker compose start
# 📄 指定非默认文件名
docker compose -f custom.yml up -d
📌 执行
docker compose up时,默认查找当前目录下的docker-compose.yaml或compose.yaml文件。
8.5 Docker Compose vs Kubernetes
| Docker Compose | Kubernetes (K8s) | |
|---|---|---|
| 定位 | 个人/小团队、单机部署 | 企业级、大规模集群 |
| 复杂度 | 简单易学 | 功能强大但复杂 |
| 适用场景 | 开发测试、轻量级生产 | 大规模生产环境 |
九、Docker 命令速查表
镜像相关
| 命令 | 作用 |
|---|---|
docker pull <镜像> | 下载镜像 |
docker images | 查看本地镜像 |
docker rmi <镜像> | 删除镜像 |
docker build -t <名称> . | 构建镜像 |
docker tag <源> <目标> | 重命名/打标签 |
docker push <镜像> | 推送到仓库 |
容器相关
| 命令 | 作用 |
|---|---|
docker run [选项] <镜像> | 创建并运行容器 |
docker ps / docker ps -a | 查看运行中/所有容器 |
docker stop <容器> | 停止容器 |
docker start <容器> | 启动容器 |
docker rm <容器> | 删除容器 |
docker logs [-f] <容器> | 查看容器日志 |
docker exec -it <容器> bash | 进入容器内部 |
docker inspect <容器> | 查看详细信息 |
卷与网络
| 命令 | 作用 |
|---|---|
docker volume create/ls/rm/prune | 卷的创建/查看/删除/清理 |
docker network create/ls/rm | 网络的创建/查看/删除 |
Docker Compose
| 命令 | 作用 |
|---|---|
docker compose up -d | 后台启动所有服务 |
docker compose down | 停止并删除所有服务 |
docker compose stop/start | 停止/启动服务 |
十、总结
🎯 核心要点回顾:
- Docker = 轻量级容器化技术:比虚拟机更快、更小、更高效
- 镜像是模板,容器是实例:一个镜像可以创建无数个容器
docker run是最重要的命令:掌握-d、-p、-v、-e四个核心参数- 数据持久化靠挂载卷:绑定挂载或命名卷,确保容器删除后数据不丢失
- Dockerfile 定义镜像构建流程:FROM → WORKDIR → COPY → RUN → EXPOSE → CMD
- Docker 网络有三种模式:Bridge(默认)、Host、None;自定义子网支持容器名互访
- Docker Compose 管理多容器:一个 YAML 文件,一条命令,搞定整个应用栈

1064

被折叠的 条评论
为什么被折叠?



