Docker 教程

Docker 教程

Docker 是最流行的容器化平台,通过容器技术打包应用及其依赖,实现"一次构建,随处运行",是现代 DevOps 和微服务架构的基石。

本教程包含

  • 基础篇:简介、Docker Desktop、各平台安装、镜像加速
  • 核心篇:Hello World、容器使用、镜像管理、Dockerfile
  • 进阶篇:数据卷、网络、Compose、仓库、常用命令

核心概念

镜像(Image): 应用的只读模板
容器(Container): 镜像的运行实例
仓库(Repository): 存储分发镜像
Dockerfile: 构建镜像的脚本

镜像 = 只读模板(类)
容器 = 运行实例(对象)

优势

环境一致: 开发/测试/生产环境统一
轻量: 秒级启动,共享内核
隔离: 进程级隔离,安全可控
可移植: 任何有 Docker 的机器可运行

Docker Desktop

Docker Desktop

Docker Desktop 是官方 GUI 应用,一键管理 Docker 环境,支持 Windows/macOS。

功能特性

图形界面: 管理容器/镜像/卷/网络
一键启动/停止 Docker 引擎
内置 Kubernetes(可开关)
资源设置: CPU/内存/磁盘限制
Dashboard: 可视化管理容器状态

Windows 要求

Windows 10/11 64 位
启用 WSL 2(推荐)或 Hyper-V
BIOS 开启虚拟化(VT-x/AMD-V)
内存建议 8GB+

macOS 要求

macOS 11+ 
Intel 或 Apple Silicon(M 系列)
Apple Silicon 原生支持 ARM 镜像

安装步骤

1. 下载 docker.com 的 Desktop 安装包
2. 按向导安装(Windows 需重启)
3. 启动 Docker Desktop
4. 等待引擎启动(鲸鱼图标变绿)

# 验证
docker --version
docker info

Linux 用户

Linux 通常不用 Desktop,直接安装 Docker Engine:
sudo apt install docker.io
sudo systemctl enable --now docker

# 用户组(免 sudo)
sudo usermod -aG docker $USER

Ubuntu Docker 安装

Ubuntu Docker 安装

在 Ubuntu 上安装 Docker Engine 的官方推荐方式。

1. 卸载旧版本

sudo apt remove docker docker-engine docker.io containerd runc

2. 配置官方仓库

sudo apt update
sudo apt install ca-certificates curl

# 添加 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg   -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]   https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3. 安装 Docker

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4. 启动与验证

sudo systemctl enable --now docker

# 验证
sudo docker run hello-world
# 输出 Hello from Docker! 即成功

5. 免 sudo 配置

sudo usermod -aG docker $USER
# 重新登录后生效
docker ps

国内镜像加速(可选)

# 见"镜像加速"章节配置 /etc/docker/daemon.json

CentOS Docker 安装

CentOS Docker 安装

在 CentOS/RHEL 上安装 Docker Engine。

1. 清理旧版本

sudo yum remove docker docker-client docker-common   docker-engine

2. 安装依赖

sudo yum install -y yum-utils

3. 配置仓库

sudo yum-config-manager   --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4. 安装

sudo yum install docker-ce docker-ce-cli containerd.io   docker-buildx-plugin docker-compose-plugin

5. 启动

sudo systemctl start docker
sudo systemctl enable docker

# 验证
sudo docker run hello-world

6. 免 sudo

sudo usermod -aG docker $USER
# 重新登录

注意

CentOS 7 使用 systemd 管理
防火墙开放端口: sudo firewall-cmd --add-port=8080/tcp --permanent

Windows Docker 安装

Windows Docker 安装

Windows 上安装 Docker 的方式:WSL 2 后端或 Docker Desktop。

方式一: Docker Desktop + WSL 2(推荐)

1. 安装 WSL 2
   wsl --install

2. 安装 Docker Desktop
   (从 docker.com 下载)

3. 设置中使用 WSL 2 backend

4. 验证
   docker --version

