Skip to content

Docker 安装数据库

本章将介绍如何使用 Docker 快速部署 MySQL、PostgreSQL、MongoDB 和 Redis 数据库。

MySQL

快速启动

bash
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  mysql:8.0

完整配置

bash
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=mypassword \
  -v mysql-data:/var/lib/mysql \
  -v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:8.0

环境变量

变量说明
MYSQL_ROOT_PASSWORDroot 密码(必填)
MYSQL_DATABASE初始化数据库名
MYSQL_USER创建普通用户
MYSQL_PASSWORD普通用户密码
MYSQL_ALLOW_EMPTY_PASSWORD允许空密码

连接数据库

bash
# 使用 Docker exec 连接
docker exec -it mysql mysql -uroot -p

# 从宿主机连接
mysql -h 127.0.0.1 -P 3306 -uroot -p

# 导入 SQL 文件
docker exec -i mysql mysql -uroot -pmy-secret-pw mydb < dump.sql

# 导出数据库
docker exec mysql mysqldump -uroot -pmy-secret-pw mydb > backup.sql

PostgreSQL

快速启动

bash
docker run -d \
  --name postgres \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=my-secret-pw \
  postgres:16

完整配置

bash
docker run -d \
  --name postgres \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=my-secret-pw \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydb \
  -v postgres-data:/var/lib/postgresql/data \
  postgres:16

环境变量

变量说明
POSTGRES_PASSWORD超级用户密码(必填)
POSTGRES_USER超级用户名(默认 postgres)
POSTGRES_DB初始化数据库名

连接数据库

bash
# 使用 Docker exec 连接
docker exec -it postgres psql -U myuser -d mydb

# 从宿主机连接
psql -h 127.0.0.1 -p 5432 -U myuser -d mydb

# 导入 SQL 文件
docker exec -i postgres psql -U myuser -d mydb < dump.sql

# 导出数据库
docker exec postgres pg_dump -U myuser mydb > backup.sql

MongoDB

快速启动

bash
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  mongo:7

带认证启动

bash
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=my-secret-pw \
  -e MONGO_INITDB_DATABASE=mydb \
  -v mongo-data:/data/db \
  mongo:7

环境变量

变量说明
MONGO_INITDB_ROOT_USERNAME管理员用户名
MONGO_INITDB_ROOT_PASSWORD管理员密码
MONGO_INITDB_DATABASE初始化数据库名

连接数据库

bash
# 使用 Docker exec 连接
docker exec -it mongodb mongosh

# 带认证连接
docker exec -it mongodb mongosh -u admin -p my-secret-pw

# 从宿主机连接
mongosh "mongodb://admin:my-secret-pw@127.0.0.1:27017"

# 导出数据库
docker exec mongodb mongodump --out /dump
docker cp mongodb:/dump ./backup

# 导入数据库
docker cp ./backup mongodb:/dump
docker exec mongodb mongorestore /dump

Redis

快速启动

bash
docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:7

带密码和持久化

bash
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7 redis-server --requirepass my-secret-pw --appendonly yes

使用自定义配置文件

bash
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v redis-data:/data \
  -v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \
  redis:7 redis-server /usr/local/etc/redis/redis.conf

连接 Redis

bash
# 使用 Docker exec 连接
docker exec -it redis redis-cli

# 带密码连接
docker exec -it redis redis-cli -a my-secret-pw

# 从宿主机连接
redis-cli -h 127.0.0.1 -p 6379 -a my-secret-pw

# 测试连接
docker exec -it redis redis-cli ping
# 输出: PONG

Docker Compose 多数据库部署

yaml
# docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-data:/var/lib/mysql

  postgres:
    image: postgres:16
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - postgres-data:/var/lib/postgresql/data

  mongodb:
    image: mongo:7
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: secret
    volumes:
      - mongo-data:/data/db

  redis:
    image: redis:7
    ports:
      - "6379:6379"
    command: redis-server --requirepass secret --appendonly yes
    volumes:
      - redis-data:/data

volumes:
  mysql-data:
  postgres-data:
  mongo-data:
  redis-data:
bash
# 启动所有数据库
docker compose up -d

# 查看状态
docker compose ps

# 停止所有数据库
docker compose down

# 停止并删除数据
docker compose down -v

数据备份与恢复

通用备份策略

bash
# 使用数据卷备份
docker run --rm \
  -v mysql-data:/source \
  -v $(pwd)/backup:/backup \
  alpine tar czf /backup/mysql-backup.tar.gz -C /source .

# 恢复数据卷
docker run --rm \
  -v mysql-data:/target \
  -v $(pwd)/backup:/backup \
  alpine tar xzf /backup/mysql-backup.tar.gz -C /target

本章小结

Docker 让数据库的部署和管理变得非常简单。通过数据卷持久化数据,使用环境变量配置参数,可以在几秒钟内启动一个完整的数据库服务。

关键要点:

  • 始终使用数据卷持久化数据库数据
  • 通过环境变量设置密码和初始配置
  • 定期备份数据卷中的数据
  • 生产环境注意安全配置

延伸阅读