Docker 搭建单节点MySQL服务

一、主要步骤

使用Docker来下载并启动MySQL,主要步骤包括:拉取MySQL镜像、运行容器、以及一些常见的配置(如设置密码、映射端口、挂载数据卷等)。

  1. 拉取MySQL官方镜像
  2. 创建本地数据存储目录和自定义配置文件目录(用于持久化和配置)
  3. 创建自定义配置文件(可选,但建议)
  4. 运行容器,并设置环境变量、端口映射、数据卷等
  5. 验证连接

1. 拉取mysql镜像

首先,我们需要从镜像仓库中拉取MySQL镜像。可以选择特定版本(如8.0, 5.7等)或使用默认的最新版本。

  • 如果不指定版本,默认拉取最新版。

    bash 复制代码
    docker pull mysql
  • 拉取指定版本,例如拉取MySQL 8.0。

    bash 复制代码
    docker 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容器。以下是一些常用参数:

  1. -p:端口映射,后面紧接着的3306:3306是要进行映射的端口,冒号左边的3306是宿主机的端口号,冒号右边的3306是mysql容器的端口,-p的作用是将mysql容器的3306端口映射到宿主机的3306端口,这样就可以通过宿主机的ip+映射到宿主机的3306端口就能连接上启动的mysql容器。
  2. -e:后面紧接着的MYSQL_ROOT_PASSWORD=root,是指定mysql容器的root用户登陆密码。
  3. -d:表示以守护进程的方式启动服务,服务在后台运行。
  4. --name:指定启动后的容器名。
  5. -v:持久化数据,将容器的数据交给宿主机管理,主要也是为了同步数据,防止容器被删除后数据找不到的问题。/root/data 这是宿主机的数据存放路径;/var/lib/mysql 这是mysql容器存放数据的地方。
  6. --restart=unless-stopped:容器退出时自动重启,除非用户明确执行了 docker stop 命令。
  • 示例1:基本运行

    bash 复制代码
    docker 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的数据。
    bash 复制代码
    docker 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。然后运行:
    bash 复制代码
    docker 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
  • 完整配置示例:

    bash 复制代码
    docker 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%';"
相关推荐
斐硕人2 小时前
SQL滚动求和
数据库·sql·mysql·maxcompute
java_logo2 小时前
GPUSTACK Docker 容器化部署指南
运维·mongodb·docker·云原生·容器·eureka·express
阿巴阿巴啊啊啊2 小时前
docker基本操作命令
运维·docker·容器
DreamLife☼2 小时前
Docker-日志与监控:集中采集与性能分析实战
docker·grafana·efk·可观测性·容器监控·cadvisor·prometheus 监控
合作小小程序员小小店3 小时前
web开发,在线%药店管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·jdk·html·intellij-idea
数据知道4 小时前
FastAPI项目:从零到一搭建一个网站导航系统
python·mysql·fastapi·python web·python项目
Leon-Ning Liu5 小时前
MySQL 5.7大表索引优化实战:108GB数据建索引效率提升50%
运维·数据库·mysql
Just_Do_IT_OK5 小时前
Docker--Spark
docker·容器·spark
1***81535 小时前
Docker视频
docker·容器·音视频