前言

基于MySQL的原版镜像做一些个性化配置修改,封装/etc/my.cnf文件到镜像中,并且支持通过环境变量修改innodb_buffer_pool_sizeserver_id以及自动配置innodb_read_io_threadsinnodb_write_io_threads

主要思路:备份并替换默认的docker-entrypoint.sh文件,根据环境变量修改my.cnf,并调用原来的启动文件。

根据CPU核数修改innodb_read_io_threadsinnodb_write_io_threads,核数低于10时使用默认的4,高于10时对半分。

Dockerfile

FROM mysql:8.0.31

ADD docker-entrypoint.sh /usr/local/bin/
# docker-entrypoint_origin.sh是原始的启动文件,只是拷贝出来改了个名字
ADD docker-entrypoint_origin.sh /usr/local/bin/
ADD my.cnf /etc/ ENV MYSQL_INNODB_BUFFER_SIZE=512M
ENV MYSQL_SERVER_ID=100
  • 打包命令
# 版本号的前三位表示基础MySQL版本
docker build -t custom-mysql:8.0.31.1 .

my.cnf

[mysqld]

skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql # custom variables
interactive_timeout = 600
wait_timeout = 600
default-time-zone='+8:00'
collation_server=utf8mb4_general_ci
max_allowed_packet = 32M
lower_case_table_names = 1
max_connections = 3000
innodb_buffer_pool_size = MYSQL_INNODB_BUFFER_SIZE
innodb_read_io_threads = MYSQL_READ_IOTHREADS
innodb_write_io_threads = MYSQL_WRITE_IOTHREADS log_bin = mysql-bin
binlog_format = row
binlog_cache_size = 2M
expire_logs_days = 15
max_binlog_size = 1G server_id = MYSQL_SERVER_ID
gtid_mode = on
enforce_gtid_consistency = on
log-slave-updates = 1
binlog-ignore-db = mysql,information_schema,sys,performance_schema
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2 # slow query log
log-output=FILE
slow-query-log=1
long_query_time=5
slow_query_log_file=/var/lib/mysql/slow-query.log pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock !includedir /etc/mysql/conf.d/

docker-entrypoint.sh

#!/bin/bash
set -eo pipefail
shopt -s nullglob # custom parameters
if [ -n "$MYSQL_SERVER_ID" ]; then
sed -i "s/MYSQL_SERVER_ID/$MYSQL_SERVER_ID/g" /etc/my.cnf
fi function optimizeIO() {
if [ -n "$MYSQL_INNODB_BUFFER_SIZE" ]; then
sed -i "s/MYSQL_INNODB_BUFFER_SIZE/$MYSQL_INNODB_BUFFER_SIZE/g" /etc/my.cnf
fi # 根据CPU核数自动配置io读写线程数
local cpuCores=$(cat /proc/cpuinfo | grep processor | wc -l)
local iothreads=4
if [ ${cpuCores} -gt 10 ]; then
local iothreads=$((${cpuCores}/2))
fi
sed -i "s/MYSQL_READ_IOTHREADS/${iothreads}/g" /etc/my.cnf
sed -i "s/MYSQL_WRITE_IOTHREADS/${iothreads}/g" /etc/my.cnf
}
optimizeIO # 调用原始的启动脚本
sh /usr/local/bin/docker-entrypoint_origin.sh $@

docker-compose示例

version: "3"
services:
mysql:
image: custom-mysql:8.0.31.1
container_name: mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_INNODB_BUFFER_SIZE=1G
- MYSQL_SERVER_ID=100

