MySQL 8.0 Docker 部署

docker run -d --name mysql   -p 3306:3306   -e MYSQL_ROOT_PASSWORD=ChangeMe123!   -v ./mysql-data:/var/lib/mysql   mysql:8.0

PostgreSQL Docker 部署

docker run -d --name postgres   -p 5432:5432   -e POSTGRES_PASSWORD=ChangeMe123!   -e POSTGRES_USER=myapp   -e POSTGRES_DB=myapp   -v ./pg-data:/var/lib/postgresql/data   postgres:16-alpine

安全初始化三件事

1. 禁止远程 root 登录

# MySQL
docker exec -it mysql mysql -u root -p
# 进入后执行:
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;

2. 创建专用用户(最小权限原则)

# MySQL: 只给特定数据库的权限
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myapp.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

# PostgreSQL
docker exec -it postgres psql -U myapp
CREATE USER app_user WITH PASSWORD 'StrongPassword123!';
GRANT CONNECT ON DATABASE myapp TO app_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_user;

3. 防火墙限制

# 如果只需本机访问(比如 Web 应用和数据库在同一台机器)
# Docker 内部网络通信不需要暴露端口
docker run -d --name mysql --network mynet mysql:8.0
# 不映射 -p 3306,外部完全不可访问

# 如果需要外部访问,只允许特定 IP
ufw allow from 1.2.3.4 to any port 3306

选 MySQL 还是 PostgreSQL?

  • MySQL:WordPress、大多数 PHP 项目默认选择。简单、快、资料多
  • PostgreSQL:更严格的标准兼容、JSON 支持更好、GIS 地理数据强。现代 Node.js/Python 项目的首选
  • 对 VPS 的影响:两者在 2GB 内存的 VPS 上都跑得很好

自动备份

# crontab 每天备份
0 4 * * * docker exec mysql mysqldump -u root -p'password' --all-databases | gzip > /backup/mysql-$(date +%Y%m%d).sql.gz