Docker 搭建单节点MySQL服务

一、主要步骤

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

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

1. 拉取mysql镜像

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

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

    docker pull mysql
    
  • 拉取指定版本,例如拉取MySQL 8.0。

    docker pull mysql:8.0
    

2. 创建目录

我们将在主机上创建三个目录:主要用于存储MySQL数据、自定义配置以及日志文件。

# 存储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的配置。

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:基本运行

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

    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客户端连接它。

  • 从容器内部连接:

    # 进入容器
    docker exec -it mysql-server bash
    
    # 连接MySQL
    mysql -u root -p
    
  • 从外部连接:

    # 使用MySQL客户端
    mysql -h 127.0.0.1 -P 3306 -u root -p
    

    然后输入密码,即可连接到MySQL。

  • 使用Navicat连接通过宿主机的ip+运行命令时映射的端口联连接数据库了:
    在这里插入图片描述

4.常用管理命令

# 查看运行中的容器
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

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 常用维护命令

# 检查容器状态
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 性能监控

# 查看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%';"
### 使用Docker部署MHA for MySQL实现高可用性 #### 准备工作 为了确保能够顺利搭建MHA (MySQL High Availability),需要先准备好几项基础设置。这包括但不限于安装并配置好Docker以及确认网络连接正常。 #### 安装与启动Docker服务 对于尚未安装Docker服务端而言,应当依照官方指南完成相应版本的下载和安装过程[^3]。一旦成功安装之后,则可以通过`systemctl start docker`来开启此服务,并通过`docker --version`验证其是否正确无误地被激活。 #### 创建必要的目录结构和支持文件 在每台服务器上创建用于存储数据的日志路径,例如: ```bash mkdir -p /usr/local/mysql/logs/ touch /usr/local/mysql/logs/mysql-bin.index ``` 上述命令会建立指定位置下的日志索引文件,这对于后续操作至关重要[^2]。 #### 构建或拉取所需的镜像 针对本项目来说,至少需要用到两个不同类型的容器——一个是作为数据库实例运行的基础镜像;另一个则是专门用来承载MHA Manager组件的功能型镜像。可以考虑基于官方提供的MySQL镜像构建自定义版,也可以直接从公共仓库获取已有的解决方案。 #### 编写Docker Compose文件 编写一份描述整个集群架构布局的YAML格式配置文档,其中应明确定义各个成员之间的关系及其属性设定: ```yaml version: '3' services: master-node: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: masterroot command: mysqld --server-id=1 --log-bin=mysql-bin.log --binlog-format=row ports: - "3306:3306" slave-node-1: image: mysql:latest depends_on: - master-node environment: MYSQL_ROOT_PASSWORD: masterroot command: > sh -c " sleep 10; until mysql -h master-node -P 3306 -u root -pmasterroot -e ''; do echo Waiting...; sleep 2; done && exec mysqld --server-id=2 --relay-log-index=/var/lib/mysql/slave-relay-bin.index --relay-log=/var/lib/mysql/slave-relay-bin.log --log-slave-updates --read-only=true" manager-node: build: ./manager-image-context-directory volumes: - type: bind source: ./app.cnf target: /etc/mha/app.cnf entrypoint: ["masterha_manager", "--conf=/etc/mha/app.cnf"] ``` 这段脚本不仅涵盖了基本的数据同步逻辑,还引入了一个额外的服务单元负责执行具体的管理职责[^1]。 #### 设置用户权限 为了让各节点间能顺畅通信,在主库中添加远程访问账号是非常有必要的。具体做法如下所示: ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'masterroot'; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'masterroot'; CREATE USER 'mhaadmin'@'192.168.%.' IDENTIFIED BY 'mhapass'; GRANT ALL PRIVILEGES ON *.* TO 'mhaadmin'@'192.168.%.' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 以上SQL语句将赋予新创建的角色充分的操作许可权限以便于实施各项维护活动[^4]。 #### 测试复制链路有效性 最后一步是要检验整个系统的健壮性和稳定性。借助内置工具如`masterha_check_repl`可以帮助快速定位潜在问题所在之处。当看到类似于"All SSH connection tests passed successfully."的消息提示时即表示一切准备就绪[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值