【Docker系列九】使用 Docker Compose 部署 Nginx
【摘要】 在现代应用部署中,容器编排工具已成为不可或缺的一部分。Docker Compose 作为 Docker 官方的单机编排工具,通过声明式的 YAML 文件简化了多容器应用的管理。 一、Docker Compose 核心优势 1.1 与传统 Docker run 的对比Docker Compose 相比直接使用docker run命令具有显著优势:声明式配置:所有服务参数集中定义在 docker...
在现代应用部署中,容器编排工具已成为不可或缺的一部分。Docker Compose 作为 Docker 官方的单机编排工具,通过声明式的 YAML 文件简化了多容器应用的管理。
一、Docker Compose 核心优势
1.1 与传统 Docker run 的对比
Docker Compose 相比直接使用docker run
命令具有显著优势:
- 声明式配置:所有服务参数集中定义在 docker-compose.yml 文件中
- 依赖管理:自动处理服务启动顺序和网络连接
- 环境隔离:支持为不同环境(开发/测试/生产)定义独立配置
- 一键操作:简化多容器应用的启动、停止和重建流程
1.2 典型应用场景
- 开发环境快速搭建
- 微服务架构本地测试
- CI/CD 流水线中的集成测试
- 中小规模生产部署
二、环境准备与安装
2.1 Docker Compose 安装
在 Linux 系统上安装最新版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
docker-compose --version
# 输出应类似:Docker Compose version v2.20.3
2.2 项目目录结构
推荐的标准目录布局:
nginx-project/
├── docker-compose.yml
├── config/
│ ├── nginx.conf
│ └── conf.d/
│ └── app.conf
├── html/
│ └── index.html
└── logs/
├── access.log
└── error.log
三、基础部署实战
3.1 最小化 docker-compose.yml
version: "3.8"
services:
web:
image: nginx:1.23-alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
启动服务:
docker-compose up -d
3.2 完整功能配置示例
version: "3.8"
services:
nginx:
image: nginx:1.23-alpine
container_name: production_nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
- ./config/conf.d:/etc/nginx/conf.d
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
- ./certs:/etc/ssl/certs
environment:
- TZ=Asia/Shanghai
- NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx/conf.d
networks:
- frontend
deploy:
resources:
limits:
cpus: "1.5"
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 3s
retries: 3
networks:
frontend:
driver: bridge
attachable: true
四、高级配置技巧
4.1 多环境配置管理
使用 extends 和多个 compose 文件实现环境差异化:
base-compose.yml:
services:
nginx:
image: nginx:${NGINX_VERSION:-1.23-alpine}
volumes:
- ${CONFIG_PATH:-./config}:/etc/nginx
docker-compose.prod.yml:
version: "3.8"
services:
nginx:
extends:
file: base-compose.yml
service: nginx
environment:
- NGINX_ENV=production
deploy:
replicas: 3
启动生产环境:
docker-compose -f base-compose.yml -f docker-compose.prod.yml up -d
4.2 负载均衡配置
部署 Nginx+PHP-FPM 集群示例:
services:
nginx:
image: nginx:1.23-alpine
depends_on:
- php
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
php:
image: php:8.2-fpm
deploy:
replicas: 3
volumes:
- ./php:/var/www/html
redis:
image: redis:7-alpine
4.3 动态配置生成
结合 envsubst 实现模板化配置:
services:
nginx:
environment:
- BACKEND_SERVER=app:8080
volumes:
- ./templates/upstream.conf.template:/etc/nginx/templates/upstream.conf.template
模板文件示例:
upstream backend {
server ${BACKEND_SERVER};
}
五、安全加固方案
5.1 非 root 用户运行
services:
nginx:
user: "1000:1000"
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
5.2 网络安全隔离
networks:
frontend:
internal: false
backend:
internal: true
services:
nginx:
networks:
- frontend
- backend
database:
networks:
- backend
5.3 镜像签名验证
services:
nginx:
image: nginx@sha256:abc123...
platform: linux/amd64
六、生产环境最佳实践
6.1 日志管理方案
services:
nginx:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
compress: "true"
6.2 监控集成
Prometheus 监控配置示例:
services:
nginx:
labels:
- "prometheus.scrape=true"
- "prometheus.port=9113"
volumes:
- ./nginx-prometheus.conf:/etc/nginx/conf.d/prometheus.conf
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
6.3 蓝绿部署实现
services:
nginx:
deploy:
update_config:
parallelism: 2
delay: 10s
order: start-first
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost/health || exit 1"]
七、故障排查与维护
7.1 常用诊断命令
查看服务状态:
docker-compose ps
docker-compose top
实时日志监控:
docker-compose logs -f --tail=100
进入容器调试:
docker-compose exec nginx sh
7.2 配置验证流程
# 检查语法
docker-compose config
# 试运行
docker-compose up --dry-run
# 重建服务
docker-compose up -d --force-recreate
7.3 版本升级策略
- 备份现有配置和数据
- 修改 compose 文件中的镜像版本
- 分阶段滚动更新:
docker-compose pull
docker-compose up -d --no-deps nginx
八、性能优化建议
8.1 资源限制配置
services:
nginx:
deploy:
resources:
limits:
cpus: "2"
memory: 1G
reservations:
memory: 512M
8.2 静态资源缓存
优化后的 Nginx 配置:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public";
access_log off;
}
8.3 连接参数调优
environment:
- NGINX_WORKER_PROCESSES=auto
- NGINX_WORKER_CONNECTIONS=4096
- NGINX_KEEPALIVE_TIMEOUT=65
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)