Docker07-MySQL

Docker配置MySQL

当前docker运行mysql:9.6.0

1-Docker脚本

# 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.0mysql:8.4

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 版本(推荐):

# 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

启动:

docker compose up -d

外部连接测试:

# 本地连接
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值