0、需要的文件

  • mysql安装包
  • my.cnf 配置文件
  • mysql-start.sh 启动脚本

1、启动脚本文件mysql-start.sh

脚本链接

  1. $ cat mysql-start.sh
  2. #!/bin/bash
  3. set -o errexit #运行某一行出错时立即退出。
  4. set -- mysqld_safe $@ #定义启动命令
  5. echo "\$@:$@"
  6. #初始化传值变量
  7. db_user=${db_user:=""}
  8. db_password=${db_password:=""}
  9. #如果是变量值为root则重新赋值为空
  10. if [ "${db_user}" = "root" ]
  11. then db_user=""
  12. fi
  13. echo "db_user=$db_user"
  14. echo "db_password=$db_password"
  15. echo "----开始初始化mysql----------------------"
  16. if [ ! -f /data/mysql/logs/mysql.err ];then
  17. mkdir -p /data/mysql/{data,logs,conf}
  18. touch /data/mysql/logs/mysql.err
  19. chown -R mysql.mysql /data
  20. /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
  21. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  22. chmod 777 /etc/init.d/mysqld
  23. ln -s /usr/local/mysql/bin/* /usr/bin/
  24. echo "初始化数据库完毕.数据持目录:/data/mysql"
  25. elif [ ! -f /etc/init.d/mysqld ];then
  26. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  27. chmod 777 /etc/init.d/mysqld
  28. ln -s /usr/local/mysql/bin/* /usr/bin/
  29. fi
  30. echo "设置变量"
  31. passwd="$(awk '/localhost/{print $NF}' /data/mysql/logs/mysql.err|head -1)"
  32. mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="/data/mysql/mysql.sock" )
  33. dbinit=( mysql --connect-expired-password -uroot -p$passwd )
  34. echo "启动数据库"
  35. #启动数据库并判断状态
  36. /etc/init.d/mysqld restart && sleep 3
  37. echo "启动后查看进程"
  38. port=$(ss -lntp|grep "3306"|wc -l)
  39. for p in {3..0}; do
  40. if [ $port -ne 1 ];then
  41. echo "Mysql启动失败-重新启动"
  42. /etc/init.d/mysqld restart && sleep 2
  43. else
  44. echo "Mysql 已经启动"
  45. break
  46. fi
  47. if [ "$p" = 0 ];then
  48. echo >&2 'MySQL 启动失败!'
  49. exit 1
  50. fi
  51. done
  52. echo "开始初始化用户密码"
  53. #passinit="alter user 'root'@'localhost' identified by '';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;"
  54. #if [ ! -f /data/mysql/logs/mysql.err ];then
  55. passinit="alter user 'root'@'localhost' identified with mysql_native_password by '';CREATE USER IF NOT EXISTS 'root'@'%';ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password by ''; grant all on *.* to 'root'@'%' with grant option"
  56. echo "${passinit}"| "${dbinit[@]}" &> /dev/null && echo "初始化成功"
  57. #fi
  58. #再次重启
  59. echo "再次重启验证密码"
  60. for i in {2.0}; do
  61. if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
  62. echo 'MySQL 验证空密码成功!'
  63. break
  64. else
  65. sleep 1;echo "重新验证"
  66. fi
  67. if [ "$i" = 0 ]; then
  68. echo >&2 'MySQL 验证空密码失败!'
  69. exit 1
  70. fi
  71. done
  72. echo "开始进入匹配..."
  73. if [ "${db_user}" != "" -o "${db_password}" != "" ];then
  74. echo "指定了变量--"
  75. echo "进入匹配开始"
  76. #用户不为空,密码不为空---创建用户名 密码,默认授权管理员权限
  77. if [ "${db_user}" != "" -a "${db_password}" != "" -a "${db_database}" = "" ];then
  78. c="CREATE USER IF NOT EXISTS '"${db_user}"'@'%'; ALTER USER '"${db_user}"'@'%' IDENTIFIED WITH mysql_native_password by '"${db_password}"'; GRANT ALL PRIVILEGES ON *.* TO '"${db_user}"'@'%' WITH GRANT OPTION;flush privileges;"
  79. echo "${c}"|"${mysql[@]}" &> /dev/null && echo "添加成功" || echo "创建用户失败"
  80. #用户名为空,密码不为空,数据库为空-------------修改root密码
  81. elif [ "${db_user}" = "" -a "${db_password}" != "" -a "${db_database}" = "" ];then
  82. c="ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password by '"${db_password}"'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;flush privileges;"
  83. echo $c
  84. echo "${c}"|"${mysql[@]}" &> /dev/null && echo "添加成功" || echo "修改密码失败"
  85. else
  86. echo "没有匹配项目"
  87. echo "help:docker xxx image db_user=xx db_password=xx db_database=xx"
  88. exit 1
  89. fi
  90. else
  91. echo "没有指定变量:用户root密码为空"
  92. fi
  93. /etc/init.d/mysqld stop && sleep 1 && echo "关闭成功"
  94. echo "$@" && exec $@

2、Dockerfile

  1. vi .dockerignore
  2. !my.cnf
  3. !mysql-start.sh
  4. !
  1. #FROM centos
  2. FROM geray/centos:v7-1
  3. MAINTAINER "Geray <1690014753@qq.com>"
  4. ENV HOSTNAME=mysql
  5. ENV MYSQL_HOME="/usr/local/mysql"
  6. ENV MYSQL_TAR="mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz"
  7. ENV MYSQL_PATH_SRC_NAME="mysql-8.0.26-linux-glibc2.12-x86_64"
  8. COPY mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz /usr/local/src/
  9. #COPY my.cnf /etc/
  10. # COPY mysql-start.sh /usr/bin/
  11. RUN yum install -y ncurses-devel libaio libaio-devel numactl \
  12. && groupadd mysql \
  13. && useradd -r -g mysql -s /bin/false mysql \
  14. && tar xvf /usr/local/src/${MYSQL_TAR} -C /usr/local/ \
  15. && mv /usr/local/${MYSQL_PATH_SRC_NAME} ${MYSQL_HOME} \
  16. && mkdir ${MYSQL_HOME}/mysql-files/ \
  17. && chown -R mysql:mysql ${MYSQL_HOME} \
  18. && chmod 750 ${MYSQL_HOME}/mysql-files/ \
  19. && ln -s ${MYSQL_HOME}/bin/mysql /usr/bin \
  20. #&& ln -s ${MYSQL_HOME}/bin/mysqld /usr/bin \
  21. #&& ln -s ${MYSQL_HOME}/bin/mysql_ssl_rsa_setup /usr/bin \
  22. #&& ln -s ${MYSQL_HOME}/bin/mysqld_safe /usr/bin \
  23. && rm -rf /usr/local/src/*gz \
  24. && yum clean all \
  25. && rm -rf /var/cache/yum/*
  26. EXPOSE 3306
  27. ENTRYPOINT ["mysql-start.sh"]
  28. CMD ["--user=mysql"]

3、my.cnf

  1. [client]
  2. port = 3406
  3. socket = /tmp/mysql.sock
  4. [mysql]
  5. prompt="\u@db \R:\m:\s [\d]> "
  6. no-auto-rehash
  7. [mysqld]
  8. server-id = 3306100
  9. user = mysql
  10. port = 3306
  11. basedir = /usr/local/mysql
  12. datadir = /data/mysql/
  13. socket = /tmp/mysql.sock
  14. pid-file = db.pid
  15. character-set-server = utf8mb4
  16. skip_name_resolve = 1
  17. open_files_limit = 65535
  18. back_log = 1024
  19. max_connections = 512
  20. max_connect_errors = 1000000
  21. table_open_cache = 1024
  22. table_definition_cache = 1024
  23. table_open_cache_instances = 64
  24. thread_stack = 512K
  25. external-locking = FALSE
  26. max_allowed_packet = 32M
  27. sort_buffer_size = 4M
  28. join_buffer_size = 4M
  29. thread_cache_size = 768
  30. interactive_timeout = 600
  31. wait_timeout = 600
  32. tmp_table_size = 32M
  33. max_heap_table_size = 32M
  34. slow_query_log = 1
  35. slow_query_log_file = /data/mysql/slow.log
  36. log-error = /data/mysql/error.log
  37. long_query_time = 0.1
  38. log-bin = /data/mysql/mysql-binlog
  39. sync_binlog = 1
  40. binlog_cache_size = 4M
  41. max_binlog_cache_size = 1G
  42. max_binlog_size = 1G
  43. gtid_mode = on
  44. enforce_gtid_consistency = 1
  45. log_slave_updates
  46. binlog_format = row
  47. relay_log_recovery = 1
  48. relay-log-purge = 1
  49. key_buffer_size = 32M
  50. read_buffer_size = 8M
  51. read_rnd_buffer_size = 4M
  52. bulk_insert_buffer_size = 64M
  53. #myisam_sort_buffer_size = 128M
  54. #myisam_max_sort_file_size = 10G
  55. #myisam_repair_threads = 1
  56. lock_wait_timeout = 3600
  57. explicit_defaults_for_timestamp = 1
  58. innodb_thread_concurrency = 0
  59. innodb_sync_spin_loops = 100
  60. innodb_spin_wait_delay = 30
  61. master_info_repository = TABLE
  62. relay_log_info_repository = TABLE
  63. slave_parallel_type=LOGICAL_CLOCK
  64. transaction_isolation = REPEATABLE-READ
  65. #innodb_additional_mem_pool_size = 16M
  66. innodb_buffer_pool_size = 1024M
  67. innodb_buffer_pool_instances = 8
  68. innodb_buffer_pool_load_at_startup = 1
  69. innodb_buffer_pool_dump_at_shutdown = 1
  70. innodb_data_file_path = ibdata1:1G:autoextend
  71. innodb_flush_log_at_trx_commit = 1
  72. innodb_log_buffer_size = 32M
  73. innodb_log_file_size = 2G
  74. innodb_log_files_in_group = 2
  75. #innodb_max_undo_log_size = 1G
  76. # 根据您的服务器IOPS能力适当调整
  77. # 一般配普通SSD盘的话,可以调整到 10000 - 20000
  78. # 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
  79. innodb_io_capacity = 4000
  80. innodb_io_capacity_max = 8000
  81. innodb_flush_neighbors = 0
  82. innodb_write_io_threads = 8
  83. innodb_read_io_threads = 8
  84. innodb_purge_threads = 4
  85. innodb_page_cleaners = 4
  86. innodb_open_files = 65535
  87. innodb_max_dirty_pages_pct = 50
  88. innodb_flush_method = O_DIRECT
  89. innodb_lru_scan_depth = 4000
  90. innodb_checksum_algorithm = crc32
  91. #innodb_file_format = Barracuda
  92. #innodb_file_format_max = Barracuda
  93. innodb_lock_wait_timeout = 10
  94. innodb_rollback_on_timeout = 1
  95. innodb_print_all_deadlocks = 1
  96. innodb_file_per_table = 1
  97. innodb_online_alter_log_max_size = 4G
  98. innodb_stats_on_metadata = 0
  99. innodb_status_file = 1
  100. # 注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快
  101. innodb_status_output = 0
  102. innodb_status_output_locks = 0
  103. #performance_schema
  104. performance_schema = 1
  105. performance_schema_instrument = '%=on'
  106. #innodb monitor
  107. innodb_monitor_enable="module_innodb"
  108. innodb_monitor_enable="module_server"
  109. innodb_monitor_enable="module_dml"
  110. innodb_monitor_enable="module_ddl"
  111. innodb_monitor_enable="module_trx"
  112. innodb_monitor_enable="module_os"
  113. innodb_monitor_enable="module_purge"
  114. innodb_monitor_enable="module_log"
  115. innodb_monitor_enable="module_lock"
  116. innodb_monitor_enable="module_buffer"
  117. innodb_monitor_enable="module_index"
  118. innodb_monitor_enable="module_ibuf_system"
  119. innodb_monitor_enable="module_buffer_page"
  120. innodb_monitor_enable="module_adaptive_hash"
  121. # Group Replication
  122. #server_id = 1003306
  123. #gtid_mode = ON
  124. #enforce_gtid_consistency = ON
  125. #master_info_repository = TABLE
  126. #relay_log_info_repository = TABLE
  127. binlog_checksum = NONE
  128. #log_slave_updates = ON
  129. #log_bin = binlog
  130. #binlog_format= ROW
  131. transaction_write_set_extraction = XXHASH64
  132. # 未来可能被弃用的变量,会出现告警信息,binlog_expire_logs_seconds用来代替
  133. # expire_logs_days = 7
  134. binlog_expire_logs_seconds = 7
  135. # 8版本弃用的变量
  136. # loose-group_replication_group_name = 'e842862c-9b12-11e8-8131-080027f1fd08'
  137. # internal_tmp_disk_storage_engine = InnoDB # 8版本不再支持,默认引擎
  138. # query_cache_size = 0 # 8版本不再支持这两个参数
  139. # query_cache_type = 0
  140. # loose-group_replication_start_on_boot = off
  141. # loose-group_replication_local_address = 'enmoedu:33066'
  142. # loose-group_replication_group_seeds ='enmoedu1:33067,enmoedu2:33068,enmoedu:33066'
  143. # loose-group_replication_bootstrap_group = off
  144. # loose-group_replication_single_primary_mode=off
  145. # loose-group_replication_enforce_update_everywhere_checks=true
  146. [mysqldump]
  147. quick
  148. max_allowed_packet = 32M

4、构建

  1. docker build -t geray/mysql:8.0.26 .
  2. docker run -p3306:3306 -e db_password="1234" -v /database/data/:/data/mysql -d --name="mysql-test" geray/mysql:8.0.26