目录
第一章:容器化 Nginx 核心优势
1.1 传统部署 vs 容器化部署对比
特性 | 传统部署 | Docker 容器化部署 | 优势提升 |
---|---|---|---|
环境一致性 | 依赖系统环境 | 完全一致的环境 | 100% 一致性保障 |
部署速度 | 5-10分钟 | 秒级启动 | 10-50倍提速 |
资源占用 | 专用资源分配 | 动态资源共享 | 资源利用率提升30-70% |
隔离性 | 进程级别隔离 | 完整命名空间隔离 | 安全性显著提升 |
版本管理 | 复杂,依赖包管理 | 镜像版本精确控制 | 回滚效率提升90% |
横向扩展 | 手动配置复杂 | 一键扩容缩容 | 敏捷性革命性提升 |
1.2 适用场景分析
推荐容器化场景:
- 微服务架构中的API网关
- 云原生应用入口
- 持续交付流水线
- 多环境(Dev/Test/Prod)统一部署
- 弹性伸缩的Web服务
仍需传统部署场景:
- 需要定制内核参数的高性能场景
- 依赖特定硬件加速的场景
- 对网络性能有极致要求的金融交易系统
第二章:基础容器化部署
2.1 最小化Nginx镜像部署
# 拉取官方镜像
docker pull nginx:1.23-alpine
# 运行临时容器
docker run -d --name nginx-temp -p 8080:80 nginx:1.23-alpine
# 复制默认配置到宿主机
docker cp nginx-temp:/etc/nginx/conf.d/default.conf ./nginx.conf
docker cp nginx-temp:/usr/share/nginx/html ./html
# 停止并删除临时容器
docker rm -f nginx-temp
# 正式运行(挂载配置)
docker run -d --name my-nginx \
-p 80:80 \
-p 443:443 \
-v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:1.23-alpine
2.2 目录结构设计
推荐的项目结构:
/nginx-docker/
├── docker-compose.yml # 容器编排定义
├── Dockerfile # 自定义镜像构建
├── config/
│ ├── nginx.conf # 主配置文件
│ └── sites/ # 虚拟主机配置
│ └── app.conf
├── certs/ # SSL证书
│ ├── fullchain.pem
│ └── privkey.pem
├── logs/ # 日志目录(需持久化)
└── webroot/ # 网站根目录
├── index.html
└── static/
第三章:生产级Dockerfile构建
3.1 多阶段构建优化
# 第一阶段:构建环境
FROM nginx:1.23-alpine AS builder
# 安装编译工具
RUN apk add --no-cache \
gcc \
libc-dev \
make \
openssl-dev \
pcre-dev \
zlib-dev \
linux-headers \
curl \
gnupg \
libxslt-dev \
gd-dev
# 下载源码并编译
ARG NGINX_VERSION=1.23.3
RUN cd /tmp && \
curl -O https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
tar xzf nginx-${NGINX_VERSION}.tar.gz && \
cd nginx-${NGINX_VERSION} && \
./configure \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module && \
make && \
make install
# 第二阶段:运行环境
FROM nginx:1.23-alpine
# 从构建阶段复制二进制文件
COPY --from=builder /usr/local/nginx/sbin/nginx /usr/sbin/nginx
# 复制自定义配置
COPY config/ /etc/nginx/
COPY certs/ /etc/nginx/certs/
# 设置权限
RUN chown -R nginx:nginx /etc/nginx && \
chmod -R 755 /etc/nginx && \
rm -rf /etc/nginx/conf.d/default.conf
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/health || exit 1
# 暴露端口
EXPOSE 80 443
# 使用非root用户运行
USER nginx
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
3.2 镜像优化对比
不同构建方式的镜像大小对比:
构建方式 | 镜像大小 | 启动时间 | 安全性 | 可调试性 |
---|---|---|---|---|
官方默认镜像 | 142MB | 0.8s | 中 | 高 |
Alpine基础镜像 | 23MB | 0.6s | 高 | 中 |
多阶段构建(本文) | 28MB | 0.7s | 高 | 高 |
Distroless镜像 | 18MB | 0.9s | 极高 | 低 |
第四章:编排与集群部署
4.1 Docker Compose 全栈配置
version: '3.8'
services:
nginx:
build: .
image: my-nginx:1.23
container_name: nginx-proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./config:/etc/nginx
- ./certs:/etc/nginx/certs
- ./webroot:/usr/share/nginx/html
- ./logs:/var/log/nginx
environment:
- NGINX_ENV=production
- TZ=Asia/Shanghai
networks:
- frontend
- backend
deploy:
resources:
limits:
cpus: '2'
memory: 512M
reservations:
memory: 256M
app:
image: my-app:latest
networks:
- backend
deploy:
replicas: 3
networks:
frontend:
driver: bridge
backend:
driver: bridge
4.2 Kubernetes 部署方案
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector: