MySQL8 Docker容器化部署之x86-64架构(含备份)

发布时间:2026/8/26 20:04:06
MySQL8 Docker容器化部署之x86-64架构(含备份) 一、 简介本文介绍如何在 x86-64 架构的服务器上安装并配置MySQL8涵盖目录规划、镜像拉取、容器启动与数据备份等关键步骤帮助读者快速完成生产可用的部署。二、详解1. 创建目录创建安装目录、数据目录与备份目录。mkdir-p/opt/software/mysql8/{conf,logs,init,secrets,scripts}# 安装目录mkdir-p/data/mysql8/{data,backup}# 数据目录、备份数据存放目录2、编辑docker-compose.ymlcd/opt/software/mysql8vimdocker-compose.yml# 内容如下复制粘贴即可---# 定义密钥secrets:passwd_root:file:./secrets/passwd_root.txtpasswd_common:file:./secrets/passwd_common.txt# 子网networks:mysqlnet:driver:bridgeipam:config:-subnet:172.26.0.0/24# 服务services:mysql8:container_name:mysql-commonimage:mysql:8.0.45user:rootrestart:unless-stoppedprivileged:true# 授予容器最高系统权限获得对宿主机的完全访问控制权ports:-30096:3306# 宿主机指定网卡映射volumes:-/data/mysql8/data:/var/lib/mysql# 数据目录挂载-./conf/my.cnf:/etc/my.cnf:ro# 配置文件只读挂载不允许容器内对其写操作-./logs:/var/log/mysql-./init:/docker-entrypoint-initdb.d# 挂载初始化目录容器首次启动时会自动执行此目录下的所有文件 sql、sh-/etc/localtime:/etc/localtime:rosecrets:# 挂载secrets; 默认挂载至容器内的 /run/secrets/ 路径-passwd_root-passwd_commonenvironment:TZ:Asia/Shanghai# MySQL镜像启动时会先加载MYSQL_ROOT_PASSWORD_FILE变量, 然后把文件内容转换成 MYSQL_ROOT_PASSWORD, 并且会把MYSQL_ROOT_PASSWORD_FILE变量unset掉MYSQL_ROOT_PASSWORD_FILE:/run/secrets/passwd_rootMYSQL_USER_PASSWORD_FILE:/run/secrets/passwd_commonhealthcheck:test:[CMD-SHELL,MYSQL_PWD\$$(cat /run/secrets/passwd_root)\ mysql -h 127.0.0.1 -uroot --protocolTCP -e SELECT 1 /dev/null 21 || exit 1]interval:10stimeout:5sretries:5start_period:60snetworks:-mysqlnet# 备份服务mysqlbackup:image:mydumper/mydumper:v0.14.5-3user:rootprofiles:[backup]# 表示这个服务不会随着up -d 启动depends_on:mysql8:condition:service_healthysecrets:-passwd_commonenvironment:TZ:Asia/ShanghaiMYSQL_HOST:mysql8MYSQL_PORT:3306MYSQL_USER:commonMYSQL_USER_PASSWORD_FILE:/run/secrets/passwd_commonvolumes:-/etc/localtime:/etc/localtime:ro-/data/mysql8/backup:/backup-./scripts/mydumper_backup.sh:/usr/local/bin/mydumper_backup.sh:rocommand:[/bin/bash,/usr/local/bin/mydumper_backup.sh]networks:-mysqlnet...2、编辑my.cnfvim./conf/my.cnf# 内容如下复制粘贴即可[client]default-character-setutf8mb4 socket/var/lib/mysql/mysql.sock[mysql]default-character-setutf8mb4[mysqld]usermysql autocommit1datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock pid-file/var/log/mysql/mysqld.pid log-error/var/log/mysql/mysqld.log symbolic-links0character-set-serverutf8mb4#binloglog-binbin binlog_cache_size16M binlog_formatROW binlog_row_imageFULL max_binlog_cache_size1GB # 设置单个 binlog 文件的最大大小 max_binlog_size300M#binlog日志保留时间单位秒30天binlog_expire_logs_seconds2592000ft_min_word_len4connect_timeout600interactive_timeout1800wait_timeout600# 启用GTID gtid_modeON enforce_gtid_consistencyON group_concat_max_len102400lower-case-table_names1character-set-serverutf8mb4 collation-serverutf8mb4_general_cidefault-storage-engineinnodb # 密码认证插件 default_authentication_pluginmysql_native_passworddefault-time-zone08:00slow_query_log1#输出死锁 innodb_print_all_deadlocks1long_query_time10max_connections4096max_connect_errors1024max_allowed_packet64M back_log512interactive_timeout3600sort_buffer_size2M join_buffer_size2M read_buffer_size2M read_rnd_buffer_size2M thread_cache_size256table_open_cache10000max_heap_table_size64M tmp_table_size64M thread_stack192KB local_infile0skip-name-resolve skip-external-locking#innodbinnodb_buffer_pool_size2048M#ibdata1的数据设置应该和本地ibdata1大小的一致innodb_data_file_pathibdata1:1G;ibdata2:1G:autoextend innodb_temp_data_file_pathibtmp1:12M:autoextend:max:5G innodb_read_io_threads8innodb_write_io_threads8innodb_file_per_table1#将InnoDB的日志刷新方式调整为O_DIRECT可以减少数据在缓存和磁盘之间的复制 innodb_flush_methodO_DIRECT #将InnoDB的日志刷新策略调整为每秒刷新可以提高性能 innodb_flush_log_at_trx_commit2innodb_lock_wait_timeout120innodb_thread_concurrency16innodb_log_buffer_size8M #将InnoDB日志文件大小调整为256M可以减少写入磁盘的次数提高性能 innodb_log_file_size256M innodb_redo_log_capacity268435456innodb_buffer_pool_size4G innodb_log_files_in_group3innodb_max_dirty_pages_pct90innodb_open_files10000skip_replica_start log_replica_updates sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZEROrelay-logrelay.log relay-log-indexslave-relay.index log_bin_trust_function_creators13、编辑初始化所需的文件# 创建密码文件echosuperADMIN_2026./secrets/passwd_root.txt# root密码echocommonADMIN_2026./secrets/passwd_common.txt# common用户密码vim./init/init.sh# 可根据需要修改#! /bin/bashset-euopipefail# 读取common用户密码文件COMMON_PASSWD$(cat$MYSQL_USER_PASSWORD_FILE)# 执行指定SQL可自定义这里只用于创建用户mysql-uroot-p$MYSQL_ROOT_PASSWORDEOF create user common% identified with mysql_native_password by ${COMMON_PASSWD}; grant all privileges on *.* to common% WITH GRANT OPTION; flush privileges; EOF4、创建数据备份脚本vim./scripts/mydumper_backup.sh# 复制粘贴即可#! /bin/bashset-euopipefailCOMMON_PASSWD$(cat$MYSQL_USER_PASSWORD_FILE)DATE$(date%Y-%m-%d-%H-%M)MYSQL_TARNAMEmysqlbackupfunctionMysql_backup(){# 判断目录不存在就创建[-e/backup/${MYSQL_TARNAME}_${DATE}]||mkdir/backup/${MYSQL_TARNAME}_${DATE}# 执行备份备份所有业务库mydumper--host${MYSQL_HOST}--port${MYSQL_PORT}--user${MYSQL_USER}--password${COMMON_PASSWD}\--triggers--routines-E--regex^(?!(information_schema|performance_schema|sys|mysql))\--compress--verbose3--threads8--long-query-guard999999999--outputdir/backup/${MYSQL_TARNAME}_${DATE}cd/backup/tar-zcf${MYSQL_TARNAME}_${DATE}.tar.gz${MYSQL_TARNAME}_${DATE}--remove-files/dev/null21# 保留最近7天的备份文件find/backup/-typef-ctime7-name*.tar.gz-execrm-f{}\;}Mysql_backup5、拉取镜像# 明确拉取x86架构镜像dockerpull--platformlinux/amd64 mysql:8.0.45dockerpull--platformlinux/amd64 mydumper/mydumper:v0.14.5-3# X86_64架构、MySQL 8.0.x6、启动MySQL# 数据目录授权chmod-R755/data/mysql8;chmodx ./init/*.sh ./scripts/*.sh;chmod644secrets/*# 启动MySQLdocker-composeup-dmysql8# 定时备份00 01 * * * /usr/local/bin/docker-compose run--rmmysqlbackup/dev/null21# 若后续修改了配置文件后则重启即可不会影响现有数据docker-composerestart