教程来源:《Docker入门到项目实战》
1. 基础概念
1.1 为什么有Docker?
传统部署的痛点
- 环境不一致:”在我机器上能跑”的经典问题
- 依赖管理复杂:版本冲突和依赖地狱
- 资源利用率低:虚拟机资源开销大
- 部署流程繁琐:手动配置容易出错
Docker的核心优势
特性 |
说明 |
对比传统方式 |
轻量级虚拟化 |
共享宿主机内核,启动速度快 |
比虚拟机节省90%资源 |
环境一致性 |
开发、测试、生产环境完全统一 |
消除环境差异问题 |
快速部署 |
秒级启动,支持水平扩展 |
部署时间从分钟级降到秒级 |
资源高效 |
容器间共享操作系统 |
单机可运行更多应用实例 |
1.2 Docker架构与容器化
系统架构图
1 2 3 4 5 6 7 8 9 10 11 12 13
| ┌─────────────────────────────────────────────────────────┐ │ Docker架构 │ ├─────────────────────────────────────────────────────────┤ │ Docker Client │ │ ├─ docker build ├─ docker pull ├─ docker run │ ├─────────────────────────────────────────────────────────┤ │ Docker Daemon (dockerd) │ │ ├─ API Server ├─ Image Manager ├─ Container Mgr │ ├─────────────────────────────────────────────────────────┤ │ Docker Objects │ │ ├─ Images ├─ Containers ├─ Networks │ │ └─ Volumes └─ Plugins └─ Services │ └─────────────────────────────────────────────────────────┘
|
核心概念解析
组件 |
定义 |
作用 |
示例 |
镜像(Image) |
只读模板,包含应用运行环境 |
创建容器的基础 |
nginx:latest |
容器(Container) |
镜像的运行实例 |
应用的实际运行环境 |
运行中的Web服务 |
仓库(Registry) |
镜像存储和分发中心 |
镜像版本管理 |
Docker Hub |
Dockerfile |
镜像构建脚本 |
自动化构建镜像 |
包含FROM、RUN等指令 |
2. Docker命令操作
2.1 镜像操作
镜像生命周期管理
搜索和获取镜像
1 2 3 4 5 6
| docker search nginx
docker pull nginx:1.21-alpine docker pull nginx:latest
|
查看和检查镜像
1 2 3 4 5 6 7 8 9
| docker images docker image ls
docker inspect nginx:latest
docker history nginx:latest
|
镜像标签和清理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker tag nginx:latest mynginx:v1.0 docker tag nginx:latest registry.example.com/mynginx:v1.0
docker rmi nginx:latest docker image rm nginx:latest
docker rmi 605c77e624dd
docker image prune docker image prune -a
|
2.2 容器操作
容器创建和运行
基础运行模式
1 2 3 4 5 6 7 8
| docker run nginx:latest
docker run -d nginx:latest
docker run -it ubuntu:20.04 /bin/bash
|
高级运行配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run -d \ --name my-nginx \ -p 8080:80 \ -v /host/data:/usr/share/nginx/html \ --restart unless-stopped \ --memory 512m \ --cpus 0.5 \ nginx:latest
docker run -d \ --name my-app \ -e NODE_ENV=production \ -e PORT=3000 \ node:16-alpine
|
容器状态管理
查看容器状态
1 2 3 4 5 6 7 8 9 10 11 12
| docker ps
docker ps -a
docker inspect my-nginx
docker stats docker stats my-nginx
|
容器生命周期控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker stop my-nginx
docker kill my-nginx
docker start my-nginx
docker restart my-nginx
docker pause my-nginx docker unpause my-nginx
|
容器交互和调试
进入容器
1 2 3 4 5 6 7
| docker exec -it my-nginx /bin/bash docker exec -it my-nginx sh
docker exec my-nginx ls -la /usr/share/nginx/html docker exec my-nginx nginx -t
|
日志和监控
1 2 3 4 5 6 7 8 9 10 11
| docker logs my-nginx
docker logs -f my-nginx
docker logs --tail 50 my-nginx
docker logs -t my-nginx
|
容器清理
1 2 3 4 5 6 7 8 9 10 11
| docker rm my-nginx
docker rm -f my-nginx
docker container prune
docker rm -f $(docker ps -aq)
|
2.3 docker run
常用参数
1 2 3 4 5 6 7 8 9 10 11 12
| docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach -it --name -p, --publish -v, --volume -e, --env --network --restart --rm
|
实际示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run -d \ --name mysql-server \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v mysql-data:/var/lib/mysql \ --restart unless-stopped \ mysql:8.0
docker run -d \ --name redis-server \ -p 6379:6379 \ -v redis-data:/data \ --restart unless-stopped \ redis:7-alpine redis-server --appendonly yes
|
2.4 保存和分享镜像
保存镜像到文件
1 2 3 4 5 6 7 8 9 10 11
| docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
docker export mynginx > mynginx.tar
docker import mynginx.tar mynginx:v1.0
|
分享镜像到仓库
1 2 3 4 5 6 7 8
| docker login
docker push username/mynginx:v1.0
docker pull username/mynginx:v1.0
|
3. 存储管理
3.1 数据持久化策略
存储类型对比
存储类型 |
特点 |
使用场景 |
性能 |
可移植性 |
Volumes |
Docker管理,独立于容器 |
数据库、配置文件 |
高 |
优秀 |
Bind Mounts |
直接挂载主机目录 |
开发环境、代码同步 |
高 |
依赖主机 |
tmpfs |
内存存储,临时数据 |
缓存、临时文件 |
最高 |
不持久 |
3.2 目录挂载 (Bind Mounts)
基本概念
- 将宿主机的目录或文件直接挂载到容器内
- 路径必须是绝对路径
- 适合开发环境和配置文件挂载
- 性能优秀,但依赖主机文件系统
实际操作示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| docker run -d \ --name nginx-web \ -p 8080:80 \ -v /host/path:/container/path \ nginx
docker run -d \ --name nginx-web \ -p 8080:80 \ -v D:/web:/usr/share/nginx/html \ nginx
docker run -d \ --name nginx-web \ -p 8080:80 \ -v D:/web:/usr/share/nginx/html:ro \ nginx
docker run -d \ --name dev-app \ -p 3000:3000 \ -v $(pwd):/app \ -v /app/node_modules \ node:18-alpine npm run dev
|
3.3 数据卷(Docker Volumes)
数据卷优势
- 由 Docker 管理,更安全可靠
- 可以在容器间共享和重用
- 支持远程存储驱动
- 备份和迁移更方便
- 跨平台兼容性好
- 支持卷驱动插件
卷管理操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker volume create mysql-data docker volume create --driver local mysql-data
docker volume ls
docker volume inspect mysql-data
docker volume rm mysql-data
docker volume prune docker volume prune -f
|
数据卷使用模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| docker run -d \ --name mysql-db \ -v mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0
docker run -d \ --name redis-cache \ -v /data \ redis:7-alpine
docker run -d \ -v config-vol:/etc/nginx/conf.d:ro \ nginx:latest
docker run -d \ -v app-data:/app/data \ -v app-logs:/app/logs \ -v app-config:/app/config:ro \ my-app:latest
|
数据卷备份与恢复
1 2 3 4 5 6 7 8 9 10 11
| docker run --rm \ -v mysql-data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/mysql-backup.tar.gz -C /data .
docker run --rm \ -v mysql-data:/data \ -v $(pwd):/backup \ alpine tar xzf /backup/mysql-backup.tar.gz -C /data
|
4. 网络配置
4.1 网络驱动类型
网络驱动对比
网络类型 |
适用场景 |
隔离性 |
性能 |
配置复杂度 |
bridge |
单主机容器通信 |
中等 |
高 |
简单 |
host |
高性能网络需求 |
无 |
最高 |
最简单 |
none |
完全隔离环境 |
最高 |
无网络 |
简单 |
overlay |
跨主机集群 |
高 |
中等 |
复杂 |
macvlan |
物理网络集成 |
高 |
高 |
复杂 |
4.2 网络管理操作
基础网络命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker network ls
docker network inspect bridge docker network inspect my-network
docker network create my-network docker network create --driver bridge my-bridge docker network create --driver bridge --subnet=172.20.0.0/16 my-subnet
docker network rm my-network
docker network prune docker network prune -f
|
容器网络连接
1 2 3 4 5 6 7 8
| docker run -d --name web --network mynetwork nginx
docker network connect mynetwork existing-container
docker network disconnect mynetwork existing-container
|
4.2 Redis主从集群实战
创建Redis网络
1 2
| docker network create redis-network
|