方式二: WSL 内安装 Docker Engine

# 在 WSL Ubuntu 终端中
sudo apt update
sudo apt install docker.io
sudo service docker start

# 验证
docker run hello-world

方式三: 原生 Windows 容器

# Windows Server / Windows 10 专业版(容器模式)
# 需启用 Containers 功能
# 主要运行 Windows 容器(镜像基于 Windows)

WSL 2 的优势

完整 Linux 内核
性能接近原生
与 Docker Desktop 无缝集成
可在 WSL 中直接执行 docker 命令

常见问题

1. 虚拟化未开启: BIOS 启用 VT-x
2. WSL 版本低: wsl --set-version 2
3. 内存不足: 调整 .wslconfig 分配内存

Docker 镜像加速

Docker 镜像加速

国内访问 Docker Hub 速度慢,配置镜像加速器提升拉取速度。

配置 daemon.json

# /etc/docker/daemon.json(Linux)
# ~/.docker/daemon.json 或 Docker Desktop 设置(mac/win)

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

应用配置

# Linux
sudo systemctl daemon-reload
sudo systemctl restart docker

# Docker Desktop
# Settings → Docker Engine → 编辑 JSON → Apply & Restart

验证加速

docker info | grep -A5 "Registry Mirrors"
# Registry Mirrors:
#   https://docker.m.daocloud.io/

其他加速方案

1. 云厂商加速器(阿里云/腾讯云个人加速地址)
2. 代理(HTTP_PROXY 配置)
3. 公共镜像站(ghcr、quay 需特殊配置)
4. docker pull 失败重试: 多试几次或换镜像源

注意

镜像加速器可能失效,多备几个
安全考虑: 生产环境尽量私有仓库
镜像源尽量用可信服务商

Docker Hello World

Docker Hello World

运行第一个 Docker 容器,验证 Docker 环境。

运行 hello-world

docker run hello-world

# 输出:
# Hello from Docker!
# This message shows that your installation appears
# to be working correctly.
# ...

发生了什么

1. docker run 从本地查找镜像
2. 本地没有 → 从 Docker Hub 拉取
3. 创建容器并运行
4. 输出信息后容器退出

# 查看已下载镜像
docker images
# REPOSITORY    TAG       IMAGE ID       CREATED
# hello-world   latest    d1165f221234   4 months ago

# 查看容器(含已停止)
docker ps -a

运行交互容器

# Ubuntu 容器交互终端
docker run -it ubuntu bash
# root@abc123:/# 进入容器内部

# 在容器内
# apt update && apt install vim
# exit  退出容器

# 运行并立即删除(测试用)
docker run --rm hello-world

常用运行参数

docker run [选项] 镜像 [命令]

-d       后台运行
-it      交互终端
--name   指定容器名
-p       端口映射(宿主机:容器)
-v       数据卷挂载
-e       环境变量
--rm     退出即删除
--restart=always  自动重启

Docker 容器使用

Docker 容器使用

容器的完整生命周期管理:创建、启动、停止、删除。

基本操作

# 创建并启动
docker run -d --name web -p 8080:80 nginx

# 查看运行中的容器
docker ps

# 查看所有容器(含停止)
docker ps -a

# 停止/启动/重启
docker stop web
docker start web
docker restart web

# 删除容器(先停止)
docker rm web
docker rm -f web     # 强制删除

# 删除所有停止的容器
docker container prune

进入容器

# 交互式进入
docker exec -it web bash
# 或 sh(精简镜像)
docker exec -it web sh

# 执行单条命令
docker exec web ls /
docker exec web cat /etc/nginx/nginx.conf

查看日志与状态

# 日志
docker logs web
docker logs -f web          # 实时跟踪
docker logs --tail 100 web  # 最后100行

# 容器详情
docker inspect web           # 完整信息(JSON)
docker inspect web | grep IPAddress

# 资源占用
docker stats                 # 实时监控
docker top web               # 进程列表

端口映射

