前言
容器化技术已经成为现代应用部署的标准。随着微服务架构的普及和云原生技术的发展,Docker作为容器化的事实标准,已经深入到每个开发者的日常工作中。本文将带你从Docker基础概念开始,逐步构建企业级容器化部署方案,无论你是初学者还是有一定经验的开发者,都能从中获得实用的知识和技巧。
第一章:Docker基础概念与安装
1.1 什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。
核心概念:
- 镜像(Image):只读模板,包含运行应用程序所需的所有内容
- 容器(Container):镜像的运行实例,可以启动、停止、删除
- 仓库(Registry):存储和分发镜像的地方,如Docker Hub
1.2 Docker安装与配置
Ubuntu/Debian系统

# 更新包索引 sudo apt update # 安装必要依赖 sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker Engine sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-world
CentOS/RHEL系统
# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装必要工具 sudo yum install -y yum-utils # 添加Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker Engine sudo yum install docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker
Windows WSL2
# 在PowerShell中以管理员身份运行 wsl --install # 重启计算机后,安装Docker Desktop for Windows # 确保WSL2后端已启用
1.3 用户权限配置
为了避免每次使用Docker命令都需要sudo,将当前用户添加到docker组:
sudo usermod -aG docker $USER # 重新登录或执行以下命令 newgrp docker
第二章:镜像构建最佳实践
2.1 Dockerfile编写规范
基础Dockerfile示例:
# 使用官方Node.js运行时作为基础镜像 FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json(如果存在) COPY package*.json ./ # 安装依赖 RUN npm ci --only=production && npm cache clean --force # 复制应用源代码 COPY . . # 暴露端口 EXPOSE 3000 # 定义环境变量 ENV NODE_ENV=production # 运行应用 CMD ["node", "server.js"]
2.2 多阶段构建(Multi-stage Builds)
多阶段构建可以显著减小最终镜像的大小:
# 构建阶段 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production && npm cache clean --force COPY . . RUN npm run build # 运行阶段 FROM node:18-alpine AS runner WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY package*.json ./ EXPOSE 3000 CMD ["node", "dist/server.js"]
2.3 镜像优化技巧
减少镜像层数:
# 不好的做法 - 多个RUN指令 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y vim # 好的做法 - 合并RUN指令 RUN apt-get update && apt-get install -y curl vim && rm -rf /var/lib/apt/lists/*
使用.dockerignore文件:
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage
.vscode
第三章:Docker Compose编排多容器应用
3.1 Docker Compose基础
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
docker-compose.yml示例:
version: '3.8' services: web: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:password@db:5432/myapp depends_on: - db - redis volumes: - ./logs:/app/logs db: image: postgres:13 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped redis: image: redis:6-alpine command: redis-server --appendonly yes volumes: - redis_data:/data restart: unless-stopped volumes: postgres_data: redis_data:
3.2 环境配置管理
多环境配置:
# docker-compose.prod.yml version: '3.8' services: web: build: context: . dockerfile: Dockerfile.prod ports: - "80:3000" environment: - NODE_ENV=production restart: unless-stopped # docker-compose.dev.yml version: '3.8' services: web: build: context: . dockerfile: Dockerfile.dev ports: - "3000:3000" environment: - NODE_ENV=development volumes: - .:/app - /app/node_modules
使用命令:
# 开发环境 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up # 生产环境 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
第四章:网络配置与数据持久化
4.1 Docker网络模式
四种网络模式:
- bridge(默认):容器间通过虚拟网桥通信
- host:容器直接使用主机网络
- none:容器无网络
- overlay:跨主机容器通信
自定义网络:
# 创建自定义网络 docker network create --driver bridge my-network # 运行容器时指定网络 docker run --network my-network --name web-app nginx
4.2 数据持久化策略
三种数据持久化方式:
- Volumes(推荐)
# 创建命名卷 docker volume create my-vol # 挂载卷到容器 docker run -d --name web-app -v my-vol:/app/data nginx
- Bind Mounts
# 挂载主机目录 docker run -d --name web-app -v /host/path:/container/path nginx
- tmpfs Mounts
# 临时文件系统挂载(仅Linux) docker run -d --name web-app --tmpfs /app/cache nginx
第五章:安全加固与资源限制
5.1 安全最佳实践
使用非root用户:
FROM node:18-alpine RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 USER nextjs
扫描镜像漏洞:
# 使用Docker Scout docker scout quickview your-image:tag # 使用Trivy trivy image your-image:tag
最小化基础镜像:
- 优先使用alpine版本
- 使用distroless镜像
- 定期更新基础镜像
5.2 资源限制
CPU和内存限制:
# docker-compose.yml services: web: image: nginx deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M
单独容器的资源限制:
docker run -d --name web-app --memory=512m --cpus=0.5 nginx
第六章:CI/CD集成方案
6.1 GitHub Actions集成
.github/workflows/docker-build.yml:
name: Build and Push Docker Image
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: your-username/your-app:latest
6.2 GitLab CI/CD集成
.gitlab-ci.yml:
stages: - build - test - deploy build-image: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA deploy-production: stage: deploy script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - docker stop my-app || true - docker rm my-app || true - docker run -d --name my-app -p 80:3000 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA only: - main
第七章:实战案例 – 完整Web应用部署
7.1 应用架构
我们将部署一个完整的Web应用,包含以下组件:
- Nginx:反向代理和静态文件服务
- PHP-FPM:PHP应用服务器
- MySQL:数据库
- Redis:缓存和会话存储
7.2 目录结构
my-web-app/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── php/
│ └── Dockerfile
├── src/
│ └── index.php
└── .env
7.3 配置文件
docker-compose.yml:
version: '3.8' services: nginx: image: nginx:alpine ports: - "80:80" volumes: - ./src:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php restart: unless-stopped php: build: ./php volumes: - ./src:/var/www/html environment: - DB_HOST=mysql - DB_NAME=myapp - DB_USER=user - DB_PASS=password depends_on: - mysql - redis restart: unless-stopped mysql: image: mysql:8.0 environment: MYSQL_DATABASE: myapp MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: rootpassword volumes: - mysql_data:/var/lib/mysql restart: unless-stopped redis: image: redis:6-alpine volumes: - redis_data:/data restart: unless-stopped volumes: mysql_data: redis_data:
nginx/default.conf:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
php/Dockerfile:
FROM php:8.1-fpm-alpine # 安装扩展 RUN docker-php-ext-install mysqli pdo pdo_mysql # 安装Redis扩展 RUN pecl install redis && docker-php-ext-enable redis # 清理 RUN rm -rf /tmp/* /var/tmp/* WORKDIR /var/www/html
src/index.php:
<?php
echo "<h1>欢迎使用Docker容器化部署!</h1>";
// 测试数据库连接
try {
$pdo = new PDO(
"mysql:host=mysql;dbname=myapp",
"user",
"password"
);
echo "<p>✅ 数据库连接成功!</p>";
} catch (PDOException $e) {
echo "<p>❌ 数据库连接失败: " . $e->getMessage() . "</p>";
}
// 测试Redis连接
try {
$redis = new Redis();
$redis->connect('redis', 6379);
$redis->set('test', 'Hello Redis!');
echo "<p>✅ Redis连接成功!</p>";
echo "<p>Redis测试值: " . $redis->get('test') . "</p>";
} catch (Exception $e) {
echo "<p>❌ Redis连接失败: " . $e->getMessage() . "</p>";
}
?>
7.4 部署步骤
# 1. 克隆项目 git clone your-repo-url cd my-web-app # 2. 构建并启动服务 docker-compose up -d # 3. 验证服务状态 docker-compose ps # 4. 查看日志 docker-compose logs -f # 5. 访问应用 # 打开浏览器访问 http://localhost
第八章:监控与维护
8.1 日志管理
查看容器日志:
# 查看特定服务日志 docker-compose logs web # 实时跟踪日志 docker-compose logs -f web # 查看最近100行日志 docker-compose logs --tail=100 web
8.2 性能监控
使用cAdvisor监控容器性能:
# docker-compose.monitoring.yml version: '3.8' services: cadvisor: image: gcr.io/cadvisor/cadvisor:v0.47.0 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro ports: - "8080:8080" privileged: true devices: - /dev/kmsg
8.3 定期维护任务
清理未使用的资源:
# 清理停止的容器 docker container prune # 清理未使用的镜像 docker image prune -a # 清理未使用的卷 docker volume prune # 清理未使用的网络 docker network prune # 一键清理所有未使用资源 docker system prune -a
结语
Docker容器化部署不仅简化了应用的部署流程,还提高了环境的一致性和可移植性。通过本文的学习,你应该已经掌握了从基础概念到企业级应用部署的完整知识体系。
记住,容器化不是终点,而是现代化应用开发和运维的新起点。随着Kubernetes、Service Mesh等技术的发展,容器化生态还在不断演进。保持学习,持续优化你的容器化实践!
附录:常用Docker命令速查
| 命令 | 说明 |
| docker ps | 列出运行中的容器 |
| docker ps -a | 列出所有容器 |
| docker images | 列出本地镜像 |
| docker build -t name:tag . | 构建镜像 |
| docker run -d –name container-name image | 运行容器 |
| docker exec -it container-name bash | 进入容器 |
| docker logs container-name | 查看容器日志 |
| docker-compose up -d | 启动所有服务 |
| docker-compose down | 停止并删除所有服务 |
| docker system df | 查看Docker磁盘使用情况 |
