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 $USERUbuntu 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.jsonCentOS 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 --permanentWindows 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 mynetDocker 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:9000Docker 安全
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 -aDocker 与 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/TKEDocker 总结与实战
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 编排与安全实践,就能在开发、测试、生产全流程中高效使用容器技术。