# -p 宿主机端口:容器端口
docker run -d -p 8080:80 nginx
# 访问 http://localhost:8080

# 随机端口
docker run -d -P nginx
docker ps   # 查看随机映射端口

容器文件拷贝

# 复制文件到容器
docker cp ./config.conf web:/etc/nginx/conf.d/

# 从容器复制出来
docker cp web:/var/log/nginx/access.log ./

Docker 镜像管理

Docker 镜像管理

镜像的拉取、查看、构建、推送与清理。

拉取与查看

# 拉取镜像
docker pull nginx
docker pull nginx:1.25        # 指定标签
docker pull python:3.12-slim

# 查看本地镜像
docker images
docker image ls

# 查看镜像详情
docker inspect nginx
docker history nginx          # 构建历史(层)

镜像构建(Dockerfile)

# 在含 Dockerfile 的目录执行
docker build -t myapp:v1 .
# -t 标签: 名称:版本

# 指定文件与上下文
docker build -f Dockerfile.prod -t myapp:prod .
# . 是构建上下文目录

标签与推送

# 打标签
docker tag myapp:v1 myregistry.com/team/myapp:v1

# 推送到仓库
docker push myregistry.com/team/myapp:v1
# (需先 docker login)

删除与清理

# 删除镜像
docker rmi nginx
docker rmi $(docker images -q)   # 删除全部

# 清理无用资源
docker system prune
docker system prune -a    # 含未使用镜像
docker system df          # 查看占用

镜像分层原理

镜像由只读层叠加(Union FS)
每层 = Dockerfile 一条指令的结果
共享层: 相同基础镜像只存一份
容器层: 可写层(不写入镜像)

好处: 节省空间、传输快、缓存构建

导出导入

# 导出镜像为文件
docker save -o myapp.tar myapp:v1

# 导入
docker load -i myapp.tar

# 离线环境分发镜像常用

Docker Dockerfile

Docker Dockerfile

Dockerfile 定义镜像构建过程,是容器化的核心文件。

Python 应用示例

# 基础镜像
FROM python:3.12-slim

# 工作目录
WORKDIR /app

# 先复制依赖文件(利用层缓存)
COPY requirements.txt .
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 复制代码
COPY . .

# 环境变量
ENV PYTHONUNBUFFERED=1

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["python", "app.py"]

Node.js 示例

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

多阶段构建(减小镜像)

# 阶段1: 编译
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 阶段2: 运行(只保留可执行文件)
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]

# 最终镜像只有几 MB(不含编译器)

常用指令

FROM       基础镜像(必须第一条)
WORKDIR    工作目录
COPY       复制文件(上下文)
ADD        复制(支持URL/自动解压)
RUN        构建时执行命令
ENV        环境变量
EXPOSE     声明端口(文档性质)
CMD        容器启动命令(可被覆盖)
ENTRYPOINT 容器主命令(不可被覆盖)
ARG        构建参数
HEALTHCHECK 健康检查
USER       指定运行用户(安全)

CMD vs ENTRYPOINT

CMD: 默认命令,可被 docker run 参数覆盖
  docker run myapp python other.py

ENTRYPOINT: 固定入口,配合 CMD 传参
  ENTRYPOINT ["python"]
  CMD ["app.py"]
  docker run myapp other.py   # 执行 python other.py

构建优化建议

1. 依赖复制放代码之前(缓存)
2. 尽量合并 RUN 指令
3. 使用 .dockerignore 排除无关文件
4. 多阶段构建减小体积
5. 用官方精简基础镜像(slim/alpine)

Docker 数据卷

Docker 数据卷

数据卷(Volume)让数据在容器删除后保留,实现持久化与共享。

为什么需要数据卷

容器删除后数据丢失
容器间需要共享数据
需要宿主机访问容器数据(日志/配置)

方案:
  Volumes: Docker 管理(推荐)
  Bind Mounts: 挂载宿主机目录
  tmpfs: 内存临时存储

Volumes(命名卷)

# 创建卷
docker volume create mydata

