02 第2周D7 Docker
D7 Docker
D7 Docker
精讲(必讲)。公司所有服务都容器化发布(GitHub Actions 构建镜像 → registry → k3s)。Docker 是理解这一切的起点。
教学目标(学完能做什么)
- 能说出镜像(image)与容器(container)的区别
- 能读懂并编写基础 Dockerfile,构建镜像并跑起来
- 会用 docker 常用命令与 docker-compose 编排多服务
- 知道镜像仓库的作用与公司仓库(registry.akria.net)
前置要求
- D5(Linux)、D6(Git,构建会用到)
本模块在业务中的位置
- 公司部署链路第一环:代码 → Docker 镜像 → registry → k3s。第 4 周项目里"部署模块(D)"的核心就是写 Dockerfile。学完本模块,你就看懂了公司每个服务根目录下的
Dockerfile在干嘛。
内容分段
1. 镜像 vs 容器
| 镜像 Image | 容器 Container | |
|---|---|---|
| 是什么 | 只读模板(含代码+环境+依赖) | 镜像的运行实例 |
| 类比 | 安装镜像/程序包 | 运行中的程序 |
| 生命周期 | 不变,可复用 | 可启动/停止/删除 |
| 关系 | 一个镜像可启动多个容器 | 容器删除后数据默认丢失 |
- 分层:镜像由一层层只读层组成,每层只记录增量——所以"改动很小、镜像复用很快"。
2. Dockerfile 基础
# 公司服务常见写法(以 Python FastAPI 为例)
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]- 关键指令:
FROM(基础镜像)、WORKDIR、COPY、RUN(构建时执行)、CMD/ENTRYPOINT(启动命令)。 - 优化点:先 COPY 依赖文件再 COPY 代码,让依赖层可缓存,改代码不用重装依赖(构建快)。
3. 常用命令
docker build -t myapp:v1 . # 构建镜像
docker images # 看镜像
docker run -p 8000:8000 myapp:v1 # 跑容器(-p 宿主机:容器端口)
docker ps -a # 看容器(含已退出)
docker logs -f <容器> # 看日志
docker exec -it <容器> bash # 进容器
docker stop / rm <容器> # 停止/删除
docker rmi <镜像> # 删镜像-p 8000:8000的含义:宿主机 8000 → 容器内 8000(D2 端口概念用上了)。
4. 镜像仓库 registry
- 作用:集中存镜像,供多台机器/集群拉取。
- 公司仓库:
registry.akria.net(zot 私有仓库,见 CLAUDE.md)。 - 习惯命名:
registry.akria.net/<应用名>:<tag>,如registry.akria.net/ccode:oauth-unfiltered-test。
docker tag myapp:v1 registry.akria.net/myapp:v1
docker push registry.akria.net/myapp:v1 # 需登录与权限
docker pull registry.akria.net/myapp:v1- 注意:打 tag 和 git tag 是两回事——docker tag 是给镜像命名;CI/CD 里两者会配合(D22 实操)。
5. docker-compose:多容器编排
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: z1a2q3W4 # 仅本地练习;真实密码走 Secret
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:docker compose up -d一把拉起整个栈;本地开发神器。- 生产环境公司用 K8s(D8),compose 主要用于本地/测试。
6. 数据与网络(了解)
- 容器删除后数据默认丢失 → 用 volume(
-v/ 上例pgdata)持久化。 - 容器间用网络通信;compose 里服务名即域名(
db可从web访问)。 - 公司 K8s 里的持久化用 Longhorn(D8 提)。
讲解节奏建议(约 90 分钟)
| 时段 | 内容 |
|---|---|
| 09:00-09:15 | 引入:Docker = 应用的集装箱,公司部署链路第一环 |
| 09:15-09:40 | 镜像 vs 容器 + 分层 |
| 09:40-10:10 | Dockerfile 编写 + 缓存优化 |
| 10:10-10:35 | 常用命令演示(build/run/logs/exec) |
| 10:35-10:55 | registry 与命名 + compose 简介 |
| 10:55-11:35 | 学员实操:容器化一个小服务(对应作业) |
| 11:35-11:55 | 常见误区 + 小结 |
| 11:55-12:00 | 布置作业 |
常见误区汇总
| 误区 | 正确理解 |
|---|---|
| 容器和虚拟机一样 | 容器共享宿主机内核,更轻更小;VM 有独立内核 |
| 容器删了数据还在 | 默认删除即丢失,要持久化必须用 volume |
docker build 每次全重来 | 用 COPY 顺序让依赖层缓存,小改动秒级重建 |
| docker tag 和 git tag 一样 | docker tag 是镜像命名;git tag 才是发版扳机 |
| 生产也用 compose | 生产用 K8s(D8);compose 主要本地/测试 |
| 镜像越大越好 | 用精简基础镜像(slim/alpine),小镜像启动快、漏洞面小 |