内部培训
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(基础镜像)、WORKDIRCOPYRUN(构建时执行)、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:10Dockerfile 编写 + 缓存优化
10:10-10:35常用命令演示(build/run/logs/exec)
10:35-10:55registry 与命名 + 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),小镜像启动快、漏洞面小

On this page