Docker 完全学习指南
从零系统学习 Docker:镜像与容器、进阶用法、容器管理、Docker Compose、清理维护和常见问题。
从零开始系统学习 Docker,掌握容器化技术核心能力
📌 阅读优先级
星级直接写在正文主要章节标题中,用于表示第一次学习应投入的精力;低星级不代表内容无价值。
| 星级 | 分类 | 建议学习深度 |
|---|---|---|
| ★★★★★ | 重点掌握 | 理解原理,能运行、修改、组合并排查常见问题 |
| ★★★ | 补充掌握 | 能读懂并知道何时使用,项目需要时可快速落地 |
| ★ | 了解即可 | 建立概念边界,需要时查询,不必投入大量时间记忆 |
建议先完成所有五星章节,再补三星章节;一星章节可在遇到对应场景时查阅。
★★★★★ 重点掌握
-
镜像与容器基础操作(第1.2-1.3节)
- 应用场景:打包LLM应用、部署到服务器、本地测试环境
- 为什么重要:Docker是现代应用部署的标准方式,不会Docker很难部署应用
- 核心命令:
docker pull nginx:拉取镜像docker run -d -p 8080:80 nginx:后台运行容器并映射端口docker ps:查看运行中的容器docker stop/start:停止/启动容器docker rm/rmi:删除容器/镜像
- 核心概念:镜像是模板(静态),容器是运行实例(动态)
-
端口映射(第1.3节)
- 应用场景:FastAPI应用监听8000端口,外部访问需要映射
- 为什么重要:不映射端口外部无法访问容器内的服务
- 核心语法:
-p 宿主机端口:容器端口 - 实战示例:
终端窗口 # FastAPI应用docker run -d -p 8000:8000 my-llm-app# 多个端口docker run -d -p 8000:8000 -p 6379:6379 redis - 常见问题:端口冲突(宿主机端口已被占用)
-
数据持久化(Volume挂载)(第2.1节)
- 应用场景:保存向量数据库、对话历史、模型文件、日志
- 为什么重要:容器删除后数据会丢失,必须挂载Volume持久化
- 两种方式:
- Volume挂载:
-v mydata:/app/data(Docker管理) - 本地目录挂载:
-v /host/path:/container/path(直接映射)
- Volume挂载:
- 实战示例:
终端窗口 # 挂载向量数据库数据docker run -d -p 6333:6333 \-v qdrant_data:/qdrant/storage \qdrant/qdrant# 挂载本地代码目录(开发调试)docker run -d -p 8000:8000 \-v $(pwd):/app \my-llm-app
-
Dockerfile编写(第2.5节)
- 应用场景:把自己的LLM应用打包成镜像
- 为什么重要:有了镜像才能一键部署,不需要手动配置环境
- 核心指令:
FROM python:3.11:基础镜像WORKDIR /app:工作目录COPY . .:复制代码RUN pip install -r requirements.txt:安装依赖CMD ["python", "main.py"]:启动命令
- 实战示例:
FROM python:3.11-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
- 优化技巧:多阶段构建、优先选择兼容性更稳的 slim 镜像、清理缓存;只有依赖已验证兼容时再考虑 Alpine
-
Docker Compose多容器编排(第4章)
- 应用场景:LLM应用 + 向量数据库 + Redis缓存一起启动
- 为什么重要:实际项目通常需要多个服务配合,手动启动容器太繁琐
- 核心配置:
version: '3.8'services:app:build: .ports:- "8000:8000"environment:- OPENAI_API_KEY=${OPENAI_API_KEY}depends_on:- qdrant- redisqdrant:image: qdrant/qdrantports:- "6333:6333"volumes:- qdrant_data:/qdrant/storageredis:image: redis:alpineports:- "6379:6379"volumes:qdrant_data:
- 核心命令:
docker-compose up -d:启动所有服务docker-compose down:停止并删除docker-compose logs -f app:查看日志
-
日志查看与调试(第3.2节)
- 应用场景:应用报错、性能问题定位、查看运行状态
- 为什么重要:容器内部运行,不看日志无法排查问题
- 核心命令:
docker logs -f container_id:实时查看日志docker exec -it container_id bash:进入容器内部docker stats:查看资源占用
- 实战技巧:
终端窗口 # 查看最近100行日志docker logs --tail 100 my-app# 进入容器检查文件docker exec -it my-app bashls /appcat /app/logs/error.log
-
环境变量管理(第2.3节)
- 应用场景:配置API Key、数据库连接、模型参数
- 为什么重要:敏感信息不能写死在代码里,必须用环境变量
- 三种方式:
-e KEY=VALUE:命令行传参--env-file .env:从文件读取- docker-compose.yml的environment
- 实战示例:
终端窗口 # 命令行docker run -e OPENAI_API_KEY=sk-xxx my-app# 文件docker run --env-file .env my-app# .env文件内容OPENAI_API_KEY=sk-xxxQDRANT_URL=http://qdrant:6333
★★★ 补充掌握
-
自动重启策略(第1.3节)
- 实用场景:应用崩溃、服务器重启后自动恢复
- 重启策略:
--restart=always(总是重启) - 价值:避免半夜服务挂了没人重启
-
资源限制(第2.4节)
- 实用场景:防止某个容器占满CPU/内存导致其他服务崩溃
- 核心参数:
--memory=2g --cpus=1.5 - 价值:资源隔离、防止雪崩
-
镜像优化(第2.5节)
- 实用价值:减小镜像体积、加快拉取速度、降低存储成本
- 优化技巧:
- 使用Alpine基础镜像(体积小)
- 多阶段构建(编译和运行分离)
- 清理pip缓存(–no-cache-dir)
- 合并RUN指令减少层数
-
网络通信(第2.2节)
- 实用场景:容器间互相调用(App调用向量数据库)
- 核心概念:同一网络下容器可以通过服务名访问
- 实战:docker-compose自动创建网络,服务名即域名
-
清理与维护(第5章)
- 实用场景:磁盘空间不足、清理未使用的镜像/容器
- 核心命令:
docker system prune -a:清理所有未使用资源docker volume prune:清理未使用的Volume
- 建议:定期清理避免磁盘爆满
★ 了解即可
- Docker网络模式详解 - bridge/host/none等,默认够用
- Docker Swarm集群 - 多机部署、服务扩展,单机够用暂时不需要
- 私有镜像仓库 - Harbor搭建,企业内部才需要
- 安全加固 - 镜像扫描、最小权限,生产环境运维负责
第一章:Docker 核心基础 ★★★★★
🔥 学习优先级:重点掌握 使用位置: 构建、运行、检查和管理应用容器;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。
1.1 Docker 简介
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。
核心概念:
- 镜像(Image):只读模板,包含运行应用所需的所有内容
- 容器(Container):镜像的运行实例,是应用的实际运行环境
- 仓库(Registry):存储和分发镜像的服务(如 Docker Hub)
1.2 镜像管理命令
1.2.1 搜索镜像
# 在 Docker Hub 搜索镜像docker search nginx
# 搜索官方镜像docker search --filter "is-official=true" nginx1.2.2 拉取镜像
# 拉取最新版本docker pull nginx
# 拉取指定版本docker pull nginx:1.25
# 拉取指定平台镜像docker pull --platform linux/amd64 nginx1.2.3 查看本地镜像
# 列出所有镜像docker images
# 查看镜像详细信息docker image inspect nginx
# 查看镜像历史层docker history nginx1.2.4 删除镜像
# 删除单个镜像docker rmi nginx:1.25
# 删除多个镜像docker rmi nginx redis
# 强制删除(即使有容器在使用)docker rmi -f nginx
# 删除未使用的镜像docker image prune1.2.5 镜像标签管理
# 为镜像添加新标签docker tag nginx:latest mynginx:v1.0
# 推送到仓库(需先登录)docker logindocker push mynginx:v1.01.3 容器管理命令
1.3.1 创建和运行容器
# 运行容器(前台运行)docker run nginx
# 后台运行容器docker run -d nginx
# 指定容器名称docker run -d --name my-nginx nginx
# 端口映射:宿主机端口:容器端口docker run -d -p 8080:80 nginx
# 多个端口映射docker run -d -p 8080:80 -p 8443:443 nginx
# 自动重启策略docker run -d --restart=always nginx常用 restart 策略:
no:不自动重启(默认)on-failure:容器异常退出时重启always:总是重启unless-stopped:除非手动停止,否则总是重启
1.3.2 查看容器
# 查看运行中的容器docker ps
# 查看所有容器(包括已停止)docker ps -a
# 查看最近创建的容器docker ps -l
# 只显示容器 IDdocker ps -q
# 查看容器详细信息docker inspect my-nginx1.3.3 容器生命周期管理
# 启动已停止的容器docker start my-nginx
# 停止运行中的容器docker stop my-nginx
# 强制停止容器docker kill my-nginx
# 重启容器docker restart my-nginx
# 暂停容器docker pause my-nginx
# 恢复暂停的容器docker unpause my-nginx
# 删除容器(必须先停止)docker rm my-nginx
# 强制删除运行中的容器docker rm -f my-nginx
# 删除所有已停止的容器docker container prune1.3.4 容器交互
# 进入运行中的容器(推荐)docker exec -it my-nginx bash
# 如果容器没有 bash,使用 shdocker exec -it my-nginx sh
# 在容器中执行单个命令docker exec my-nginx ls /usr/share/nginx/html
# 以 root 用户进入容器docker exec -it --user root my-nginx bash
# 附加到容器的标准输出(不推荐用于交互)docker attach my-nginxexec vs attach 的区别:
exec:在容器中启动新进程,退出不会停止容器attach:附加到容器主进程,退出会停止容器
第二章:进阶用法 ★★★★★
🔥 学习优先级:重点掌握 使用位置: 处理持久化、网络、配置、资源限制和镜像构建;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。
2.1 数据卷(Volume)管理
容器数据默认存储在可写层,容器删除后数据丢失。Volume 用于持久化数据。
2.1.1 Volume 基础操作
# 创建命名数据卷docker volume create my-volume
# 查看所有数据卷docker volume ls
# 查看数据卷详细信息docker volume inspect my-volume
# 删除数据卷docker volume rm my-volume
# 清理未使用的数据卷docker volume prune2.1.2 使用 Volume
# 使用命名数据卷docker run -d -v my-volume:/usr/share/nginx/html --name nginx1 nginx
# 使用匿名数据卷docker run -d -v /usr/share/nginx/html --name nginx2 nginx
# 绑定挂载(Bind Mount):宿主机路径:容器路径docker run -d -v /home/user/html:/usr/share/nginx/html nginx
# Windows 路径示例docker run -d -v C:/Users/user/html:/usr/share/nginx/html nginx
# 只读挂载docker run -d -v my-volume:/usr/share/nginx/html:ro nginx三种挂载方式对比:
| 类型 | 语法 | 适用场景 |
|---|---|---|
| Volume | -v volume-name:/path |
生产环境数据持久化 |
| Bind Mount | -v /host/path:/container/path |
开发环境代码同步 |
| tmpfs | --tmpfs /path |
临时数据,不需要持久化 |
2.1.3 Volume 高级用法
# 使用 --mount 语法(更明确)docker run -d \ --mount source=my-volume,target=/usr/share/nginx/html \ nginx
# 多个数据卷docker run -d \ -v volume1:/data1 \ -v volume2:/data2 \ nginx
# 从其他容器挂载数据卷docker run -d --name nginx1 -v my-volume:/data nginxdocker run -d --name nginx2 --volumes-from nginx1 nginx2.2 网络管理
Docker 提供多种网络模式,用于容器间通信和外部访问。
2.2.1 网络基础命令
# 查看所有网络docker network ls
# 查看网络详细信息docker network inspect bridge
# 创建自定义网络docker network create my-network
# 删除网络docker network rm my-network
# 清理未使用的网络docker network prune2.2.2 网络模式
# bridge 模式(默认):容器有独立网络命名空间docker run -d --network bridge nginx
# host 模式:容器使用宿主机网络docker run -d --network host nginx
# none 模式:容器无网络docker run -d --network none nginx
# container 模式:共享其他容器的网络docker run -d --name nginx1 nginxdocker run -d --network container:nginx1 busybox2.2.3 自定义网络
# 创建自定义桥接网络docker network create --driver bridge my-bridge
# 指定子网和网关docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --gateway 172.20.0.1 \ my-custom-network
# 在自定义网络中运行容器docker run -d --network my-custom-network --name web nginxdocker run -d --network my-custom-network --name db mysql
# 容器加入网络docker network connect my-custom-network my-container
# 容器断开网络docker network disconnect my-custom-network my-container自定义网络的优势:
- 自动 DNS 解析:容器可通过容器名互相访问
- 更好的隔离性
- 可动态连接/断开网络
2.3 环境变量
# 传递单个环境变量docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
# 传递多个环境变量docker run -d \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=mydb \ -e MYSQL_USER=user \ mysql
# 从文件加载环境变量# 创建 env.list 文件# MYSQL_ROOT_PASSWORD=secret# MYSQL_DATABASE=mydbdocker run -d --env-file env.list mysql
# 查看容器环境变量docker exec my-container env2.4 资源限制
限制容器资源使用,防止单个容器占用过多资源。
2.4.1 内存限制
# 限制内存为 512MBdocker run -d -m 512m nginx
# 限制内存和交换分区docker run -d -m 512m --memory-swap 1g nginx
# 内存预留(软限制)docker run -d --memory-reservation 256m nginx2.4.2 CPU 限制
# 限制 CPU 份额(相对权重)docker run -d --cpu-shares 512 nginx
# 限制 CPU 核心数docker run -d --cpus 1.5 nginx
# 指定使用的 CPU 核心docker run -d --cpuset-cpus 0,1 nginx2.4.3 综合示例
# 综合资源限制docker run -d \ --name limited-container \ -m 512m \ --cpus 1.0 \ --restart unless-stopped \ nginx2.5 Dockerfile 编写
Dockerfile 是构建自定义镜像的脚本文件。
2.5.1 基础指令
# 基础镜像FROM nginx:latest
# 维护者信息LABEL maintainer="your-email@example.com"
# 工作目录WORKDIR /app
# 复制文件COPY index.html /usr/share/nginx/html/
# 添加文件(支持 URL 和自动解压)ADD app.tar.gz /app/
# 运行命令(构建时执行)RUN apt-get update && apt-get install -y curl
# 环境变量ENV APP_ENV=production
# 暴露端口EXPOSE 80 443
# 数据卷VOLUME /data
# 启动命令(容器运行时执行)CMD ["nginx", "-g", "daemon off;"]2.5.2 多阶段构建
# 第一阶段:构建FROM node:18 AS builderWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run build
# 第二阶段:运行FROM nginx:alpineCOPY --from=builder /app/dist /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]2.5.3 构建镜像
# 基础构建docker build -t myapp:v1.0 .
# 指定 Dockerfiledocker build -f Dockerfile.prod -t myapp:prod .
# 使用构建参数docker build --build-arg VERSION=1.0 -t myapp:v1.0 .
# 不使用缓存docker build --no-cache -t myapp:v1.0 .2.5.4 Dockerfile 最佳实践
# 1. 使用具体版本标签FROM node:18.17-alpine
# 2. 合并 RUN 命令减少层数RUN apt-get update && \ apt-get install -y curl vim && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
# 3. 使用 .dockerignore 排除不必要文件# .dockerignore 文件内容:# node_modules# .git# *.log
# 4. 利用构建缓存,将变化少的指令放前面COPY package*.json ./RUN npm installCOPY . .
# 5. 使用非 root 用户运行RUN useradd -m myuserUSER myuser
# 6. 使用 ENTRYPOINT + CMD 组合ENTRYPOINT ["docker-entrypoint.sh"]CMD ["nginx", "-g", "daemon off;"]第三章:容器管理进阶 ★★★
🧩 学习优先级:补充掌握 使用位置: 按需诊断容器状态、日志、资源和镜像迁移;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。
3.1 容器辅助命令
3.1.1 复制文件
# 从容器复制到宿主机docker cp my-container:/path/to/file.txt /local/path/
# 从宿主机复制到容器docker cp /local/path/file.txt my-container:/path/to/
# 复制目录docker cp my-container:/app /local/backup/3.1.2 查看容器统计信息
# 实时查看容器资源使用docker stats
# 查看指定容器docker stats my-container
# 查看所有容器(包括已停止)docker stats --all
# 不实时更新,只显示一次docker stats --no-stream3.1.3 查看容器进程
# 查看容器内进程docker top my-container
# 查看容器端口映射docker port my-container3.2 日志管理
3.2.1 查看容器日志
# 查看全部日志docker logs my-container
# 实时跟踪日志(类似 tail -f)docker logs -f my-container
# 显示最近 100 行docker logs --tail 100 my-container
# 显示时间戳docker logs -t my-container
# 查看特定时间段日志docker logs --since 2024-01-01T00:00:00 my-containerdocker logs --since 1h my-container3.2.2 日志驱动配置
# 使用 JSON 文件日志驱动(默认)docker run -d --log-driver json-file nginx
# 限制日志大小docker run -d \ --log-driver json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ nginx
# 使用 syslogdocker run -d --log-driver syslog nginx
# 禁用日志docker run -d --log-driver none nginx3.3 容器监控
3.3.1 查看容器变更
# 查看容器文件系统变更docker diff my-container输出说明:
A:文件或目录被添加C:文件或目录被修改D:文件或目录被删除
3.3.2 容器事件监控
# 实时监控 Docker 事件docker events
# 过滤特定容器事件docker events --filter container=my-container
# 过滤事件类型docker events --filter event=startdocker events --filter event=stop3.4 容器导出与导入
# 导出容器为 tar 文件docker export my-container > container-backup.tar
# 导入 tar 文件为镜像docker import container-backup.tar myimage:v1.0
# 保存镜像为 tar 文件docker save -o nginx-image.tar nginx:latest
# 加载镜像 tar 文件docker load -i nginx-image.tarexport/import vs save/load 的区别:
export/import:导出容器,丢失历史和元数据save/load:保存镜像,保留完整历史和元数据
第四章:Docker Compose ★★★★★
🔥 学习优先级:重点掌握 使用位置: 编排 API、数据库、向量库和缓存等多服务环境;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。
Docker Compose 是用于定义和运行多容器 Docker 应用的工具。
4.1 Docker Compose 基础
4.1.1 安装 Docker Compose
# Linux 安装sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
# 验证安装docker-compose --versionDocker Desktop (Windows/Mac) 自带 Docker Compose。
4.1.2 基础 docker-compose.yml
version: '3.8'
services: web: image: nginx:latest ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html networks: - my-network
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: mydb volumes: - db-data:/var/lib/mysql networks: - my-network
networks: my-network: driver: bridge
volumes: db-data:4.1.3 Compose 常用命令
# 启动所有服务(后台运行)docker-compose up -d
# 查看服务状态docker-compose ps
# 查看服务日志docker-compose logs
# 实时跟踪日志docker-compose logs -f
# 查看特定服务日志docker-compose logs web
# 停止所有服务docker-compose stop
# 停止并删除容器、网络docker-compose down
# 停止并删除容器、网络、数据卷docker-compose down -v
# 重启服务docker-compose restart
# 重新构建镜像docker-compose build
# 构建并启动docker-compose up -d --build4.2 Compose 进阶配置
4.2.1 使用 Dockerfile 构建
version: '3.8'
services: app: build: context: ./app dockerfile: Dockerfile args: - VERSION=1.0 ports: - "3000:3000" environment: - NODE_ENV=production4.2.2 依赖关系
version: '3.8'
services: web: image: nginx depends_on: - app - db
app: image: myapp depends_on: - db
db: image: postgres4.2.3 健康检查
version: '3.8'
services: db: image: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 54.2.4 资源限制
version: '3.8'
services: app: image: myapp deploy: resources: limits: cpus: '1.0' memory: 512M reservations: cpus: '0.5' memory: 256M4.3 完整示例:WordPress + MySQL
version: '3.8'
services: wordpress: image: wordpress:latest container_name: my-wordpress restart: always ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress_db volumes: - wordpress-data:/var/www/html depends_on: - db networks: - wp-network
db: image: mysql:8.0 container_name: my-mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: wordpress_db MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress_password volumes: - db-data:/var/lib/mysql networks: - wp-network
volumes: wordpress-data: db-data:
networks: wp-network: driver: bridge使用方法:
# 保存为 docker-compose.yml# 启动服务docker-compose up -d
# 访问 http://localhost:8080第五章:清理与维护 ★★★
🧩 学习优先级:补充掌握 使用位置: 控制磁盘占用、日志增长和无用资源;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。
Docker 使用过程中会积累大量未使用的镜像、容器、网络和数据卷,需要定期清理。
5.1 查看 Docker 磁盘使用
# 查看 Docker 占用的磁盘空间docker system df
# 详细查看docker system df -v输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 10 5 2.5GB 1.2GB (48%)Containers 15 3 500MB 300MB (60%)Local Volumes 5 2 1GB 500MB (50%)Build Cache 20 0 800MB 800MB (100%)5.2 清理命令
5.2.1 清理容器
# 删除所有已停止的容器docker container prune
# 强制删除(不提示确认)docker container prune -f
# 删除特定时间之前的容器docker container prune --filter "until=24h"5.2.2 清理镜像
# 删除未使用的镜像(悬空镜像)docker image prune
# 删除所有未使用的镜像(包括未被任何容器使用的)docker image prune -a
# 删除特定时间之前的镜像docker image prune -a --filter "until=48h"5.2.3 清理网络
# 删除未使用的网络docker network prune
# 强制删除docker network prune -f5.2.4 清理数据卷
# 删除未使用的数据卷(谨慎操作!)docker volume prune
# 强制删除docker volume prune -f5.2.5 一键清理
# 清理所有未使用的对象(容器、镜像、网络、构建缓存)docker system prune
# 清理所有未使用的对象(包括数据卷)docker system prune --volumes
# 清理所有未使用的对象(包括使用中的镜像)docker system prune -a
# 完全清理(谨慎使用!)docker system prune -a --volumes -f5.3 定期维护脚本
#!/bin/bash# docker-cleanup.sh - Docker 定期清理脚本
echo "开始清理 Docker..."
# 清理已停止的容器echo "清理已停止的容器..."docker container prune -f
# 清理悬空镜像echo "清理悬空镜像..."docker image prune -f
# 清理未使用的网络echo "清理未使用的网络..."docker network prune -f
# 清理未使用的构建缓存echo "清理构建缓存..."docker builder prune -f
# 显示清理后的磁盘使用情况echo "清理完成!当前磁盘使用情况:"docker system df
echo "Docker 清理完成!"使用方法:
chmod +x docker-cleanup.sh./docker-cleanup.sh5.4 监控最佳实践
# 定期检查 Docker 磁盘使用# 添加到 crontab,每天凌晨 2 点执行# crontab -e# 0 2 * * * /path/to/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1
# 设置日志轮转# 在 /etc/docker/daemon.json 中配置{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }}
# 重启 Docker 服务使配置生效sudo systemctl restart docker第六章:学习路线图 ★★★
🧩 学习优先级:补充掌握 使用位置: 规划练习顺序和部署能力提升路径;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。
6.1 初级阶段(1-2 周)
目标:掌握 Docker 基础操作
学习内容
-
Docker 概念理解
- 镜像、容器、仓库的关系
- Docker 架构和工作原理
-
基础命令练习
- 镜像操作:pull、images、rmi
- 容器操作:run、ps、stop、rm
- 容器交互:exec、logs
实践项目
# 项目 1:运行一个 Nginx 静态网站docker run -d -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx
# 项目 2:运行 MySQL 数据库docker run -d \ --name my-mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 \ mysql:8.0
# 项目 3:进入容器调试docker exec -it my-mysql bashmysql -u root -p学习检查清单
- 能够搜索和拉取镜像
- 能够启动、停止、删除容器
- 理解端口映射的作用
- 能够进入容器执行命令
- 能够查看容器日志
6.2 中级阶段(2-3 周)
目标:掌握 Docker 进阶特性
学习内容
-
数据持久化
- Volume 的三种挂载方式
- 数据卷管理和备份
-
网络管理
- 理解 Docker 网络模式
- 自定义网络和容器通信
-
Dockerfile 编写
- 常用指令和最佳实践
- 多阶段构建优化镜像大小
实践项目
# 项目 4:构建自定义 Node.js 应用镜像FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run build
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY package*.json ./RUN npm install --productionEXPOSE 3000CMD ["node", "dist/index.js"]# 项目 5:自定义网络和容器通信docker network create my-app-networkdocker run -d --name db --network my-app-network postgresdocker run -d --name app --network my-app-network myapp# app 容器中可以通过 db 主机名访问数据库学习检查清单
- 能够使用 Volume 持久化数据
- 理解不同网络模式的区别
- 能够创建自定义网络
- 能够编写基础 Dockerfile
- 能够构建自定义镜像
6.3 高级阶段(3-4 周)
目标:掌握生产环境最佳实践
学习内容
-
Docker Compose
- 多容器应用编排
- 环境变量和配置管理
-
镜像优化
- 减小镜像体积
- 安全最佳实践
-
监控和日志
- 容器监控
- 日志管理和聚合
实践项目
# 项目 6:完整的微服务应用version: '3.8'
services: frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend networks: - app-network
backend: build: ./backend ports: - "8080:8080" environment: - DATABASE_URL=postgres://user:pass@db:5432/mydb depends_on: - db - redis networks: - app-network
db: image: postgres:15 environment: - POSTGRES_DB=mydb - POSTGRES_USER=user - POSTGRES_PASSWORD=pass volumes: - db-data:/var/lib/postgresql/data networks: - app-network
redis: image: redis:7-alpine networks: - app-network
networks: app-network:
volumes: db-data:学习检查清单
- 能够使用 Docker Compose 编排多容器应用
- 理解镜像优化技巧
- 能够实现容器日志管理
- 能够监控容器资源使用
- 理解容器安全最佳实践
6.4 专家阶段(持续学习)
目标:深入理解 Docker 生态
扩展方向
-
容器编排
- Kubernetes 基础
- Docker Swarm
-
CI/CD 集成
- GitLab CI/CD + Docker
- Jenkins + Docker
-
镜像仓库
- 搭建私有 Registry
- Harbor 企业级仓库
-
安全加固
- 镜像扫描(Trivy、Clair)
- 运行时安全(AppArmor、SELinux)
6.5 学习资源推荐
官方文档
- Docker 官方文档:https://docs.docker.com/
- Docker Hub:https://hub.docker.com/
在线练习
- Play with Docker:https://labs.play-with-docker.com/
- Katacoda Docker 课程:https://www.katacoda.com/courses/docker
书籍推荐
- 《Docker 从入门到实践》
- 《Docker 容器与容器云》
- 《Kubernetes 权威指南》
第七章:常见问题 FAQ ★★★★★
🔥 学习优先级:重点掌握 使用位置: 定位容器退出、端口、网络、数据和安全问题;学习要求: 理解原理,能独立修改、组合使用并排查常见问题。
7.1 安装和配置
Q1: Docker 和 Docker Desktop 有什么区别?
A:
- Docker Engine:核心引擎,Linux 原生支持
- Docker Desktop:适用于 Windows/Mac 的图形化工具,内置 Docker Engine
Q2: Windows 上 Docker Desktop 无法启动怎么办?
A:
# 检查 WSL2 是否启用wsl --list --verbose
# 更新 WSL2wsl --update
# 确保已启用虚拟化(BIOS 设置)# Intel: VT-x# AMD: AMD-VQ3: 如何配置 Docker 镜像加速器?
A: 编辑 /etc/docker/daemon.json(Linux)或 Docker Desktop 设置(Windows/Mac):
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ]}重启 Docker:
sudo systemctl restart docker7.2 容器运行问题
Q4: 容器启动后立即退出?
A:
# 查看容器退出原因docker logs <container-id>
# 查看容器详细信息docker inspect <container-id>
# 常见原因:# 1. 容器内主进程执行完毕# 2. 配置错误(环境变量、挂载路径)# 3. 端口冲突Q5: 如何查看容器内运行的进程?
A:
# 查看容器进程docker top <container-name>
# 进入容器查看docker exec -it <container-name> ps auxQ6: 端口已被占用怎么办?
A:
# Linux/Mac 查看端口占用sudo lsof -i :8080
# Windows 查看端口占用netstat -ano | findstr :8080
# 更换端口或停止占用进程docker run -d -p 8081:80 nginx7.3 数据和网络
Q7: 容器删除后数据丢失怎么办?
A: 使用 Volume 持久化数据:
# 创建命名数据卷docker volume create my-data
# 使用数据卷docker run -d -v my-data:/data nginx
# 即使容器删除,数据卷仍然保留Q8: 容器之间无法通信?
A:
# 检查容器是否在同一网络docker network inspect bridge
# 使用自定义网络docker network create my-networkdocker run -d --name web --network my-network nginxdocker run -d --name app --network my-network myapp
# app 容器中可以通过 "web" 主机名访问 nginxQ9: 如何备份和恢复数据卷?
A:
# 备份数据卷docker run --rm \ -v my-volume:/source \ -v $(pwd):/backup \ alpine tar czf /backup/volume-backup.tar.gz -C /source .
# 恢复数据卷docker run --rm \ -v my-volume:/target \ -v $(pwd):/backup \ alpine tar xzf /backup/volume-backup.tar.gz -C /target7.4 镜像问题
Q10: 镜像拉取速度慢或失败?
A:
# 1. 配置镜像加速器(见 Q3)# 2. 使用代理docker pull --platform linux/amd64 nginx
# 3. 手动下载镜像 tar 包并导入docker load -i nginx.tarQ11: 如何减小镜像体积?
A:
# 1. 使用 alpine 基础镜像FROM node:18-alpine
# 2. 多阶段构建FROM node:18 AS builderWORKDIR /appCOPY . .RUN npm install && npm run build
FROM node:18-alpineCOPY --from=builder /app/dist ./dist
# 3. 清理缓存RUN apt-get update && apt-get install -y curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
# 4. 合并 RUN 命令RUN command1 && command2 && command3Q12: 悬空镜像(dangling images)是什么?
A:
# 悬空镜像:没有标签的镜像,通常是构建过程中的中间镜像# 查看悬空镜像docker images -f dangling=true
# 删除悬空镜像docker image prune7.5 Docker Compose
Q13: docker-compose 和 docker compose 有什么区别?
A:
docker-compose:独立的 Python 工具(V1,已弃用)docker compose:Docker CLI 插件(V2,推荐使用)
# 两者命令基本相同docker-compose up -ddocker compose up -d # 推荐Q14: Compose 文件中环境变量如何使用?
A:
version: '3.8'
services: app: image: myapp environment: - DB_HOST=${DB_HOST:-localhost} # 默认值 - DB_PORT=${DB_PORT}# .env 文件DB_HOST=databaseDB_PORT=5432
# 启动时会自动读取 .env 文件docker compose up -dQ15: 如何查看 Compose 服务的日志?
A:
# 查看所有服务日志docker compose logs
# 查看特定服务docker compose logs web
# 实时跟踪docker compose logs -f web
# 最近 100 行docker compose logs --tail 1007.6 性能和资源
Q16: Docker 占用磁盘空间过大?
A:
# 查看磁盘使用docker system df
# 清理未使用的资源docker system prune -a --volumes
# 配置日志大小限制# /etc/docker/daemon.json{ "log-opts": { "max-size": "10m", "max-file": "3" }}Q17: 如何限制容器资源使用?
A:
# 限制内存和 CPUdocker run -d \ --memory 512m \ --cpus 1.0 \ nginx
# 查看容器资源使用docker statsQ18: 容器性能监控工具推荐?
A:
# 1. docker stats(内置)docker stats
# 2. cAdvisor(Google 开源)docker run -d \ -p 8080:8080 \ -v /:/rootfs:ro \ -v /var/run:/var/run:ro \ -v /sys:/sys:ro \ -v /var/lib/docker/:/var/lib/docker:ro \ google/cadvisor:latest
# 3. Portainer(Web UI)docker run -d \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ portainer/portainer-ce7.7 安全问题
Q19: Docker 容器安全吗?
A: 容器提供一定程度的隔离,但不是完全隔离。安全最佳实践:
# 1. 使用非 root 用户运行docker run -d --user 1000:1000 nginx
# 2. 只读根文件系统docker run -d --read-only nginx
# 3. 限制能力docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# 4. 使用官方镜像docker pull nginx:1.25 # 指定版本
# 5. 扫描镜像漏洞docker scan nginx:latestQ20: 如何保护敏感信息(密码、密钥)?
A:
# 1. 使用 Docker Secrets(Swarm 模式)echo "my_secret_password" | docker secret create db_password -
# 2. 使用环境变量文件(不提交到版本控制)docker run --env-file .env.local myapp
# 3. 使用外部密钥管理系统# - HashiCorp Vault# - AWS Secrets Manager# - Azure Key Vault附录:快速参考 ★★★
🧩 学习优先级:补充掌握 使用位置: 开发和部署时快速查询命令;学习要求: 能读懂并知道何时使用,项目需要时可快速落地。
常用命令速查表
# 镜像操作docker pull <image> # 拉取镜像docker images # 列出镜像docker rmi <image> # 删除镜像docker build -t <name> . # 构建镜像
# 容器操作docker run -d <image> # 后台运行容器docker ps # 查看运行中的容器docker ps -a # 查看所有容器docker stop <container> # 停止容器docker start <container> # 启动容器docker restart <container> # 重启容器docker rm <container> # 删除容器
# 容器交互docker exec -it <container> bash # 进入容器docker logs -f <container> # 查看日志docker cp <src> <dst> # 复制文件
# 网络和数据卷docker network ls # 列出网络docker volume ls # 列出数据卷docker network create <name> # 创建网络docker volume create <name> # 创建数据卷
# 清理命令docker system prune # 清理未使用的资源docker image prune # 清理未使用的镜像docker container prune # 清理停止的容器
# Compose 命令docker compose up -d # 启动服务docker compose down # 停止服务docker compose logs -f # 查看日志docker compose ps # 查看服务状态资源链接
- 官方文档: https://docs.docker.com/
- Docker Hub: https://hub.docker.com/
- 社区论坛: https://forums.docker.com/
- GitHub: https://github.com/docker
结语 ★
👀 学习优先级:了解即可 使用位置: 回顾学习方向,不需要单独投入时间记忆;学习要求: 建立概念边界,不必首次记忆细节,需要时再查询。
Docker 是现代应用开发和部署的基础工具。通过本指南的系统学习,你应该能够:
✅ 理解 Docker 核心概念和工作原理
✅ 熟练使用 Docker 命令管理容器和镜像
✅ 编写 Dockerfile 构建自定义镜像
✅ 使用 Docker Compose 编排多容器应用
✅ 掌握生产环境的最佳实践
下一步学习方向:
- Kubernetes 容器编排
- CI/CD 集成实践
- 微服务架构设计
- 云原生应用开发
持续学习建议:
- 多动手实践,从简单项目开始
- 关注官方博客和社区动态
- 参与开源项目,学习最佳实践
- 考虑获得 Docker 认证(DCA)
祝你学习顺利,容器化之旅愉快!🐳
文档版本: v1.0
最后更新: 2026-08-03
作者: Claude AI
许可: 本文档采用 CC BY-SA 4.0 许可协议
本文由作者整理,AI 辅助润色。