# 使用卷
docker run -d --name db   -v mydata:/var/lib/mysql   mysql

# 查看卷
docker volume ls
docker volume inspect mydata

# 删除卷
docker volume rm mydata
docker volume prune   # 清理无用卷

匿名卷

# 不指定名字,自动生成
docker run -d -v /var/lib/mysql mysql
docker volume ls   # 显示随机名卷

Bind Mounts(绑定挂载)

# 挂载宿主机目录(开发热更新常用)
docker run -d -p 8080:80   -v $(pwd)/html:/usr/share/nginx/html   nginx

# 宿主机改文件,容器内立即生效
# 修改宿主机 html/index.html 即可

只读挂载

# :ro 只读
docker run -v $(pwd)/config:/etc/app:ro myapp

# 只读配置防止容器内误改

容器间共享卷

# 先创建共享卷容器(或用具名卷)
docker run -d --name app1 -v shared:/data busybox sleep 3600
docker run -d --name app2 --volumes-from app1 busybox sleep 3600

# app1/app2 共享 /data

数据卷容器模式(旧)

# 现在推荐直接用具名卷,更简洁
# volumes-from 用于遗留项目理解

Docker 网络

Docker 网络

理解 Docker 网络模式,实现容器间通信与外部访问。

网络模式

bridge   默认,容器间可通过 IP 通信
host     共享宿主机网络
none     无网络
自定义网络: 推荐(容器名互访)

# 查看网络
docker network ls

bridge 网络

# 默认桥接
docker run -d --name web -p 8080:80 nginx

# 容器间通信(通过 IP)
# 但 IP 会变,推荐自定义网络+名字

自定义网络(推荐)

# 创建网络
docker network create mynet

# 容器加入网络
docker run -d --name db --network mynet mysql
docker run -d --name app --network mynet myapp

# 容器间通过名字互访(DNS 解析)
docker exec app ping db
# app 代码连接: http://db:3306

# 连接已有容器
docker network connect mynet web

host 网络

# 直接使用宿主机网络(无端口映射)
docker run -d --network host myapp
# 容器内 8000 端口 = 宿主机 8000
# 适合: 性能敏感、服务发现简单场景

端口映射详解

-p 8080:80         宿主机8080 → 容器80
-p 127.0.0.1:8080:80  仅本机可访问
-p 80:80 -p 443:443   多端口
-P                 随机映射全部 EXPOSE 端口

# 查看映射
docker port web

网络诊断

# 进入容器测试网络
docker exec -it app bash
# ping db / curl http://db:3306

# 查看容器网络
docker inspect web | grep -A10 NetworkSettings

# 断开/删除网络
docker network disconnect mynet web
docker network rm mynet

Docker Compose

Docker Compose

Compose 用 YAML 定义和管理多容器应用,一键启停整套服务。

安装

# Docker Desktop 自带 compose
# Linux 独立安装
sudo apt install docker-compose-plugin
# 或
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker compose version

示例: Web + DB + Redis

# docker-compose.yml
version: "3.8"

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql

  redis:
    image: redis:7-alpine

volumes:
  db_data:

常用命令

docker compose up -d          启动(后台)
docker compose up -d --build  重新构建
docker compose down           停止并删除
docker compose down -v        连数据卷一起删
docker compose ps             查看状态
docker compose logs -f web    查看日志
docker compose exec web bash  进入容器
docker compose restart web    重启服务

开发环境热更新

# 挂载源码 + 开启热重载
services:
  web:
    build: .
    volumes:
      - ./app:/app      # 源码挂载
    command: uvicorn app.main:app --reload

环境变量(.env)

# .env 文件
DB_PASSWORD=secret123

# compose 中引用
environment:
  MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

生产 vs 开发

# 多文件覆盖
docker compose -f docker-compose.yml -f docker-compose.prod.yml up

# prod 文件覆盖开发配置
# 或环境变量 COMPOSE_FILE=...

注意