启动Redis主节点
1 2 3 4 5
| docker run -d \ --name redis-master \ --network redis-network \ -p 6379:6379 \ redis:7-alpine redis-server --appendonly yes
|
启动Redis从节点
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run -d \ --name redis-slave1 \ --network redis-network \ -p 6380:6379 \ redis:7-alpine redis-server --slaveof redis-master 6379 --appendonly yes
docker run -d \ --name redis-slave2 \ --network redis-network \ -p 6381:6379 \ redis:7-alpine redis-server --slaveof redis-master 6379 --appendonly yes
|
测试主从同步
1 2 3 4 5 6 7 8 9
| docker exec -it redis-master redis-cli 127.0.0.1:6379> set name "Docker" 127.0.0.1:6379> exit
docker exec -it redis-slave1 redis-cli 127.0.0.1:6379> get name "Docker"
|
4.3 实践关注点:网络、存储、环境变量

5. Docker-Compose
5.1 Compose核心概念
Docker Compose简介
Docker Compose 是 Docker 官方的容器编排工具,通过 YAML 文件定义多容器应用的完整架构,实现一键部署和管理。
核心优势
- 声明式配置:通过 YAML 文件描述整个应用架构
- 服务发现:容器间可通过服务名直接通信
- 依赖管理:自动处理服务启动顺序
- 环境隔离:不同项目间完全隔离
- 扩展性:支持服务水平扩展
- 开发友好:本地开发环境快速搭建
架构组件
组件 |
作用 |
示例 |
Service |
应用程序的逻辑组件 |
web服务、数据库服务 |
Project |
相关服务的集合 |
完整的Web应用 |
Network |
服务间通信网络 |
前端网络、后端网络 |
Volume |
数据持久化存储 |
数据库数据、配置文件 |
5.2 WordPress实战案例
项目结构
1 2 3 4 5 6 7 8
| wordpress-project/ ├── docker-compose.yml ├── nginx/ │ └── nginx.conf ├── wordpress/ │ └── themes/ └── mysql/ └── init.sql
|
完整docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| version: '3.8'
services: nginx: image: nginx:1.21-alpine container_name: wordpress-nginx ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - wordpress-data:/var/www/html:ro depends_on: - wordpress networks: - frontend - backend restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3
wordpress: image: wordpress:6.3-php8.2-fpm-alpine container_name: wordpress-app environment: WORDPRESS_DB_HOST: mysql-db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress123 WORDPRESS_DB_NAME: wordpress WORDPRESS_TABLE_PREFIX: wp_ WORDPRESS_DEBUG: 'false' volumes: - wordpress-data:/var/www/html - ./wordpress/themes:/var/www/html/wp-content/themes - ./wordpress/plugins:/var/www/html/wp-content/plugins depends_on: mysql: condition: service_healthy networks: - backend restart: unless-stopped healthcheck: test: ["CMD-SHELL", "php-fpm-healthcheck"] interval: 30s timeout: 10s retries: 3
mysql: image: mysql:8.0 container_name: mysql-db environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress123 MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci volumes: - mysql-data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro networks: - backend restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 start_period: 30s deploy: resources: limits: memory: 1G cpus: '0.5'
redis: image: redis:7-alpine container_name: wordpress-redis command: redis-server --appendonly yes --maxmemory 256mb volumes: - redis-data:/data networks: - backend restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 3
volumes: wordpress-data: driver: local mysql-data: driver: local redis-data: driver: local
networks: frontend: driver: bridge ipam: config: - subnet: 172.20.0.0/16 backend: driver: bridge internal: true
|
部署和管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker compose up -d
docker compose ps
docker compose logs -f wordpress
docker compose up -d --scale wordpress=3
docker compose restart nginx
docker compose stop
docker compose down
docker compose down -v
|
5.3 Docker Compose语法
核心配置项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| version: '3.8'
services: service-name: image: nginx:latest build: ./app container_name: my-nginx ports: - "8080:80" - "443:443" volumes: - ./data:/app/data - named-volume:/app/logs environment: - NODE_ENV=production - API_KEY=secret env_file: - .env depends_on: - database - redis networks: - app-network restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3
volumes: named-volume: driver: local
networks: app-network: driver: bridge
|
常用 Compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| docker compose up -d
docker compose up -d --build
docker compose stop
docker compose down
docker compose ps
docker compose logs [service-name]
docker compose restart [service-name]
docker compose up -d --scale web=3
docker compose exec service-name bash
|
6. Dockerfile镜像构建
6.1 Dockerfile核心概念
Dockerfile简介
Dockerfile 是声明式的镜像构建脚本,通过一系列指令定义镜像的构建过程。每个指令都会创建一个新的镜像层,最终形成完整的应用镜像。
构建原理
1 2 3 4 5 6 7 8 9 10 11
| ┌─────────────────────────────────────────┐ │ Dockerfile 构建流程 │ ├─────────────────────────────────────────┤ │ FROM base-image │ ← 基础镜像层 ├─────────────────────────────────────────┤ │ RUN install dependencies │ ← 依赖安装层 ├─────────────────────────────────────────┤ │ COPY application code │ ← 应用代码层 ├─────────────────────────────────────────┤ │ CMD start application │ ← 启动命令层 └─────────────────────────────────────────┘
|
6.2 Dockerfile指令详解
核心指令对比
指令 |
作用 |
执行时机 |
缓存特性 |
最佳实践 |
FROM |
指定基础镜像 |
构建时 |
强缓存 |
选择官方、轻量镜像 |
RUN |
执行Shell命令 |
构建时 |
层缓存 |
合并命令减少层数 |
COPY |
复制文件到镜像 |
构建时 |
内容缓存 |
优先复制依赖文件 |
ADD |
复制+解压+下载 |
构建时 |
内容缓存 |
仅在需要特殊功能时使用 |
WORKDIR |
设置工作目录 |
构建时 |
强缓存 |
使用绝对路径 |
EXPOSE |
声明端口 |
文档化 |
无影响 |
明确声明所有端口 |
ENV |
设置环境变量 |
构建+运行时 |
强缓存 |
合理使用,避免敏感信息 |
CMD |
默认启动命令 |
运行时 |
无影响 |
使用exec格式 |
ENTRYPOINT |
入口点命令 |
运行时 |
无影响 |
与CMD配合使用 |
指令使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| FROM node:18-alpine AS base
ENV NODE_ENV=production \ APP_PORT=3000 \ APP_USER=appuser
WORKDIR /app
RUN apk add --no-cache \ curl \ ca-certificates \ && rm -rf /var/cache/apk/*
RUN addgroup -g 1001 -S $APP_USER \ && adduser -S $APP_USER -u 1001 -G $APP_USER
COPY package*.json ./ RUN npm ci --only=production && npm cache clean --force
COPY --chown=$APP_USER:$APP_USER . .
USER $APP_USER
EXPOSE $APP_PORT
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:$APP_PORT/health || exit 1
CMD ["npm", "start"]
|
6.3 多阶段构建实战
Node.js应用优化构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine AS production
RUN apk add --no-cache \ dumb-init \ curl \ && rm -rf /var/cache/apk/*
RUN addgroup -g 1001 -S nodejs \ && adduser -S nextjs -u 1001 -G nodejs
WORKDIR /app
COPY package*.json ./ RUN npm ci --only=production && npm cache clean --force
COPY --from=builder --chown=nextjs:nodejs /app/dist ./dist COPY --from=builder --chown=nextjs:nodejs /app/public ./public
USER nextjs
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/api/health || exit 1
ENTRYPOINT ["dumb-init", "--"] CMD ["npm", "start"]
|
Python 应用多阶段构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
FROM python:3.11-slim AS builder
RUN apt-get update && apt-get install -y \ build-essential \ gcc \ && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.11-slim AS production
RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/*
RUN groupadd -r appuser && useradd -r -g appuser appuser
WORKDIR /app
COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH"
COPY --chown=appuser:appuser . .
USER appuser
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
|
构建和优化命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker build -t myapp:v1.0 .
docker build -f Dockerfile.prod -t myapp:prod .
docker build --build-arg NODE_VERSION=18 -t myapp:v1.0 .
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:v1.0 .
docker build --cache-from myapp:latest -t myapp:v1.1 .
docker history myapp:v1.0
docker images myapp:v1.0
|
7. 实践与优化
7.1 Dockerfile实践
镜像优化策略
优化方向 |
具体措施 |
效果 |
示例 |
镜像大小 |
使用Alpine基础镜像 |
减少90%体积 |
node:18-alpine vs node:18 |
构建缓存 |
优化COPY指令顺序 |
提升构建速度 |
先复制依赖文件,后复制源码 |
安全性 |
非root用户运行 |
降低安全风险 |
USER appuser |
多阶段构建 |
分离构建和运行环境 |
减少最终镜像大小 |
构建阶段 + 运行阶段 |
完整实践
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| FROM node:18-alpine
RUN addgroup -g 1001 -S appgroup \ && adduser -S appuser -u 1001 -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup package*.json ./ RUN npm ci --only=production && npm cache clean --force
COPY --chown=appuser:appgroup . .
USER appuser
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
CMD ["npm", "start"]
|
7.2 生产环境部署指南
环境配置管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| version: '3.8'
services: app: image: myapp:${APP_VERSION:-latest} environment: - NODE_ENV=production - DB_HOST=${DB_HOST} - DB_PASSWORD_FILE=/run/secrets/db_password secrets: - db_password deploy: replicas: 3 resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M cpus: '0.25' restart_policy: condition: on-failure delay: 5s max_attempts: 3 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s
secrets: db_password: external: true
|
监控和日志配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| services: app: logging: driver: "json-file" options: max-size: "10m" max-file: "3" labels: - "prometheus.io/scrape=true" - "prometheus.io/port=3000" - "prometheus.io/path=/metrics"
prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles'
grafana: image: grafana/grafana:latest ports: - "3001:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} volumes: - grafana-data:/var/lib/grafana
volumes: prometheus-data: grafana-data:
|
7.3 故障排查
常见问题及解决方案
问题1:端口被占用
1 2 3 4 5 6 7 8 9 10 11 12
| Error: bind: address already in use
netstat -tulpn | grep :8080
docker run -p 8081:80 nginx
docker stop <container_id>
|
问题2:镜像拉取失败
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Error response from daemon: pull access denied
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://registry.docker-cn.com" ] }
|
问题3:容器无法访问
1 2 3 4 5 6 7 8 9 10 11
| docker ps
docker port <container_name>
docker logs <container_name>
docker exec -it <container_name> bash
|
问题4:磁盘空间不足
1 2 3 4 5 6 7 8 9 10 11
| docker system df
docker system prune
docker image prune -a
docker container prune
|
8. 项目实战
8.1 一键启动所有中间件
完整的开发环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| version: '3.8'
services: mysql: image: mysql:8.0 container_name: dev-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: devdb volumes: - mysql-data:/var/lib/mysql networks: - dev-network
redis: image: redis:7-alpine container_name: dev-redis ports: - "6379:6379" volumes: - redis-data:/data networks: - dev-network
mongodb: image: mongo:6 container_name: dev-mongodb ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin123 volumes: - mongodb-data:/data/db networks: - dev-network
elasticsearch: image: elasticsearch:8.8.0 container_name: dev-elasticsearch ports: - "9200:9200" environment: - discovery.type=single-node - xpack.security.enabled=false volumes: - elasticsearch-data:/usr/share/elasticsearch/data networks: - dev-network
rabbitmq: image: rabbitmq:3-management container_name: dev-rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: admin RABBITMQ_DEFAULT_PASS: admin123 volumes: - rabbitmq-data:/var/lib/rabbitmq networks: - dev-network
nginx: image: nginx:alpine container_name: dev-nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro networks: - dev-network depends_on: - mysql - redis
volumes: mysql-data: redis-data: mongodb-data: elasticsearch-data: rabbitmq-data:
networks: dev-network: driver: bridge
|
8.2 访问测试验证
测试脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #!/bin/bash
echo "启动开发环境..." docker compose up -d
echo "等待服务启动..." sleep 30
echo "测试服务连接..."
echo "测试 MySQL 连接..." docker exec dev-mysql mysql -uroot -proot123 -e "SELECT 'MySQL OK' as status;"
echo "测试 Redis 连接..." docker exec dev-redis redis-cli ping
echo "测试 MongoDB 连接..." docker exec dev-mongodb mongosh --eval "db.runCommand('ping')"
echo "测试 Elasticsearch 连接..." curl -s http://localhost:9200/_cluster/health | jq '.status'
echo "测试 RabbitMQ 管理界面..." curl -s -u admin:admin123 http://localhost:15672/api/overview | jq '.product_name'
echo "所有服务测试完成!" echo "访问地址:" echo " - RabbitMQ 管理界面: http://localhost:15672 (admin/admin123)" echo " - Elasticsearch: http://localhost:9200" echo " - MySQL: localhost:3306 (root/root123)" echo " - Redis: localhost:6379" echo " - MongoDB: localhost:27017 (admin/admin123)"
|
9. 总结
9.1 核心知识点
基础概念
命令操作
高级特性
9.2 学习资源
官方文档
其他资源