Docker配置MySQL
当前docker运行mysql:9.6.0

1-Docker脚本
bash
# 1. 先创建本地数据目录
mkdir -p ~/docker-data/mysql9/data
# 2. 运行容器
docker run -d \
--name mysql9 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_root_password \
-v ~/docker-data/mysql9/data:/var/lib/mysql \
mysql:9.6.0
参数说明:
| 参数 | 作用 |
|---|---|
-d |
后台运行 |
--name mysql9 |
容器命名 |
-p 3306:3306 |
端口映射,外部可通过 localhost:3306 访问 |
-e MYSQL_ROOT_PASSWORD=... |
设置 root 密码 |
-v ...:/var/lib/mysql |
数据持久化到本地目录 |
⚠️ 版本提醒: MySQL 9.6.0 目前可能尚未发布(最新稳定版约为 9.0.x 或 8.4.x)。如果拉取失败,建议换成 mysql:9.0 或 mysql:8.4:
bash
docker run -d \
--name mysql9 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_root_password \
-v ~/docker-data/mysql9/data:/var/lib/mysql \
mysql:9.0
Docker Compose 版本(推荐):
yaml
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:9.0 # 或 mysql:8.4
container_name: mysql9
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: your_root_password
# 可选:同时创建一个业务用户和数据库
# MYSQL_DATABASE: mydb
# MYSQL_USER: appuser
# MYSQL_PASSWORD: apppass
volumes:
- ./mysql-data:/var/lib/mysql
command: >
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
启动:
bash
docker compose up -d
外部连接测试:
bash
# 本地连接
mysql -h 127.0.0.1 -P 3306 -u root -p
# 或从其他机器(替换为你的服务器IP)
mysql -h <服务器IP> -P 3306 -u root -p
如果外部连不上,检查服务器防火墙是否放行了 3306 端口。
2-个人电脑
# 1. 先清理并创建本地数据目录-Mac
rm -rf /Users/a888/TT_Runtime/20260811_docker_mysql9/data
mkdir -p /Users/a888/TT_Runtime/20260811_docker_mysql9/data
# 2. 运行容器
docker run -d \
--name mysql9_3306 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /Users/a888/TT_Runtime/20260811_docker_mysql9/data:/var/lib/mysql \
mysql:latest
3-Mysql服务器部署-未验证
1-Ubantu系统
1-安装docker
-
1)先尝试看一下docker有没有安装
root@hecs-360823:~# docker ps
Command 'docker' not found, but can be installed with:
snap install docker # version 24.0.5, or
apt install docker.io # version 24.0.5-0ubuntu1~22.04.1
apt install podman-docker # version 3.4.4+ds1-1ubuntu1.22.04.2
See 'snap info docker' for additional versions. -
2)执行脚本安装
apt install docker.io
2-安装mysql8.0
华为云Docker,还需要开通防火墙【华为云管理平台】;但是有一点,如果想更新mysql8.0的配置,就得先更新mysqld.cnf,但是8.0貌似非官方的,找不到这个文件(还有一种说法:在MySQL 8.0版本中,默认情况下没有名为"mysqld.cnf"的配置文件。相反,使用新的配置系统来管理MySQL服务器的设置。这个新的配置系统称为"my.ini"或者"my.cnf"(取决于操作系统))
-
1)创建文件
export MYSQL_PATH=/tzf/docker/mysql
mkdir -p MYSQL_PATH/data mkdir -p MYSQL_PATH/log
mkdir -p $MYSQL_PATH/mysql-files -
2)运行容器
docker run
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-v MYSQL_PATH/data:/var/lib/mysql:rw \ -v MYSQL_PATH/log:/var/log/mysql:rw
-v $MYSQL_PATH/mysql-files:/var/lib/mysql-files/
--name mysql8_3306
--restart=always
-d mysql:8.0 -
3)开放防火墙(云上先开放防火墙)
- 开放端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT - 保存配置
service iptables save
- 开放端口
3-安装mysql5.7
华为云Docker,还需要开通防火墙【华为云管理平台】;但是有一点,如果想更新mysql8.0的配置,就得先更新mysqld.cnf,但是8.0貌似非官方的,找不到这个文件(还有一种说法:在MySQL 8.0版本中,默认情况下没有名为"mysqld.cnf"的配置文件。相反,使用新的配置系统来管理MySQL服务器的设置。这个新的配置系统称为"my.ini"或者"my.cnf"(取决于操作系统))
1)创建mysqld.cnf文件
-
my.cnf for 8.0版本
[client]
port = 3306
socket = /data/mysql/mysql.sock[mysql]
prompt = "\u@\d \r:\m:\s>"
no_auto_rehash
loose-skip-binary-as-hex[mysqld]
user = mysql
port = 3306
authentication_policy=mysql_native_password
#主从复制或MGR集群中,server_id记得要不同
#另外,实例启动时会生成 auto.cnf,里面的 server_uuid 值也要不同
#server_uuid的值还可以自己手动指定,只要符合uuid的格式标准就可以
server_id = 3306
#basedir = /usr/local/mysql
tmpdir=/data/tmp01:/data/tmp02:/data/tmp03
datadir = /data/mysql
socket = /data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
character_set_server = UTF8MB4
skip_name_resolve = 1
secure_file_priv=""
#若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数
#default_time_zone = "+8:00"
#启用admin_port,连接数爆满等紧急情况下给管理员留个后门
admin_address = '127.0.0.1'
admin_port = 33062
lower_case_table_names = 1
local_infile = 1#performance setttings
lock_wait_timeout = 3600
open_files_limit = 65535
back_log = 1024
max_connections = 10240
max_connect_errors = 1000000
table_open_cache = 20000
table_definition_cache = 2000
thread_stack = 512K
sort_buffer_size = 2M
#join_buffer_size = 4M
#read_buffer_size = 8M
#read_rnd_buffer_size = 4M
#bulk_insert_buffer_size = 64M
thread_cache_size = 256
#interactive_timeout = 600
#wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M#log settings
log_timestamps = SYSTEM
log_error = /data/logs01/mysql-error.log
log_error_verbosity = 3
slow_query_log = 1
log_slow_extra = 1
slow_query_log_file = /data/logs01/mysql-slow.log
long_query_time = 0.1
#log_queries_not_using_indexes = 1
#log_throttle_queries_not_using_indexes = 60
#min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_replica_statements = 1
log_bin = /data/logs01/mysql_bin
binlog_format = ROW
sync_binlog = 1000 #MGR环境中由其他节点提供容错性,可不设置双1以提高本地节点性能
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
binlog_rows_query_log_events = 1
binlog_expire_logs_seconds = 604800
#MySQL 8.0.22前,想启用MGR的话,需要设置binlog_checksum=NONE才行
binlog_checksum = CRC32#myisam settings
key_buffer_size = 32M
myisam_sort_buffer_size = 128M#replication settings
relay_log = /data/logs01/relaylog
relay_log_index = /data/logs01/mysqld_relay_bin.index
relay_log_recovery = 1
replica_parallel_type = LOGICAL_CLOCK
replica_parallel_workers = 16 #可以设置为逻辑CPU数量的2倍
binlog_transaction_dependency_tracking = WRITESET
replica_preserve_commit_order = 1
replica_checkpoint_period = 2
skip_replica_start = ON
read_only = 0
gtid_mode = ON
enforce_gtid_consistency = ON
replica_transaction_retries = 128#mgr settings
#loose-plugin_load_add = 'mysql_clone.so'
#loose-plugin_load_add = 'group_replication.so'
#loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
#MGR本地节点IP:PORT,请自行替换
#loose-group_replication_local_address = "172.16.16.10:33061"
#MGR集群所有节点IP:PORT,请自行替换
#loose-group_replication_group_seeds = "172.16.16.10:33061,172.16.16.11:33061,172.16.16.12:33061"
#loose-group_replication_start_on_boot = OFF
#loose-group_replication_bootstrap_group = OFF
#loose-group_replication_exit_state_action = READ_ONLY
#loose-group_replication_flow_control_mode = "DISABLED"
#loose-group_replication_single_primary_mode = ON
#loose-group_replication_communication_max_message_size = 10M
#loose-group_replication_unreachable_majority_timeout = 30
#loose-group_replication_member_expel_timeout = 5
#loose-group_replication_autorejoin_tries = 288#innodb settings
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 8G
innodb_buffer_pool_instances = 8
innodb_data_file_path = ibdata1:2G;ibdata2:2G;ibdata3:2G;ibdata4:2G;ibdata5:16M:autoextend
innodb_flush_log_at_trx_commit = 2 #MGR环境中由其他节点提供容错性,可不设置双1以提高本地节点性能
innodb_log_buffer_size = 500M
innodb_log_file_size = 2G #如果线上环境的TPS较高,建议加大至1G以上,如果压力不大可以调小
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 4G
innodb_thread_concurrency = 0
innodb_read_io_threads = 48
innodb_write_io_threads = 48
innodb_commit_concurrency = 48根据您的服务器IOPS能力适当调整
一般配普通SSD盘的话,可以调整到 10000 - 20000
配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 20000
innodb_io_capacity_max = 50000
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_buffer_pool_dump_pct = 75
#Innodb_io_capacity/innodb_buffer_pool_instances Innodb_io_capacity>innodb_lru_scan_depth*innodb_buffer_pool_instance
innodb_lru_scan_depth = 4000
#innodb_lock_wait_timeout = 10
#innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 1G
innodb_print_ddl_logs = 1
innodb_status_file = 1
#注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log_error文件增长较快
#innodb_status_output = 0
innodb_status_output_locks = 1
innodb_sort_buffer_size = 67108864
innodb_adaptive_hash_index = OFF
#提高索引统计信息精确度
innodb_stats_persistent_sample_pages = 500#innodb monitor settings
innodb_monitor_enable = "module_innodb"
innodb_monitor_enable = "module_server"
innodb_monitor_enable = "module_dml"
innodb_monitor_enable = "module_ddl"
innodb_monitor_enable = "module_trx"
innodb_monitor_enable = "module_os"
innodb_monitor_enable = "module_purge"
innodb_monitor_enable = "module_log"
innodb_monitor_enable = "module_lock"
innodb_monitor_enable = "module_buffer"
innodb_monitor_enable = "module_index"
innodb_monitor_enable = "module_ibuf_system"
innodb_monitor_enable = "module_buffer_page"
#innodb_monitor_enable = "module_adaptive_hash"#pfs settings
performance_schema = 1
#performance_schema_instrument = '%memory%=on'
performance_schema_instrument = '%lock%=on'[mysqldump]
quick
2)测试事务mysqld.cnf文件
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
# 表名不区分大小写
lower_case_table_names=1
#server-id=1
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysqlx.sock
#symbolic-links=0
# 配置隔离级别
# transaction-isolation=REPEATABLE-READ
transaction-isolation=READ-COMMITTED
# transaction-isolation=READ-UNCOMMITTED
# transaction-isolation=SERIALIZABLE
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
3)拷贝执行脚本到服务器
#!/bin/bash
# 定义容器名称
CONTAINER_NAME=mysql5.7
IMAGE_VERSION=5.7
MYSQL_PATH=/tzf/docker/mysql
MYSQL_PASSWORD=123456
# 进行文件地址创建
mkdir -p $MYSQL_PATH/data
mkdir -p $MYSQL_PATH/log
mkdir -p $MYSQL_PATH/mysql-files
mkdir -p $MYSQL_PATH/mysql.conf.d
# 检查容器是否已经存在
if [ "$(docker ps -a -q -f name=$CONTAINER_NAME)" ]; then
# 如果容器已经存在,则停止并删除容器
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
fi
# 重新运行MySQL-指定本地挂载目录
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=$MYSQL_PASSWORD -v $MYSQL_PATH/mysql.conf.d:/etc/mysql/conf.d --name $CONTAINER_NAME -d mysql:$IMAGE_VERSION
# 等待容器启动
sleep 10
# 打印服务启动成功
echo "MySQL容器已经成功启动,按照挂载的mysqld.cnf进行服务运行"
4)开放防火墙(云上先开放防火墙)
- 开放端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
- 保存配置
service iptables save