compose 网络自动创建: 服务名互访
depends_on 只保证启动顺序
生产建议: 限制资源(资源限制)与健康检查

Docker 仓库

Docker 仓库

仓库用于存储与分发镜像:官方 Hub、私有仓库、云仓库。

Docker Hub(官方)

hub.docker.com

# 登录
docker login
docker login -u username

# 推送到个人仓库
docker tag myapp:v1 username/myapp:v1
docker push username/myapp:v1

# 拉取
docker pull username/myapp:v1

私有仓库(Registry)

# 运行 registry 容器
docker run -d -p 5000:5000 --name registry registry:2

# 推送本地镜像
docker tag myapp:v1 localhost:5000/myapp:v1
docker push localhost:5000/myapp:v1

# 拉取
docker pull localhost:5000/myapp:v1

# 查看仓库列表
curl http://localhost:5000/v2/_catalog

HTTPS 与信任配置

# 非 HTTPS 仓库需配置信任
# /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.1.100:5000"]
}
sudo systemctl restart docker

主流云仓库

阿里云 ACR / 腾讯云 TCR
GitHub Container Registry (ghcr.io)
Google Artifact Registry
Harbor(开源企业级仓库,含权限/审计)

Harbor(企业方案)

# 基于 registry + UI + 权限
# docker run -p 80:80 goharbor/harbor-portal
# 提供: 镜像管理、项目权限、漏洞扫描、复制同步

镜像命名规范

[仓库地址/]命名空间/镜像名[:标签]

nginx                   官方镜像
nginx:1.25              带标签
myregistry.com/team/app:v1.2.3  私有仓库完整名
hub.docker.com/r/library/nginx   官方库地址

Docker 常用命令大全

Docker 常用命令大全

日常开发高频 Docker 命令速查。

镜像命令

docker pull 镜像[:标签]        拉取
docker images                  列出
docker build -t 名称 .         构建
docker tag 旧 新                打标签
docker push 名称                推送
docker rmi 名称                 删除
docker save -o a.tar 名称       导出
docker load -i a.tar            导入
docker history 名称             构建历史

容器命令

docker run [选项] 镜像          创建并运行
docker ps                       运行中容器
docker ps -a                    全部容器
docker start/stop/restart 名    启停
docker rm 名                    删除
docker exec -it 名 bash         进入
docker logs -f 名               日志
docker cp 源 目标                拷贝
docker stats                    资源监控
docker top 名                   进程
docker inspect 名               详情

run 常用选项

-d       后台运行
-it      交互终端
--name   容器名
-p 8080:80    端口映射
-v 卷:路径   数据卷
-e KEY=VALUE  环境变量
--network 网络名
--restart=always  开机自启
--rm      退出删除
--memory 512m    内存限制
--cpus 1.5       核数限制

网络与卷

docker network ls/create/rm
docker network connect/disconnect
docker volume ls/create/rm
docker volume prune

系统管理

docker version             版本
docker info                系统信息
docker system df           空间占用
docker system prune        清理(停止容器/无用网络)
docker system prune -a     清理所有无用资源
docker events              事件流
docker login/logout        登录

Compose

docker compose up -d
docker compose down
docker compose ps / logs / exec

技巧

# 删除所有容器
docker rm -f $(docker ps -aq)

# 删除所有镜像
docker rmi $(docker images -q)

# 查看容器 IP
docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名

Docker 常用应用部署

Docker 常用应用部署

用 Docker 快速部署常见应用:MySQL、Redis、Nginx、Python。

MySQL

docker run -d   --name mysql   -p 3306:3306   -e MYSQL_ROOT_PASSWORD=root123   -e MYSQL_DATABASE=myapp   -v mysql_data:/var/lib/mysql   mysql:8.0

# 连接
mysql -h127.0.0.1 -uroot -proot123

Redis

docker run -d   --name redis   -p 6379:6379   -v redis_data:/data   redis:7-alpine --appendonly yes

# 连接
redis-cli -h 127.0.0.1 -p 6379

