一、主要步骤
使用Docker来下载并启动MySQL,主要步骤包括:拉取MySQL镜像、运行容器、以及一些常见的配置(如设置密码、映射端口、挂载数据卷等)。
- 拉取MySQL官方镜像
- 创建本地数据存储目录和自定义配置文件目录(用于持久化和配置)
- 创建自定义配置文件(可选,但建议)
- 运行容器,并设置环境变量、端口映射、数据卷等
- 验证连接
1. 拉取mysql镜像
首先,我们需要从镜像仓库中拉取MySQL镜像。可以选择特定版本(如8.0, 5.7等)或使用默认的最新版本。
-
如果不指定版本,默认拉取最新版。
bashdocker pull mysql -
拉取指定版本,例如拉取MySQL 8.0。
bashdocker pull mysql:8.0
2. 创建目录
我们将在主机上创建三个目录:主要用于存储MySQL数据、自定义配置以及日志文件。
bash
# 存储MySQL数据
mkdir -p /usr/local/src/mysql/data
# 存储MySQL自定义配置文件
mkdir -p /usr/local/src/mysql/conf
# 存储日志文件
mkdir -p /usr/local/src/mysql/logs
3. 创建自定义配置文件(可选)
在 /usr/local/src/mysql/conf 目录下创建一个名为 my.cnf 的文件,用于设置MySQL的配置。
bash
cat > /usr/local/src/mysql/conf/my.cnf << 'EOF'
[mysqld]
# 基础设置
user = mysql
port = 3306
socket = /var/run/mysqld/mysqld.sock
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 存储引擎
default-storage-engine = InnoDB
# 连接设置
max_connections = 1000
max_connect_errors = 100000
wait_timeout = 28800
interactive_timeout = 28800
# 缓冲区设置
key_buffer_size = 256M
max_allowed_packet = 64M
thread_stack = 512K
thread_cache_size = 128
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
join_buffer_size = 4M
# InnoDB 设置
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 二进制日志(主从复制用)
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 7
max_binlog_size = 100M
binlog_format = row
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
EOF
4. 运行容器
使用docker run命令来启动一个MySQL容器。以下是一些常用参数:
-p:端口映射,后面紧接着的3306:3306是要进行映射的端口,冒号左边的3306是宿主机的端口号,冒号右边的3306是mysql容器的端口,-p的作用是将mysql容器的3306端口映射到宿主机的3306端口,这样就可以通过宿主机的ip+映射到宿主机的3306端口就能连接上启动的mysql容器。-e:后面紧接着的MYSQL_ROOT_PASSWORD=root,是指定mysql容器的root用户登陆密码。-d:表示以守护进程的方式启动服务,服务在后台运行。--name:指定启动后的容器名。-v:持久化数据,将容器的数据交给宿主机管理,主要也是为了同步数据,防止容器被删除后数据找不到的问题。/root/data 这是宿主机的数据存放路径;/var/lib/mysql 这是mysql容器存放数据的地方。--restart=unless-stopped:容器退出时自动重启,除非用户明确执行了 docker stop 命令。
-
示例1:基本运行
bashdocker run -d --name mysql-server -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 mysql:8.0 -
示例2:使用数据卷持久化数据
- 为了持久化MySQL数据(即使容器删除,数据也不会丢失),我们可以将MySQL的数据目录挂载到主机上。
- /host/path/to/mysql/data是主机上的一个目录,用于存储MySQL的数据。
bashdocker run -d --name mysql-server \ -e MYSQL_ROOT_PASSWORD=root123 \ -p 3306:3306 \ -v /usr/local/src/mysql/data:/var/lib/mysql \ mysql:8.0 -
示例3:使用自定义配置文件
- 如果需要自定义MySQL配置,可以将自定义的my.cnf文件挂载到容器中。
- 首先,确保主机上有一个自定义的配置文件,例如/host/path/to/my.cnf。然后运行:
bashdocker run -d --name mysql-server \ -e MYSQL_ROOT_PASSWORD=root123 \ -p 3306:3306 \ -v /usr/local/src/mysql/data:/var/lib/mysql \ -v /usr/local/src/mysql/conf/my.cnf:/etc/mysql/my.cnf \ mysql:8.0 -
完整配置示例:
bashdocker run -d \ --name mysql-server \ -e MYSQL_ROOT_PASSWORD=root123 \ -p 3306:3306 \ -v /usr/local/src/mysql/data:/var/lib/mysql \ -v /usr/local/src/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /usr/local/src/mysql/logs:/var/log/mysql \ --restart=unless-stopped \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci
3. 连接MySQL
容器启动后,你可以使用任何MySQL客户端连接它。
-
从容器内部连接:
bash# 进入容器 docker exec -it mysql-server bash # 连接MySQL mysql -u root -p -
从外部连接:
bash# 使用MySQL客户端 mysql -h 127.0.0.1 -P 3306 -u root -p然后输入密码,即可连接到MySQL。
-
使用Navicat连接通过宿主机的ip+运行命令时映射的端口联连接数据库了:

4.常用管理命令
bash
# 查看运行中的容器
docker ps
# 查看MySQL日志
docker logs mysql-server
# 查看实时日志
docker logs -f mysql-server
# 停止容器
docker stop mysql-server
# 启动容器
docker start mysql-server
# 重启容器
docker restart mysql-server
# 删除容器
docker rm mysql-server
# 删除容器和数据卷
docker rm -v mysql-server
二、数据库备份脚本 backup-mysql.sh
bash
cat > backup-mysql.sh << 'EOF'
#!/bin/bash
source .env
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"
echo "开始备份数据库..."
docker exec ${CONTAINER_NAME} mysqldump \
-u root \
-p${MYSQL_ROOT_PASSWORD} \
--single-transaction \
--routines \
--triggers \
--databases ${MYSQL_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}
if [ $? -eq 0 ]; then
echo "✅ 备份成功: ${BACKUP_DIR}/${BACKUP_FILE}"
# 压缩备份文件
gzip ${BACKUP_DIR}/${BACKUP_FILE}
echo "📦 已压缩: ${BACKUP_DIR}/${BACKUP_FILE}.gz"
else
echo "❌ 备份失败!"
fi
EOF
chmod +x backup-mysql.sh
docker exec mysql-server: 在名为mysql-server的容器中执行命令。sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"': 这是要在容器内执行的命令。sh -c: 启动一个shell来执行后面的字符串命令。exec: 用后面的命令替换当前shell进程(这样就不会有额外的shell进程残留)。mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD": 使用mysqldump工具备份所有数据库,以root用户登录,并使用环境变量MYSQL_ROOT_PASSWORD的值作为密码。
> backup.sql: 将容器内命令的标准输出重定向到宿主机上的backup.sql文件。
三、故障排查和维护
3.1 常用维护命令
bash
# 检查容器状态
docker ps -a
# 查看容器日志
docker logs mysql-server
# 查看实时日志
docker logs -f mysql-server
# 进入容器
docker exec -it mysql-server bash
# 查看容器资源使用
docker stats mysql-server
# 重启容器
docker restart mysql-server
3.2 性能监控
bash
# 查看MySQL状态
docker exec mysql-server mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_connected';"
# 查看进程列表
docker exec mysql-server mysql -uroot -p -e "SHOW PROCESSLIST;"
# 查看变量设置
docker exec mysql-server mysql -uroot -p -e "SHOW VARIABLES LIKE '%buffer%';"