一、Docker 基础概念与安装
Docker 是一个开源的容器化平台,它让开发者能够将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何 Linux 机器上。容器与虚拟机不同,它共享宿主机的操作系统内核,启动速度更快、资源占用更少。
1.1 Docker 与虚拟机的区别
| 对比项 | Docker 容器 | 传统虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 硬盘占用 | MB 级 | GB 级 |
| 性能损失 | 几乎无 | 10%-20% |
| 操作系统 | 共享宿主机内核 | 独立完整 OS |
| 容量 | 单机可运行成千 | 单机数十个 |
1.2 Docker 安装
# Ubuntu/Debian 安装 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动 Docker sudo systemctl enable docker sudo systemctl start docker # 将当前用户添加到 docker 组(省略 sudo) sudo usermod -aG docker $USER # 退出重新登录生效 # 验证安装 docker --version docker run hello-world
1.3 Docker 核心概念
镜像(Image):容器的可执行包,包含运行应用所需的一切

容器(Container):镜像的运行时实例
Dockerfile:建镜像的自动化脚本
仓库(Registry):存储和分发镜像的地方
Docker Compose:多容器应用的定义和运行工具
二、Dockerfile 实战指南
Dockerfile 是构建 Docker 镜像的关键文件,掌握 Dockerfile 的编写技巧能大幅优化镜像大小和构建速度。
2.1 Node.js 项目 Dockerfile
# 多阶段构建(Multi-stage Build) # 第一阶段:编译环境 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 第二阶段:运行环境(最终镜像只包含运行时必需的文件) FROM node:20-alpine WORKDIR /app # 从第一阶段拷贝构建产物 COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./ EXPOSE 3000 CMD ["node", "dist/main.js"]
2.2 Python 项目 Dockerfile
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
2.3 前端项目 Dockerfile(Nginx 服务)
# 编译阶段 FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
2.4 Dockerfile 优化技巧
# 1. 合并 RUN 命令减少镜像层 RUN apt update && apt install -y vim && rm -rf /var/lib/apt/lists/* # 2. 利用缓存:先 COPY 依赖文件,后 COPY 源码 COPY package*.json ./ RUN npm ci COPY . . # 3. 使用 .dockerignore 过滤不必要的文件 # .dockerignore 内容: node_modules .git *.md .DS_Store # 4. 选择轻量基础镜像:alpine 版本 FROM node:20-alpine # 仅 120MB # 而非 FROM node:20 # 超过 1GB
三、Docker Compose 多容器编排
Docker Compose 是管理多容器 Docker 应用的工具,通过一个 YAML 文件定义所有服务。
3.1 Web + MySQL + Redis 应用编排
# docker-compose.yml
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
- NODE_ENV=production
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./uploads:/app/uploads
restart: always
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: app_db
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
restart: always
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
ports:
- "6379:6379"
restart: always
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- app
restart: always
volumes:
mysql_data:
redis_data:
uploads:Compose 常用命令
# 启动所有服务 docker compose up -d # 查看日志 docker compose logs -f app # 重建并启动特定服务 docker compose up -d --build app # 暂停服务 docker compose stop # 关闭并删除容器 docker compose down # 关闭并删除数据卷(谨慎) docker compose down -v # 查看运行中的容器 docker compose ps
3.2 环境变量管理
# .env 文件
DB_PASSWORD=mySecurePass123
REDIS_PASSWORD=redisPass456
# docker-compose.yml 中引用
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}四、Docker 网络与数据管理
4.1 网络模式
# 创建自定义网络 docker network create --driver bridge app_network # 将容器连接到网络 docker network connect app_network my-container # 网络类型 bridge → 默认,容器之间可通信 host → 直接使用宿主机网络 none → 无网络
4.2 数据持久化
# 数据卷(Volume)—— Docker 管理 # 推荐方式,性能最佳 docker volume create app_data docker run -v app_data:/app/data myapp # 绑定挂载(Bind Mount)—— 开发环境使用 docker run -v /host/path:/container/path myapp # 使用时对于大文件,可以使用内存盘 docker run --tmpfs /app/cache myapp
五、生产环境容器部署与监控
5.1 容器监控
# 查看容器资源使用 docker stats # 查看容器进程 docker top my-container # 查看容器日志 docker logs --tail 100 -f my-container # 设置容器资源限制 docker run -d --name app \ --memory="512m" \ --cpus="0.5" \ --memory-swap="1g" \ myapp:latest
5.2 日志管理
# 日志驱动配置 docker run -d --name app \ --log-driver json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ myapp:latest # 清理无用的容器和镜像 docker system prune -af --volumes
5.3 容器自动重启策略
# Docker Compose 中的重启策略 services: app: restart: always # 始终重启 restart: unless-stopped # 陮非手动停止 restart: on-failure:5 # 失败时重启,最多5次
六、Kubernetes 容器编排入门
6.1 K8s 核心概念
Pod:K8s 中最小的部署单元,可包含一个或多个容器
Deployment:管理 Pod 的发布与更新
Service:提供稳定的网络访问入口
ConfigMap / Secret:配置管理
Ingress:外部访问路由
6.2 Kubernetes 部署示例
# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 3000 env: - name: NODE_ENV value: "production" resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 30 periodSeconds: 10 --- # service.yaml apiVersion: v1 kind: Service metadata: name: myapp-service spec: selector: app: myapp ports: - port: 80 targetPort: 3000 type: ClusterIP
6.3 常用 kubectl 命令
# 部署应用 kubectl apply -f deployment.yaml # 查看 Pod 状态 kubectl get pods -w # 查看服务 kubectl get svc # 查看日志 kubectl logs -f deployment/myapp # 扩展实例数 kubectl scale deployment myapp --replicas=5 # 滚回更新 kubectl rollout undo deployment/myapp
七、常见问题排查
7.1 容器无法启动
# 查看容器日志 docker logs <container_id> # 进入容器(临时 shell) docker exec -it <container_id> /bin/sh # 查看容器详细信息 docker inspect <container_id>
7.2 容器时区不对
# Dockerfile 中设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 运行时挂载时区文件 docker run -v /etc/localtime:/etc/localtime:ro myapp
7.3 禁止用 root 运行容器
# Dockerfile 中添加非 root 用户 RUN useradd -m -u 1000 appuser USER appuser
总结
Docker 容器化技术已经成为现代软件部署的标配。从最初的容器包装到生产级的 K8s 集群编排,掌握容器化技术能显著提升产品的可移植性和部署效率。
核心关键点:
优化 Dockerfile 写法减小镜像体积
合理使用 Docker Compose 管理多容器应用
生产环境注意资源限制和监控
先掌握 Docker 再进阶 Kubernetes
始终遵循安全最佳实践(非 root 运行、镜像扫描等)
最后修改时间:
2026 年 Git 版本控制完全指南:从团队协作到 CI/CD 集成实战
上一篇
2026年05月13日 15:28
在线智能AI文章伪原创SEO伪原创工具自动适应版单页html源码
随机下篇
2025年09月06日 05:40
相关文章
发表评论
评论列表