Nginx(静态站点)

docker run -d   --name nginx   -p 80:80   -v $(pwd)/html:/usr/share/nginx/html:ro   -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro   nginx:alpine

# 访问 http://localhost

Python FastAPI + Gunicorn

# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app.main:app"]

# 运行
docker build -t myapi .
docker run -d -p 8000:8000 --name myapi myapi

PostgreSQL

docker run -d   --name pg   -p 5432:5432   -e POSTGRES_PASSWORD=secret   -e POSTGRES_DB=myapp   -v pg_data:/var/lib/postgresql/data   postgres:16

MongoDB

docker run -d   --name mongo   -p 27017:27017   -v mongo_data:/data/db   mongo:7

管理工具: Portainer

# Web 界面管理 Docker
docker run -d   -p 9000:9000   -v /var/run/docker.sock:/var/run/docker.sock   --name portainer   portainer/portainer-ce

# 访问 http://localhost:9000

Docker 安全

Docker 安全

容器安全实践:镜像、运行时与配置安全。

镜像安全

1. 使用官方/可信镜像
2. 使用精简基础镜像(alpine/slim)
3. 定期扫描漏洞(docker scout / trivy)
4. 不装多余软件,减少攻击面
5. 锁定版本标签(不用 latest)

# 扫描镜像
docker scout cves nginx
# 或
trivy image nginx

运行时安全

# 最小权限运行
docker run --user 1000:1000 myapp

# 只读根文件系统
docker run --read-only myapp
# (配合卷挂载可写目录)

# 去掉特权与能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
docker run --security-opt no-new-privileges myapp

# 资源限制防 DoS
docker run --memory 512m --cpus 1 --pids-limit 100 myapp

网络隔离

1. 使用自定义网络,不加入默认 bridge
2. 只暴露必要端口
3. 敏感服务绑定 127.0.0.1
4. 用防火墙限制访问

# 仅本机访问
docker run -p 127.0.0.1:6379:6379 redis

敏感信息管理

1. 不在 Dockerfile 写密码(ENV 会留在镜像层!)
2. 用 Docker Secrets / 环境变量注入
3. 用 --env-file .env(不提交 Git)
4. 构建时 ARG 不暴露

# 错误示范(密码进入镜像历史)
RUN echo "password=123" > /app/config

# 正确: 运行时注入
docker run -e DB_PASSWORD=$(cat secret.txt) myapp

其他安全建议

1. 定期更新 Docker 与镜像
2. 不把 docker.sock 挂给不可信容器
3. 审计日志(docker events)
4. 使用受信任镜像仓库
5. 生产环境启用镜像签名验证

Docker 性能与优化

Docker 性能与优化

镜像瘦身与容器性能优化技巧。

镜像瘦身

1. 多阶段构建(最关键)
2. 精简基础镜像(alpine/slim/distroless)
3. 清理构建缓存与临时文件

