Docker 实战学习技术(知识框架 -> 工程实践)
Docker 是容器化技术:把应用及其运行环境依赖打包成轻量、可移植的单元。学习 Docker 的关键不是“记命令”,而是建立一套清晰的模型:镜像是模板,容器是运行实例;网络与数据是容器世界里“如何互联与如何保留”的规则。
1. Docker 核心概念(知识框架)
1.1 镜像(Image)
- 镜像可以理解为“应用 + 依赖”的只读模板/快照。
- 同一个镜像可以被创建出多个容器实例,每个容器运行时拥有自己的可写层。
常见做法:
- 为镜像打标签(
tag),例如myapp:dev、myapp:1.0.0 - 通过 Dockerfile 构建镜像(
docker build)
1.2 容器(Container)
- 容器是镜像的运行实例。
- 容器具有隔离的文件系统、进程空间和网络环境。
- 容器可读写(相对于镜像的只读模板),写入内容通常落在容器的可写层。
容器生命周期(理解即可):
- 创建 -> 启动 -> 运行 -> 停止 -> 删除(可复用或重建)
1.3 仓库(Registry)
- 仓库是镜像的存储与分发位置。
- 常见选择:
- Docker Hub(公共镜像)
- 私有 Registry(团队/企业内部镜像)
典型流程:
- 拉取镜像:
docker pull - 推送镜像:
docker push
1.4 Dockerfile
- Dockerfile 是“构建镜像的脚本/指令集”。
- Dockerfile 会被构建成一系列层(layer),最终得到镜像。
Dockerfile 常用指令(入门必须会):
FROM:基础镜像WORKDIR:工作目录COPY:拷贝文件到镜像RUN:构建时执行命令EXPOSE:声明容器内部监听端口(不等于宿主机映射端口)CMD/ENTRYPOINT:容器启动命令ENV:构建/运行环境变量
1.5 Volumes(数据卷)
- 容器的可写层适合运行时临时文件,但对于关键业务数据需要持久化。
- Volume 提供“跨容器生命周期”的数据存储能力。
常见用途:
- 数据库(MySQL/PostgreSQL)数据持久化
- 上传文件/用户生成内容持久化
1.6 Network(网络)
- Docker 通过网络能力让容器与容器、宿主机之间实现通信。
- 常见两类访问方式:
- 从宿主机访问容器:端口映射(
-p host:container或 Compose 的ports) - 容器之间互访:使用网络与服务名(Compose 通常会提供更顺滑的服务发现体验)
- 从宿主机访问容器:端口映射(
2. Docker 操作基础(命令模型)
2.1 容器管理命令
典型命令:
- 运行:
docker run - 查看运行中:
docker ps - 查看所有(含停止):
docker ps -a - 停止:
docker stop - 删除:
docker rm - 进入容器执行命令:
docker exec -it <container> <cmd> - 查看日志:
docker logs <container>
快速示例(nginx + 端口映射):
bash
docker run -d --name web -p 8080:80 nginx:alpine
docker ps
docker logs web2.2 镜像管理命令
典型命令:
- 构建:
docker build - 拉取:
docker pull - 推送:
docker push - 镜像列表:
docker images - 给镜像打标签:
docker tag
快速示例(构建镜像):
bash
docker build -t myapp:dev .
docker images2.3 日志与监控(运维视角)
- 日志:
docker logs(排查启动失败/运行报错最常用) - 资源占用:
docker stats(CPU/内存/网络的快速观察)
建议实践:
- 服务尽量将关键日志输出到标准输出(stdout/stderr),便于
docker logs或日志采集平台抓取。
3. Docker 高级特性(工程化能力)
3.1 Docker Compose(多容器编排)
- Compose 用一个声明文件(
docker-compose.yml或compose.yaml)管理多个服务。 - 你可以在一套配置中定义:
- 服务镜像/构建方式
- 端口映射
- 环境变量
- 数据卷(Volume)
- 网络(可选)
常见目标:
- 一条命令启动整套系统(比如前端 + 后端 + 数据库)
- 可复现环境(便于团队协作与交付)
3.2 网络模式(理解差异)
常见网络模式(概念级理解即可):
bridge:默认模式,适合单机互联host:与宿主机共享网络栈(端口/隔离更“直接”,需要谨慎)overlay:跨主机网络(偏集群场景,例如 Swarm)
建议入门阶段:优先使用默认网络 + Compose 网络;等 Compose 稳定后再理解高级模式。
3.3 数据管理(volume / bind mount / tmpfs)
volume:Docker 管理的数据卷(更适合长期持久化)bind mount:把宿主机目录挂载进容器(常用于开发环境热更新)tmpfs:临时内存文件系统(适合不需要落盘的数据)
工程选择原则:
- 生产/持久数据倾向
volume - 开发联调倾向
bind mount - 临时且可丢数据倾向
tmpfs
3.4 多阶段构建(Multi-stage build)
- 核心思想:构建阶段使用完整工具链,运行阶段只保留必要产物。
- 结果:最终镜像更小、攻击面更低、依赖更可控。
典型结构:
builder阶段:编译/打包runtime阶段:拷贝构建产物并运行
3.5 镜像优化(缓存 + 体积)
优化点(入门必须掌握):
- 利用构建缓存(layer cache):让“不变的步骤”尽量排在前面
- 使用
.dockerignore:避免把无关大文件(如node_modules、构建产物)送进构建上下文 - 分层原则:把依赖安装与业务代码拷贝分开,降低缓存失效频率
收益:
- 构建更快
- 镜像体积更小
- 更容易在 CI/CD 中稳定复现
3.6 健康检查与排错(Healthcheck + Logs)
healthcheck表示“服务是否可用”,不等于“容器是否在运行”。- 搭配日志/状态信息可以快速定位:
- 端口监听失败
- 依赖服务不可达
- 配置/环境变量错误
4. Docker 与 DevOps(工程落地)
4.1 容器化部署(CI/CD 思路)
典型流水线(概念级):
- 代码提交(Git)
- CI 构建镜像(
docker build) - (可选)运行测试/质量检查
- 推送镜像到 Registry(
docker push) - 部署环境拉取镜像并启动(
docker pull+docker run或 Compose)
关键能力点:
- 镜像可复现(同一提交 -> 同样构建产物)
- 环境配置可控(环境变量/配置文件/密钥管理)
- 部署可回滚(镜像版本化)
常用工具链:
- CI:Jenkins / GitHub Actions / GitLab CI
- 构建分发:Docker Hub 或私有 Registry
- 部署:服务器上的 Docker/Compose,或进入集群平台
4.2 Kubernetes 入门(与 Compose 的关系)
- Docker 更偏“容器运行与镜像构建”。
- Kubernetes 更偏“集群调度与编排”(把容器作为基础单元进行统一管理)。
学习建议:
- 先把 Compose 项目跑稳定(容器间通信、卷、日志都要理解)
- 再学习 Kubernetes 的 Pod/Service/Deployment 等概念,迁移成本更低
5. 建议的学习路径(技术体系下的“阶段化验收”)
你可以把本页当作“知识框架”,配合阶段化验收,形成可落地的能力:
- Stage 1:容器入门
- 能用
docker run启动常见镜像并排查启动问题 - 能理解端口映射与日志定位
- 能用
- Stage 2:Dockerfile 构建镜像
- 能编写最小 Dockerfile 并完成构建-运行闭环
- Stage 3:数据与网络
- 能使用 Volume 持久化数据
- 能通过 Compose 网络让服务互相通信
- Stage 4:Compose 与交付
- 能用 Compose 编排多服务,并输出可复现的 README
- Stage 5:镜像优化
- 能使用
.dockerignore与 multi-stage build 做镜像体积/构建速度优化
- 能使用
- Stage 6:CI/CD(可选但推荐)
- 能在 CI 中构建并推送镜像,至少完成镜像流水线自动化
6. 常见排错速查(把问题定位到“哪一层”)
当你遇到“服务起不来/访问不了/数据不对”,优先按层排查:
6.1 端口/访问失败
- 先确认容器内部是否监听目标端口
- 再检查宿主机端口映射是否正确(
docker ps/ Compose 的ports) - 检查是否被防火墙或网关拦截(本地开发一般不会,但线上会)
6.2 容器启动失败
- 优先看日志:
docker logs <container>
- 再看容器状态(停止/退出码):
docker ps -a
6.3 容器间通信失败
- Compose 场景下优先检查:
- 服务名是否正确(用 Compose 服务名访问)
- 环境变量/连接串是否一致(例如数据库地址、端口、账号)
7. 交付物建议(放到你的项目仓库/笔记)
为了让 Docker 学习“能用”,建议每个阶段都产出可复现的文件:
Dockerfile:镜像构建脚本compose.yaml/docker-compose.yml:多服务编排README.md:包含启动命令、端口、环境变量说明、数据卷说明
如果你希望我把这一页进一步“落到你的项目模板”,你告诉我你主要用的技术栈(Java/Node/Python)和是否需要数据库(MySQL/PostgreSQL/无),我可以直接给出一个 Dockerfile + Compose + README 的建议骨架。