在单台Ubuntu服务器上部署Nginx、MySQL、Redis等服务用Docker怎么配置?

在单台 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. 安全建议(生产环境)

  1. 关闭不必要的端口暴露

    # 删除以下行(除非必须从外部访问)
    ports:
      - "3306:3306"
      - "6379:6379"
  2. 使用 .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}
  3. 配置防火墙(UFW)

    sudo ufw allow 22    # SSH
    sudo ufw allow 80    # HTTP
    sudo ufw allow 443   # HTTPS
    # 不要开放 3306 和 6379
    sudo ufw enable
  4. 定期备份数据

    备份 /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 示例吗?