[mysql]定制封装MySQL的docker镜像的更多相关文章

  1. 阿里mysql同步工具otter的docker镜像

    https://github.com/dearplain/otter_manager https://github.com/dearplain/otter_node 本人开发的小巧docker镜像,根 ...

  2. 转:如何制作一个定制的 PHP 基础 Docker 镜像(一)

    原文来自于:http://open.daocloud.io/ru-he-zhi-zuo-yi-ge-ding-zhi-de-php-ji-chu-docker-jing-xiang/ 目标:准备一个定 ...

  3. MySQL、MongoDB、Redis数据库Docker镜像制作

    MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...

  4. mysql 的 docker 镜像使用

    mysql 的 docker 镜像使用: 下载镜像: docker pull mysql:8.0.14 运行容器: docker run -it -e MYSQL_ROOT_PASSWORD=mypw ...

  5. asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行

    1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加us ...

  6. 【docker】【mysql】docker安装mysql,阿里云docker镜像加速器,docker搜索查看远程仓库上的镜像,docker拉取镜像,查看本地所有镜像,查看容器的运行状况,查看容器的详细信息

    在docker上安装mysql有两种方式 1.通过Dockerfile构建 2.直接在docker hub上拉取镜像安装 =================本篇采用方法2=============== ...

  7. docker部署mysql,nginx,php,并上传镜像到私有仓库

    前言 最近公司准备把现有环境全部搞成容器化,所以笔者就先了解了一下docker,并搞了一搞,并把自己搞的过程记录下来.话不多说直接开干 环境说明 Centos7 Docker version 18.0 ...

  8. 使用 mysql 的 Docker 镜像

    使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...

  9. Docker镜像实战(ssh、systemctl、nginx、tomcat、mysql)

    Docker镜像实战 1.构建ssh镜像 2.构建systemctl 镜像 3.构建nginx镜像 4.构建tomcat镜像 5.构建mysql镜像 1.构建ssh镜像: 创建镜像目录 mkdir / ...

  10. MySQL 官方 Docker 镜像的使用

    首先是pull image,这里我拉取的是5.6.35: $ sudo docker pull mysql:5.6.35 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口: $ ...

随机推荐

  1. 苦苦搞了半个通宵才搞定的直接使用Sliverlight将文件PUT到阿里云OSS

    为了公司的项目,小的我各种折腾啊,不过高兴的是实现了Silverlight直接提交至阿里云OSS的文件上传,文件上传再也不用通过服务器中转了. 研究SDK发现还有个Node-oss.js,但还没进行测 ...

  2. 2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被

    2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n 能被 ...

  3. 2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。

    2021-12-22:回文子串. 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. ...

  4. 2021-07-20:最小区间。你有 k 个 非递减排列 的整数列表。找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中。我们定义如果 b-a < d-c 或者在 b-a ==

    2021-07-20:最小区间.你有 k 个 非递减排列 的整数列表.找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中.我们定义如果 b-a < d-c 或者在 b-a ...

  5. 2021-09-17:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?

    2021-09-17:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点.进阶:你能尝试使用一趟扫描实现吗? 福大大 答案2021-09-17: 双指针. 1.创建虚拟头节点preHea ...

  6. 什么是DOM和BOM?

    DOM:文档对象模型,描述了处理网页内容的方法和接口.最根本对象是document 由于DOM的操作对象是文档,所以DOM和浏览器没有直接关系 BOM:浏览器对象模型,描述了与浏览器进行交互的方法和接 ...

  7. 【GiraKoo】Riters瑞特斯闹钟说明书

    对于闹钟这种按钮存在大量复用,长按操作的设备.说明书一旦丢失,真的很麻烦. 特准备了一个系列,专门保存使用说明书.希望能给大家提供一点帮助. 型号:RTS-1909

  8. 配置pip源

    1.使用配置文件配置文件[global]trusted-host=pypi.doubanio.comindex-url=https://pypi.doubanio.com/simple配置文件放置位置 ...

  9. 不要轻易尝试 weexplus open as

    昨日使用 weexplust publish android 编译apk, 出现了一大堆错 FAILURE: Build failed with an exception. * What went w ...

  10. 搭建自动化 Web 页面性能检测系统 —— 设计篇

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值.. 本文作者:琉易 liuxianyu.cn 页面性能对于用户体验.用 ...