soarli

从零构建现代化服务器:Docker + Compose + Nginx + HTTPS 全栈部署指南
很多刚接触 Linux 服务器的朋友,在部署项目时都会经历三个阶段的痛苦:环境配置地狱:装 MySQL 缺库,装 ...
扫描右侧二维码阅读全文
03
2026/02

从零构建现代化服务器:Docker + Compose + Nginx + HTTPS 全栈部署指南

很多刚接触 Linux 服务器的朋友,在部署项目时都会经历三个阶段的痛苦:

  1. 环境配置地狱:装 MySQL 缺库,装 Python 版本冲突,换台服务器又要重来一遍。
  2. 端口裸奔:用户通过 http://IP:8080 访问,既丑陋又不安全。
  3. 维护困难:服务挂了不知道,日志找不到,想要 HTTPS 却不会配证书。

今天,我们将通过一套“工业级”的标准方案一次性解决所有问题。我们将使用 Docker 容器化应用,用 Docker Compose 编排服务,最后用 Nginx 做反向代理并配置 HTTPS

这是目前中小型互联网企业最主流的部署架构。

📋 教程大纲

  1. 架构总览:我们要做成什么样?
  2. 基础建设:在 Ubuntu 上安装 Docker 全家桶
  3. 容器编排:用 Compose 一键拉起 Web+数据库+缓存
  4. 反向代理:安装 Nginx 接管流量
  5. 安全加固:配置 HTTPS 证书与隐藏后端端口

1. 架构总览:我们要做成什么样?

在开始动手之前,先看懂这张架构图:

  • Docker 容器群:这是“后厨”,负责运行你的代码(Web)、存数据(MySQL)、做缓存(Redis)。它们运行在独立的虚拟网络中。
  • Nginx:这是“前台大堂经理”,运行在宿主机上,监听 80/443 端口。外界的所有请求必须先经过它。
  • 流程:用户访问域名 -> Nginx (处理 HTTPS 加密) -> 转发给 Docker (处理业务) -> 返回结果。

2. 基础建设:在 Ubuntu 上安装 Docker 全家桶

虽然 Ubuntu 源自带 Docker,但版本较老。我们使用官方脚本安装最新版。

2.1 一键安装脚本

复制以下命令在服务器终端执行:

# 1. 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 2. 安装基础工具
sudo apt update
sudo apt install ca-certificates curl gnupg

# 3. 添加官方密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 4. 设置仓库源
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 正式安装
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2.2 关键配置:免 Sudo 运行

把当前用户加入 Docker 用户组,这样运行命令就不需要每次都输 sudo 了。

sudo usermod -aG docker $USER

⚠️ 注意: 执行完这步,请断开 SSH 连接并重新登录,否则不生效。


3. 容器编排:用 Compose 一键拉起全栈环境

我们要部署一套包含 Web 应用 + MySQL + Redis + phpMyAdmin 的完整环境。

3.1 编写 Dockerfile (项目说明书)

在你的项目根目录下,新建 Dockerfile,告诉 Docker 怎么打包你的代码(以 Python 为例):

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]

3.2 编写 docker-compose.yml (指挥官)

这是最核心的一步。在项目根目录新建 docker-compose.yml

version: '3.8'

services:
  # --- 1. Web 应用 ---
  web:
    build: .
    container_name: my_web
    restart: always
    ports:
      # 暂时先监听所有 IP,方便一会测试
      - "8080:8000"
    depends_on:
      - db
      - redis
    environment:
      # 💥 重点:连接数据库 Host 填服务名 'db',不是 localhost
      - DB_HOST=db
      - REDIS_HOST=redis
    volumes:
      - .:/app  # 代码热更新挂载

  # --- 2. MySQL 数据库 ---
  db:
    image: mysql:5.7
    container_name: my_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    volumes:
      # 💥 重点:数据持久化,防止删容器丢数据
      - ./db_data:/var/lib/mysql

  # --- 3. Redis 缓存 ---
  redis:
    image: redis:alpine
    container_name: my_redis
    restart: always

  # --- 4. 数据库管理界面 ---
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: my_admin
    environment:
      PMA_HOST: db
    ports:
      - "8081:80"

3.3 启动服务

docker compose up -d

此时,访问 http://你的IP:8080 应该能看到网站,访问 http://你的IP:8081 能看到数据库管理界面。


4. 反向代理:安装 Nginx 接管流量

现在服务跑通了,但 IP:端口 的访问方式很不专业。我们需要 Nginx 来通过域名访问。

前提:你需要有一个域名,并解析到了你的服务器 IP。

4.1 安装 Nginx

Nginx 安装在宿主机上(不是 Docker 里),这样管理证书更方便。

sudo apt update
sudo apt install nginx

4.2 配置反向代理

新建一个站点配置文件:

sudo nano /etc/nginx/sites-available/myapp

写入以下内容(注意修改 server_name 为你的域名):

server {
    listen 80;
    server_name www.yourdomain.com;  # 修改这里

    location / {
        # 转发给本地 Docker 的 8080 端口
        proxy_pass http://127.0.0.1:8080;

        # 标准头部信息,传递真实 IP 给后端
        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;
    }
}

4.3 启用配置

# 建立软链接
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# 测试配置是否有语法错误
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx

现在,访问 http://www.yourdomain.com 应该能看到你的网站了!


5. 安全加固:配置 HTTPS 与隐藏端口

现在网站是 HTTP 明文传输,不安全。我们用 Certbot 免费开启 HTTPS,并封死 Docker 的侧门。

5.1 一键开启 HTTPS

安装 Certbot:

sudo apt install python3-certbot-nginx

申请证书:

sudo certbot --nginx -d www.yourdomain.com
  • 过程中遇到询问是否重定向 (Redirect),请选择 2 (Redirect),这样用户访问 HTTP 会自动跳到 HTTPS。
  • 刷新浏览器,你会看到地址栏有了安全的小绿锁 🔒。

5.2 隐藏 Docker 端口 (安全闭环)

目前还有一个漏洞:用户依然可以通过 http://IP:8080 绕过 Nginx 直接访问应用。我们需要修改 docker-compose.yml

修改前:

ports:
  - "8080:8000"  # 监听 0.0.0.0 (所有 IP)

修改后:

ports:
  - "127.0.0.1:8080:8000"  # 只监听 127.0.0.1 (仅限本机)

应用修改:

docker compose up -d

🎉 总结

恭喜!你已经完成了一次企业级的服务器部署。让我们回顾一下现在的状态:

  1. 标准化:所有服务跑在 Docker 里,不污染宿主机环境。
  2. 易管理:一个 docker-compose.yml 管理所有服务的启动和停止。
  3. 高安全
  • Nginx 挡在最前面,启用 HTTPS 加密。
  • Docker 端口只对内开放,外部无法直接探测。
  • 数据库数据持久化在本地硬盘,不怕容器删除。

这就是现代 DevOps 的魅力。下次再换服务器,你只需要把代码和 docker-compose.yml 拷过去,一行命令 docker compose up -d,所有服务瞬间复活!🚀

最后修改:2026 年 02 月 03 日 02 : 07 PM

发表评论