第一部分:视频内容总结(严格基于视频)
1. 一句话核心总结
本篇系统讲解了Docker的核心概念、安装方法、镜像下载、容器运行、数据持久化、网络配置、镜像构建以及Docker Compose轻量级编排,帮助学习者掌握容器化部署的全流程。
2. 核心概念定义
- Docker:用容器化技术给应用程序封装独立运行环境的工具,每个运行环境就是一个容器,运行容器的计算机称为宿主机。
- 容器与虚拟机的区别:Docker容器之间共用同一个系统内核,而每个虚拟机都包含一个操作系统的完整内核,因此容器更轻、更小、启动更快。
- 镜像:容器的模板,可类比软件安装包。镜像与容器的关系就像用模具做糕点——镜像=模具,容器=糕点。
- 镜像仓库(Registry):存放和分享镜像的地方,官方仓库为Docker Hub。镜像地址格式:
[registry]/[namespace]/[image]:[tag]。 - Docker Compose:轻量级的容器编排技术,使用YML文件管理多个容器的创建、网络和协同工作。
3. 分类/类型/步骤
(1)Docker网络模式
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge(默认) | 容器分配内部IP(如172.17.x.x),与宿主机网络隔离,需端口映射(-p)才能从外部访问 | 单机容器默认模式 |
| 自定义bridge子网 | 同一子网内容器可通过容器名互相访问(内置DNS),跨子网不可通信 | 多容器需要互相通信且不想用IP |
| host | 容器直接共享宿主机网络栈,无需端口映射,容器服务直接运行在宿主机端口上 | 解决棘手的网络问题,追求性能 |
| none | 容器不联网 | 完全隔离的场景 |
(2)Docker run常用参数
| 参数 | 作用 | 示例 |
|---|---|---|
-d | 后台运行(detached mode) | docker run -d nginx |
-p 宿主机端口:容器端口 | 端口映射 | -p 8080:80 |
-v 宿主机目录:容器目录 | 挂载卷(绑定挂载) | -v /data:/app/data |
--mount type=volume,src=卷名,dst=容器目录 | 命名卷挂载 | 推荐用于数据持久化 |
-e KEY=VALUE | 传递环境变量 | -e MONGO_INITDB_ROOT_USERNAME=admin |
--name 容器名 | 给容器自定义名称(唯一) | --name mynginx |
--restart always | 容器停止后自动重启 | 生产环境常用 |
--restart unless-stopped | 除手动停止外自动重启 | 推荐生产环境 |
-it --rm | 交互式进入容器,退出后自动删除 | 临时调试 |
--network 网络名 | 指定容器加入的网络 | --network mynet |
(3)数据持久化两种挂载方式对比
| 方式 | 命令示例 | 特点 |
|---|---|---|
| 绑定挂载(Bind mount) | -v /宿主机路径:/容器路径 | 直接使用宿主机目录,容器内修改影响宿主机;宿主机空目录会覆盖容器内内容(无初始化) |
| 命名卷挂载(Named volume) | --mount type=volume,src=卷名,dst=/容器路径 | 由Docker管理存储位置;首次使用时自动将容器内内容复制到卷中(有初始化) |
(4)Docker Compose与docker run命令对应关系
| docker run 参数 | docker-compose.yml 中的字段 |
|---|---|
--name容器名 | services下的服务名(即键名) |
| 镜像名 | image: xxx |
-e | environment: |
-v | volumes: |
-p | ports: |
--network自定义子网 | 无需指定,Compose自动为所有服务创建同一子网 |
| 无直接对应 | depends_on:控制启动顺序 |
4. 排序或对比关系
- 容器 vs 虚拟机:容器更轻量(共享内核)、启动更快(秒级)、资源占用少;虚拟机完整OS、隔离性更强但资源开销大。
- 镜像删除 vs 容器删除:
docker rmi删除镜像,docker rm删除容器。删除正在运行的容器需加-f。 - docker run vs docker create + docker start:
run=create+start。 - docker stop vs docker down:
stop只停止容器不删除;down(Compose命令)停止并删除容器。 - CMD vs ENTRYPOINT:CMD可被
docker run后的命令覆盖;ENTRYPOINT不易被覆盖,优先级更高。
5. 具体建议与注意事项
- 建议:
- 在国内网络环境使用镜像站加速:修改
/etc/docker/daemon.json添加registry-mirrors。 - 生产环境使用
--restart unless-stopped,手动停止的容器不会自动重启。 - 多容器应用使用 Docker Compose 管理,避免多次
docker run。 - 容器内调试时,若缺少命令(如 vi),先查看Linux发行版(
cat /etc/os-release),再用对应包管理器安装(Debian系用apt)。 - 使用
docker inspect+ AI 快速解析容器配置。 - 拉取镜像时注意 CPU 架构(如 arm64 设备需确认镜像是否支持)。
- 在国内网络环境使用镜像站加速:修改
- 注意事项:
- 绑定挂载时,宿主机空目录会覆盖容器内原有内容,导致服务异常(如 Nginx 显示403)。
- 删除容器会丢失容器内所有未持久化的数据,重要数据必须使用挂载卷。
- 使用 host 模式虽方便,但容器与宿主机网络完全共享,端口冲突风险高。
- 镜像构建时,为减小体积,基础镜像通常为极简系统(如 slim、alpine),缺少常见工具,需自行安装。
- 强制删除容器(
docker rm -f)可能造成数据丢失,谨慎使用。
6. 补充说明
- 实战案例:Nginx 部署 + 自定义网页挂载、MongoDB + mongo-express 组合、Python FastAPI 应用镜像构建与推送。
- 资源推荐:作者提供的 Docker 安装及镜像站配置脚本仓库(github.com/tech-shrimp/docker_installer)。
- AI辅助学习:可将
docker inspect输出直接粘贴给 AI,快速解读容器配置。
第二部分:常见知识点与需了解的概念
基础概念类:
- Docker 架构:C/S 模式(Docker Client → Docker Daemon → containerd → runc),了解有利于排查问题。
- UnionFS(联合文件系统):镜像分层存储的基础,每层只读,容器层可写(写时复制),节省空间。
.dockerignore文件:构建镜像时排除不需要的文件(如node_modules、.git),类似.gitignore。- 多阶段构建:在一个 Dockerfile 中使用多个
FROM,最终只复制必要产物,极大减小镜像体积。
风险类:
- 容器逃逸风险:Docker 默认非 root 用户运行,但若用户以 root 运行容器且挂载了宿主机敏感目录,可能被恶意程序逃逸。
- 镜像漏洞:基础镜像可能包含已知 CVE 漏洞,应定期扫描(
docker scan或使用 Trivy)。 - 日志无限增长:容器默认不限制日志大小,长期运行可能占满磁盘,需配置
log-opts max-size。 docker system prune -a风险:会删除所有未使用的镜像、容器、网络、构建缓存,可能导致需要重新拉取。
实操类:
- 查看容器资源占用:
docker stats实时查看 CPU/内存使用。 - 复制文件进出容器:
docker cp 宿主机路径 容器id:容器路径(双向)。 - 修改已运行容器的端口映射:不能直接改,需
docker commit为新镜像再运行,或修改配置文件重启 Docker(复杂)。 docker logs的进阶用法:--since查看最近时间日志,--tail查看最后 N 行。- 清理空间:
docker system prune(清理停止的容器、未使用的网络、悬空镜像),docker volume prune清理无用卷。
- 查看容器资源占用:
对比类:
- Docker Compose vs Kubernetes:Compose 适用于单机多容器编排;K8s 是生产级集群管理,支持自动伸缩、服务发现、负载均衡等。
COPYvsADD指令:ADD支持自动解压 tar 和 URL 下载,但行为不透明,推荐优先用COPY。ENTRYPOINTvsCMD:ENTRYPOINT定义容器主进程,CMD提供默认参数;两者可组合使用。
常见误区:
- 误以为容器是轻量级虚拟机:容器本质是进程(通过 namespace 隔离),不是完整 OS,不能随意执行
systemctl等命令。 - 误认为
docker stop会立即杀死容器:默认给 10 秒优雅停止时间(可-t修改),超时才强制 kill。 - 误以为
latest标签总是最新版本:latest是约定,不一定指向最新稳定版,依赖镜像维护者的更新习惯。 - 误认为 Docker 只能运行在 Linux 上:Windows/Mac 通过虚拟机(WSL2/Hyper-V)运行 Linux 容器,也可运行 Windows 容器(需特定 OS)。
- 误认为容器内修改文件后提交(
docker commit)是最佳实践:应使用 Dockerfile 和挂载卷,commit不可复现且易产生镜像膨胀。
- 误以为容器是轻量级虚拟机:容器本质是进程(通过 namespace 隔离),不是完整 OS,不能随意执行
进阶知识点:
- Docker 资源限制:
--memory="512m"、--cpus="1.5",防止容器耗尽宿主机资源。 - 健康检查(HEALTHCHECK):Dockerfile 中配置,定期检测容器服务是否正常。
- Docker 事件监听:
docker events可监控容器生命周期事件,用于自动化运维。 - Rootless 模式:以非 root 用户运行 Docker 守护进程,提高安全性。
- Docker 插件:如存储插件、网络插件,可扩展 Docker 功能。
- Docker 资源限制:
第三部分:全面内容总结(合并第一、二部分)
1. 主题概述
Docker 通过容器化技术为应用提供独立的运行环境,相比虚拟机更轻量(共享宿主机内核)。核心概念包括:
镜像(只读模板,类比模具)、
容器(镜像的运行实例,类比糕点)、
仓库(存储分享镜像,如 Docker Hub)。
使用docker run创建容器,通过挂载卷(-v)实现数据持久化,端口映射(-p)对外暴露服务,环境变量(-e)传递配置。
Docker Compose 用 YAML 文件管理多容器应用,自动创建网络并控制启动顺序。
2. 分类与对比
| 对比项 | Docker 容器 | 传统虚拟机 |
|---|---|---|
| 系统内核 | 共享宿主机内核 | 每个 VM 独立内核 |
| 启动时间 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 隔离级别 | 进程级 | 系统级 |
| 网络模式 | 通信方式 | 外部访问 | 容器间互访 |
|---|---|---|---|
| bridge | 内部 IP(172.17.x.x) | 需-p映射 | 通过 IP |
| 自定义 bridge | 内部子网 | 需-p映射 | 通过容器名(DNS) |
| host | 宿主机 IP | 无需映射 | 共享宿主机 |
| none | 无 | 不可访问 | 不可 |
3. 风险与注意事项
- 注意:绑定挂载空目录覆盖容器内容、删除容器丢失数据、host 模式端口冲突、基础镜像缺少工具。
- 补充风险:
- 容器逃逸:以 root 运行且挂载敏感宿主机目录时存在安全风险。
- 镜像漏洞:基础镜像可能有已知 CVE,需定期扫描。
- 日志膨胀:未限制日志大小可能占满磁盘,配置
log-opts max-size=10m。 - 资源耗尽:容器无资源限制可能抢占宿主机所有 CPU/内存,应设置
--memory、--cpus。
4. 实操建议
- 日常操作:
- 下载镜像前先搜索 Docker Hub 确认架构和文档。
- 生产环境使用
--restart unless-stopped。 - 重要数据使用命名卷或绑定宿主机目录,避免容器删除后丢失。
- 使用
docker stats监控资源,docker logs -f跟踪日志。
- 容器调试:
- 进入容器:
docker exec -it 容器名 /bin/bash(或/bin/sh)。 - 若缺少命令,先查看 Linux 发行版(
cat /etc/os-release),再用对应包管理器安装(Debian 用apt,Alpine 用apk)。
- 进入容器:
- 镜像构建:
- 编写
.dockerignore排除无关文件。 - 使用多阶段构建减小体积。
- 构建时利用构建缓存:将不易变化的指令(如安装依赖)写在前面。
- 编写
- Compose 使用:
- 标准文件名
docker-compose.yml,非标准用-f指定。 - 使用
depends_on控制启动顺序(不保证等待服务就绪,需应用自身重试)。
- 标准文件名
- 网络调试:
- 自定义 bridge 网络中,可用
ping 容器名测试 DNS 解析。 - host 模式下,容器内
ip addr show会显示宿主机 IP。
- 自定义 bridge 网络中,可用
5. 常见误区辨析
- 误区1:容器是轻量级虚拟机。→ 容器是进程(namespace隔离),不能运行
systemd。 - 误区2:
docker stop立刻杀死容器。→ 默认优雅停止等待 10 秒。 - 误区3:
latest标签永远最新。→ 取决于维护者更新习惯,生产环境应指定具体版本号。 - 误区4:
docker commit是保存容器修改的好方法。→ 不可复现,应使用 Dockerfile 和挂载卷。 - 误区5:删除镜像前必须先删除依赖的容器。→ 需先停止并删除使用该镜像的容器,否则无法删除镜像。
- 误区6:Docker 只能运行 Linux 容器。→ Windows/Mac 通过虚拟化运行 Linux 容器,Windows 也可运行 Windows 容器。
通过本篇内容,你将掌握:
- 理解 Docker 核心概念(镜像、容器、仓库、宿主机)及与虚拟机的区别
- 在 Linux/Windows/Mac 上安装 Docker,配置镜像站解决网络问题
- 使用
docker run的核心参数(-d、-p、-v、-e、--name、--restart)创建和管理容器 - 实现数据持久化:区分绑定挂载与命名卷,掌握
docker volume命令 - 构建自定义镜像:编写 Dockerfile、使用
docker build、推送镜像到 Docker Hub - 配置 Docker 网络(bridge、自定义子网、host、none)及容器间通信
- 使用 Docker Compose 编排多容器应用,编写
docker-compose.yml并管理启停