很多刚接触 Linux 服务器的朋友,在部署项目时都会经历三个阶段的痛苦:
- 环境配置地狱:装 MySQL 缺库,装 Python 版本冲突,换台服务器又要重来一遍。
- 端口裸奔:用户通过
http://IP:8080访问,既丑陋又不安全。 - 维护困难:服务挂了不知道,日志找不到,想要 HTTPS 却不会配证书。
今天,我们将通过一套“工业级”的标准方案一次性解决所有问题。我们将使用 Docker 容器化应用,用 Docker Compose 编排服务,最后用 Nginx 做反向代理并配置 HTTPS。
这是目前中小型互联网企业最主流的部署架构。
📋 教程大纲
- 架构总览:我们要做成什么样?
- 基础建设:在 Ubuntu 上安装 Docker 全家桶
- 容器编排:用 Compose 一键拉起 Web+数据库+缓存
- 反向代理:安装 Nginx 接管流量
- 安全加固:配置 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
🎉 总结
恭喜!你已经完成了一次企业级的服务器部署。让我们回顾一下现在的状态:
- 标准化:所有服务跑在 Docker 里,不污染宿主机环境。
- 易管理:一个
docker-compose.yml管理所有服务的启动和停止。 - 高安全:
- Nginx 挡在最前面,启用 HTTPS 加密。
- Docker 端口只对内开放,外部无法直接探测。
- 数据库数据持久化在本地硬盘,不怕容器删除。
这就是现代 DevOps 的魅力。下次再换服务器,你只需要把代码和 docker-compose.yml 拷过去,一行命令 docker compose up -d,所有服务瞬间复活!🚀
版权属于:soarli
本文链接:https://blog.soarli.top/archives/791.html
转载时须注明出处及本声明。