Docker07-MySQL

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.0mysql: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文件

  • mysql配置文件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
相关推荐
Blossom i3 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
InfinitePlus3 小时前
Docker MySQL搭建一主一从
mysql·docker
Wzx1980126 小时前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker
CodeDevMaster6 小时前
关于PaddleOCR-VL部署与使用说明
docker·llm
Kismet_nvi6 小时前
《Kubernetes Service 进阶、kube-proxy 与 Ingress 实战精要》
云原生·容器·kubernetes
少晓年7 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
Ghost Face...8 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
Crazy________8 小时前
Redis03:持久化存储,大key分析,主从复制及哨兵模式
数据库·redis·容器
Zhu7588 小时前
使用helm在k8s集群部署MySQL单实例,支持当前所有主版本的最新子版本
mysql·adb·kubernetes