在单台 Ubuntu 服务器上使用 Docker 部署 Nginx、MySQL 和 Redis 是一种常见且高效的做法。通过 Docker Compose 可以轻松管理多个服务的配置和依赖关系。
下面是一个完整的部署方案,包含:
- 使用
docker-compose.yml文件统一管理服务 - 持久化数据(MySQL、Redis 数据卷)
- 环境变量配置
- Nginx 作为反向X_X或静态资源服务器
✅ 1. 安装 Docker 和 Docker Compose
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要的依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加 Docker 仓库
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 将当前用户加入 docker 组(避免每次用 sudo)
sudo usermod -aG docker $USER
# 重启终端或运行:
newgrp docker
✅ 2. 创建项目目录结构
mkdir ~/myapp && cd ~/myapp
mkdir nginx mysql redis data
目录结构如下:
~/myapp/
├── docker-compose.yml
├── nginx/
│ ├── nginx.conf
│ └── sites-enabled/
│ └── default.conf
├── mysql/
│ └── my.cnf (可选)
├── redis/
│ └── redis.conf (可选)
└── data/
├── mysql/ # MySQL 持久化数据
└── redis/ # Redis 持久化数据
✅ 3. 配置 Nginx
nginx/sites-enabled/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
# 示例:反向X_X到后端应用(如 Node.js、Python)
# location /api/ {
# proxy_pass http://app:3000/;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# }
}
nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/sites-enabled/*;
}
✅ 4. 编写 docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: nginx-server
ports:
- "80:80"
- "443:443" # 如需 HTTPS
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/sites-enabled:/etc/nginx/sites-enabled:ro
- ./data/static:/usr/share/nginx/html:ro
depends_on:
- app # 如果有后端应用
restart: unless-stopped
mysql:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: myapp_db
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- ./data/mysql:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro # 可选配置
restart: unless-stopped
redis:
image: redis:alpine
container_name: redis-cache
command: redis-server --appendonly yes # 启用 AOF 持久化
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro # 可选
restart: unless-stopped
# 示例:添加一个简单的 Web 应用(可选)
# app:
# image: nginx:alpine
# volumes:
# - ./data/app:/usr/share/nginx/html
# expose:
# - 80
volumes:
mysql_data:
redis_data:
⚠️ 注意:
- 实际生产中不建议暴露 MySQL 和 Redis 到公网(即不要映射 3306/6379 到网络),应通过内部网络连接。
- 可删除
ports中数据库相关行,仅允许容器间通信。
✅ 5. 启动服务
cd ~/myapp
docker compose up -d
查看状态:
docker compose ps
日志查看:
docker compose logs nginx
docker compose logs mysql
✅ 6. 测试服务
- Nginx: 浏览器访问
http://<your-server-ip>,应看到默认页或你放置的 HTML。 - MySQL: 用客户端连接
your-server-ip:3306,用户名myuser,密码mypassword。 - Redis: 使用
redis-cli -h <ip> -p 6379连接测试。
✅ 7. 安全建议(生产环境)
-
关闭不必要的端口暴露
# 删除以下行(除非必须从外部访问) ports: - "3306:3306" - "6379:6379" -
使用
.env文件管理敏感信息创建
.env文件:MYSQL_ROOT_PASSWORD=strong_root_password MYSQL_USER=myuser MYSQL_PASSWORD=strong_password修改
docker-compose.yml:environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: myapp_db MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} -
配置防火墙(UFW)
sudo ufw allow 22 # SSH sudo ufw allow 80 # HTTP sudo ufw allow 443 # HTTPS # 不要开放 3306 和 6379 sudo ufw enable -
定期备份数据
备份
/home/youruser/myapp/data/mysql目录。
✅ 总结
你现在已经成功使用 Docker 在 Ubuntu 上部署了:
- Nginx:Web 服务器 / 反向X_X
- MySQL:关系型数据库
- Redis:缓存 / 键值存储
所有服务通过 docker-compose 统一管理,数据持久化,易于维护和迁移。
如需扩展(例如部署 Flask/Django/Node.js 应用),只需在 docker-compose.yml 中添加对应服务,并让 Nginx 反向X_X即可。
需要我帮你加上一个 Python Flask 示例吗?
PHPWP博客