专业全栈开发服务 | 前端 + 后端 + 移动端 + 小程序等 | 高质量项目定制开发

Weber 博客

分享知识,记录思考

Docker 进阶篇

2025年8月12日
Docker
阅读9分钟

在开发一个项目时,我们的服务不单单只是一个Next项目 ,可能还会有 数据库、nginx等等,所以这些服务都要一个个去管理容器的话,着实有点麻烦,所以Docker  提供了 Docker Compose 用于容器的管理,你只需要通过一个单独的 docker-compose.yml 文件就可以定义一组相关联的应用容器。

Docker Compose 介绍

Docker Compose 是一个用于定义和运行多容器应用程序的工具。它是解锁精简高效的开发和部署体验的关键。

Compose 适用于所有环境 - 生产、预发布、开发、测试以及 CI 工作流。它还具有用于管理应用程序整个生命周期的命令:

  • 启动、停止和重建服务
  • 查看正在运行的服务的状态
  • 流式输出正在运行的服务的日志
  • 在服务上运行一次性命令

Compose 文件

Compose 文件的默认路径是compose.yaml(首选) 或 ,compose.yml位于工作目录中。为了向后兼容早期版本, Compose 还支持docker-compose.yaml和。如果两个文件都存在,Compose 会优先使用规范的。docker-compose.yml/compose.yaml 。

命令行界面

Docker CLI 允许您通过docker compose命令及其子命令与 Docker Compose 应用程序交互。如果您使用的是 Docker Desktop,则默认包含 Docker Compose CLI。

如果启动 compose.yaml 服务,我们可能以下命令:

## 启动所有服务
docker compose up
## 删除下在运行的服务
docker compose down 
## 查看日志
docker compose logs
## 列出所有服务状态
docker compose ps

有关所有 Compose CLI 命令的完整列表,请参阅 参考文档

在现代 Web 开发中,容器化技术已成为标准实践。Docker Compose 作为 Docker 官方的开源工具,能够帮助我们轻松定义和运行多容器的 Docker 应用程序。本文将通过一个具体的 Next.js 博客项目,一步步向您展示如何利用 Docker Compose 和 Nginx,实现一个生产级别的、支持 HTTPS 的 Web 应用部署方案。

项目结构概览

在开始之前,让我们先看一下项目的核心文件结构:

/
├── docker-compose.yml
├── Dockerfile
├── nginx/
│   ├── nginx.conf
│   └── ssl/
│       ├── your_domain.pem  # SSL 证书
│       └── your_domain.key  # SSL 私钥
└── src/
    └── ... (Next.js 项目代码)

- docker-compose.yml : 整个部署的核心,定义了我们的应用服务。
- Dockerfile : 用于构建 Next.js 应用的镜像。
- nginx/ : 存放 Nginx 相关配置和文件的目录

核心组件解析

1. docker-compose.yml :服务的编排大师

这个文件是整个部署流程的“总指挥”,它清晰地定义了两个核心服务: web (我们的 Next.js 应用) 和 nginx (反向代理服务器)。

# Docker Compose 配置文件
services:
  # Next.js 应用服务
  web:
    build: .
    container_name: blog
    expose:
      - "3000"
    restart: always
    networks:
      - app-network

  # Nginx 反向代理服务
  nginx:
    image: nginx:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - web
    restart: always
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

web 服务 (Next.js 应用):

  • build: . : 指示 Docker Compose 使用项目根目录下的 Dockerfile 来构建镜像。
  • expose: ["3000"] : 这是个关键的安全实践。它只在 Docker 内部网络中暴露 3000 端口,而不映射到宿主机,意味着外部无法直接访问 Next.js 应用。所有流量都必须经过 Nginx 代理。
  • restart: always : 确保容器在意外退出后能自动重启,保证了服务的高可用性。
  • networks: [app-network] : 将服务连接到我们自定义的 app-network 网络中。


nginx 服务 (反向代理):

  • image: nginx:alpine : 使用官方的轻量级 Nginx 镜像,减小部署体积。
  • ports: ["80:80", "443:443"] : 将宿主机的 80 (HTTP) 和 443 (HTTPS) 端口映射到容器,使我们的网站能被外界访问。
  • volumes : 这是实现配置和证书持久化的核心。
  •   - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf : 将我们本地的 Nginx 配置文件挂载到容器内,覆盖默认配置。
      - ./nginx/ssl:/etc/nginx/ssl : 将存放 SSL 证书的目录挂载到容器内,以便 Nginx 使用。
  • depends_on: [web] : 确保 web 服务在 nginx 启动之前就已经准备就绪,避免了 Nginx 启动时找不到上游服务的错误。


networks :

  • - app-network : 我们创建了一个自定义的 bridge 网络。这允许 nginx 和 web 容器通过服务名(即 http://web:3000 )进行通信,而不是依赖于不稳定的容器 IP 地址。

2. nginx.conf :安全与性能的守护者

Nginx 配置文件是实现反向代理、负载均衡、SSL 加密和性能优化的关键。

# HTTP 服务器配置 - 重定向到 HTTPS
server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS 服务器配置
server {
    listen 443 ssl http2;
    server_name your_domain.com www.your_domain.com;

    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl/your_domain.pem;
    ssl_certificate_key /etc/nginx/ssl/your_domain.key;

    # ... 其他 SSL 和安全头配置 ...

    # 反向代理配置 - 将请求转发到 Next.js 应用
    location / {
        proxy_pass http://web:3000; # 转发到 web 服务的 3000 端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 静态资源缓存配置
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        proxy_pass http://web:3000;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # API 路由配置
    location /api/ {
        proxy_pass http://web:3000;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

 

  1. 强制 HTTPS : 监听 80 端口,并将所有 HTTP 请求通过 301 永久重定向到 HTTPS,确保通信安全。
  2. SSL/TLS 加密 : 在 443 端口上启用 SSL,并加载我们之前挂载的证书文件。
  3. 核心反向代理 : location / 块是关键。 proxy_pass http://web:3000; 这一行代码将所有传入的请求都转发给了 web 容器的 3000 端口。 web 这个主机名能够被正确解析,正是得益于 Docker Compose 的自定义网络。
  4. 静态资源优化 : 对图片、JS、CSS 等静态文件设置了长达一年的浏览器缓存 ( expires 1y ),并标记为 immutable ,极大提升了网站的加载性能和用户体验。
  5. API 代理优化 : 针对 /api/ 路径的请求,关闭了代理缓冲 ( proxy_buffering off ),这对于需要快速响应的 API 接口至关重要。

总结

通过 docker-compose.yml 和 nginx.conf 的精妙配合,我们构建了一个健壮、安全且高性能的 Next.js 应用部署方案。Docker Compose 极大地简化了多容器应用的生命周期管理,让开发者可以从复杂的部署配置中解放出来,更专注于业务逻辑的实现。希望这篇指南能帮助您在自己的项目中轻松应用容器化部署!

订阅博客更新

喜欢这篇文章吗?订阅我们的博客,第一时间获取最新文章和技术分享

我们承诺不会发送垃圾邮件,您可以随时取消订阅

文章评论

发表评论

全部评论 (0)

加载评论中...