# 合并清理
RUN apt-get update && apt-get install -y --no-install-recommends \
    package && rm -rf /var/lib/apt/lists/*

# 比较
python:3.12          ~1GB
python:3.12-slim     ~150MB
python:3.12-alpine   ~60MB

.dockerignore

# 减少构建上下文
.git
node_modules
__pycache__
*.pyc
venv
.env
*.log

构建缓存优化

# 依赖复制放最前(依赖不变时缓存命中)
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# 查看缓存命中
docker build --progress=plain .

# 强制不用缓存
docker build --no-cache .

容器性能

1. 设置资源限制(避免争抢)
   --memory 1g --cpus 2

2. 日志限制(防磁盘占满)
   --log-opt max-size=10m --log-opt max-file=3

3. 使用 named volume(比 bind 快)

4. 网络: 容器同网络内通信快
   用容器名而非 IP

监控

# 实时监控
docker stats

# 容器详情
docker inspect 容器 | grep -A5 Memory

# 生产监控: Prometheus + cAdvisor + Grafana
docker run -d --name cadvisor -p 8080:8080   -v /:/rootfs:ro -v /var/run:/var/run:ro   gcr.io/cadvisor/cadvisor

常见性能问题

1. 镜像过大 → 构建/拉取慢(多阶段构建)
2. 日志无限增长 → 配置 log rotation
3. 数据卷在挂载盘 → 用 Docker 管理的卷
4. 容器间频繁通信 → 同网络 + 容器名直连
5. 磁盘占用 → docker system prune -a

Docker 与 Kubernetes

Docker 与 Kubernetes

从单机 Docker 走向容器编排,理解 K8s 的核心概念。

为什么需要 K8s

单机 Docker 局限:
  单点故障、无法自动扩容
  手动管理多容器繁琐
  无自愈/滚动更新

Kubernetes(K8s): 容器编排平台
  自动部署、伸缩、管理容器

K8s 核心概念

Pod:      最小调度单元(一个或多个容器)
Node:     工作节点(运行 Pod 的机器)
Deployment: 声明式管理 Pod 副本
Service:  稳定的网络访问入口
Ingress:  外部流量入口(域名/路由)
ConfigMap/Secret: 配置管理
Namespace: 资源隔离

Docker vs K8s 分工

Docker: 构建、运行单个容器(镜像/运行时)
K8s:    大规模调度、编排容器集群

关系: K8s 使用 containerd(与 Docker 同底层)
     镜像构建依然用 docker build

本地开发: minikube / k3s

# minikube(单节点集群)
minikube start --driver=docker
kubectl get nodes

# 或 Docker Desktop 内置 K8s
# Settings → Kubernetes → Enable

部署示例(Deployment)

# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3            # 3个副本
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        ports:
        - containerPort: 8000

# 应用
kubectl apply -f deploy.yaml
kubectl get pods

服务暴露

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8000

kubectl apply -f service.yaml

学习路径

1. 精通 Docker(本教程)
2. 理解 Pod/Deployment/Service
3. 本地 minikube 实践
4. 学习 Helm(包管理)、CI/CD 集成
5. 云服务 EKS/ACK/TKE

Docker 总结与实战

Docker 总结与实战

恭喜完成 Docker 教程!综合实战与知识回顾。

知识体系回顾

  • 基础:Docker Desktop、各平台安装、镜像加速
  • 核心:镜像/容器/仓库三要素,Hello World
  • 容器:启停删除、日志、进入、端口映射、拷贝
  • 镜像:Dockerfile 构建、标签推送、分层原理
  • 数据:Volumes 持久化、Bind Mounts、共享
  • 网络:bridge/自定义网络、容器名互访
  • 编排:Compose 多容器应用、K8s 入门
  • 安全:最小权限、镜像扫描、敏感信息管理

实战: 完整 Web 应用部署

# docker-compose.yml(前端+后端+DB)
services:
  frontend:
    image: nginx:alpine
    ports: ["80:80"]
    volumes:
      - ./frontend/dist:/usr/share/nginx/html:ro

  backend:
    build: ./backend
    environment:
      - DB_URL=mysql://app:pass@db:3306/app
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: app
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

# 一键部署
docker compose up -d --build

容器化最佳实践清单

□ 多阶段构建,镜像尽量小
□ 基础镜像固定版本
□ 数据持久化用具名卷
□ 配置用环境变量/挂载,不写进镜像
□ 应用无状态(方便横向扩容)
□ 健康检查(HEALTHCHECK)
□ 日志输出到 stdout/stderr
□ 资源限制(--memory/--cpus)
□ .dockerignore 精简上下文
□ 生产用 compose 或 K8s 编排

学习资源

官方文档: docs.docker.com
Play with Docker: labs.play-with-docker.com
Docker 官方教程: docker-curriculum.com
K8s 文档: kubernetes.io/zh-cn

Docker 已成为软件交付的标准方式。掌握镜像构建、容器管理、Compose 编排与安全实践,就能在开发、测试、生产全流程中高效使用容器技术。

第 1 / 20 节