使用docker 基于centos7制作mysql镜像
说明:由于业务需要使用centos7.6+mysql5.7+jdk8以及其他的java程序,本想在网上找一个现成的,发现镜像都不适合我。
一、yum方式安装mysql
1、编写dockerfile文件
#FROM centos: FROM xxlaila/centos7.-jdk1. LABEL maintainer='xxx' centos_version='7.6' mysql_version='5.7' jdk_version='1.8' #ADD jdk-8u181-linux-x64.tar.gz /usr/local COPY bootstrap.sh /etc/ WORKDIR /usr/local RUN yum install wget crontabs iproute -y \ && wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm \ && rpm -ivh mysql57-community-release-el7-.noarch.rpm \ && yum install install mysql-server -y --nogpgcheck \ && mysqld --initialize --explicit_defaults_for_timestamp --user=mysql \ && chmod /etc/bootstrap.sh \ #ENV PATH /usr/local/jdk/bin:$PATH COPY my.cnf /etc/my.cnf COPY createDB.sql /mysql/createDB.sql COPY privileges.sql /mysql/privileges.sql EXPOSE ENTRYPOINT ["/etc/bootstrap.sh"] CMD ["/usr/sbin/init"]
2、bootstrap.sh文件
#!/bin/bash set -x #判断mysql root密码是否被赋值,如果没有赋值,给定默认值 MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-123456} #判断mysql是否启动 mysqld --user=mysql & sleep function start_mysql(){ ..};do PORT=$(ss -anlp|grep |wc -l) ]; then echo "Mysql 未启动,启动mysql" mysqld --user=mysql & sleep else echo "Mysql 以启动" break fi ]; then echo >& 'MySQL 启动失败!' exit fi done } start_mysql #获取mysql初始密码 PASSWORD=$(awk '/password/{print $NF}' /var/log/mysqld.log) echo "修改mysql密码..." mysql --connect-expired-password -uroot -p>& #判断密码是否修改成功 #if [ $? -eq 0 ];then # echo "Mysql密码修改成功..." #else # echo "Mysql密码修改失败..." # exit #fi #设置环境变量 MYSQL="mysql --protocol=socket -uroot -p${MYSQL_ROOT_PASSWORD}" #初始化sql echo "1. 初始化mysql..." #、判断数据库test_db是否存在 $MYSQL -e >& ]; then echo '2. creating database...' $MYSQL < /mysql/createDB.sql echo '4. flush privileges....' $MYSQL < /mysql/privileges.sql fi # check mysql status #echo `service mysql status` echo '5. mysql for test_db is ready...'
3、my.cnf
[mysqld] server-id= max_connections= #basedir = /usr/local/mysql #datadir = /data/mysql/data port = #secure_file_priv=/data/mysql/data query_cache_type= query_cache_size=120M query_cache_min_res_unit= character_set_server=utf8 #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' general_log=ON slow_query_log= long_query_time= #log-error=/data/mysql/logs/mysql.err #log_bin=/data/mysql/logs/mysql-bin #slow-query-log-file=/data/mysql/logs/slowquery.log #socket = /data/mysql/mysql.sock symbolic-links= character-set-server=gbk ####################### [client] #socket=/data/mysql/mysql.sock [mysql] default-character-set=gbk
二、基于源码安装mysql
1、dockerfile文件
FROM centos: LABEL maintainer='xxx' centos_version='7.7' mysql_version='5.7' jdk_version='1.8' #拷贝并解压mysql、jdk软件包 ADD jdk-8u181-linux-x64.tar.gz /usr/local ADD mysql--linux-glibc2.-x86_64.tar.gz /usr/local WORKDIR /usr/local COPY setup.sh /usr/bin/ RUN ln -s mysql--linux-glibc2.-x86_64 mysql \ && ln -s jdk1..0_181 jdk \ && groupadd -r mysql \ && useradd -r -g mysql mysql \ && yum install -y crontabs libaio libaio-devel numactl.x86_64 iproute \ && cat /data/cron | crontab \ && chmod /usr/bin/setup.sh ENV PATH /usr/local/mysql/bin:/usr/local/jdk/bin:$PATH EXPOSE #拷贝初始化mysql的sql文件 COPY my.cnf /etc/my.cnf COPY createDB.sql /mysql/createDB.sql COPY privileges.sql /mysql/privileges.sql #执行初始化脚本文件 ENTRYPOINT ["setup.sh"]
2、setup.sh文件信息
#!/bin/bash set -x echo "----开始初始化mysql----------------------" mkdir -p /data/mysql/{data,logs,conf,mysql.pid} touch /data/mysql/logs/mysql.err chown -R mysql.mysql /data/mysql #curl -o /data/mysql/conf/my.cnf http://124.207.22.13/logs/Math/my.cnf #ln -s /data/mysql/conf/my.cnf /etc/my.cnf /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chmod /etc/init.d/mysqld #ln -s /usr/local/mysql/bin/* /usr/bin/ echo "初始化数据库完毕.数据持目录:/data/mysql" echo "设置变量" passwd="$(awk '/localhost/{print $NF}' /data/mysql/logs/mysql.err|head -1)" dbinit=( mysql --connect-expired-password -uroot -p"$passwd" ) #sed -i '/\[mysqld\]/a\skip-grant-tables' /etc/my.cnf echo "启动数据库" #启动数据库并判断状态 sed -i "47cdatadir=/data/mysql/data" /etc/init.d/mysqld function start_mysql(){ /etc/init.d/mysqld restart && sleep 3 echo "启动后查看进程" port=$(ss -lntp|grep "3306"|wc -l) for p in {3..0}; do if [ $port -ne 1 ];then echo "Mysql启动失败-重新启动" /etc/init.d/mysqld restart && sleep 2 else echo "Mysql 已经启动" break fi if [ "$p" = 0 ];then echo >&2 'MySQL 启动失败!' exit 1 fi done } start_mysql echo "修改数据库密码" #passinit="alter user 'root'@'localhost' identified by '123456';" #echo $passinit | $dbinit #echo $dbinit mysql --connect-expired-password -uroot -p"$passwd" -e "alter user 'root'@'localhost' identified by '123456';" echo "$passwd" 密码 #echo "重新启动mysql" #start_mysql #初始化sql #mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="/data/mysql/mysql.sock" -p123456) mysql="mysql --protocol=socket -uroot -hlocalhost --socket=/data/mysql/mysql.sock -p123456" #echo '1. starting mysql...' #service mysql start $mysql -e "use test_db;" > /dev/null 2>&1 if [ $? != 0 ]; then echo '2. creating database...' $mysql < /mysql/createDB.sql set password echo '3. flush privileges....' $mysql < /mysql/privileges.sql fi # check mysql status #echo `service mysql status` echo '4. mysql for test_db is ready...'
3、my.cnf
[mysqld] server-id= max_connections= basedir = /usr/local/mysql datadir = /data/mysql/data port = secure_file_priv=/data/mysql/data query_cache_type= query_cache_size=120M query_cache_min_res_unit= character_set_server=utf8 #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' general_log=ON slow_query_log= long_query_time= log-error=/data/mysql/logs/mysql.err log_bin=/data/mysql/logs/mysql-bin slow-query-log-file=/data/mysql/logs/slowquery.log socket = /data/mysql/mysql.sock symbolic-links= character-set-server=gbk ####################### [client] socket=/data/mysql/mysql.sock [mysql] default-character-set=gbk
注:基于源码安装比基于yum安装方式,最后生成的镜像大一点多G,如下:
1.78GB是yuam方式安装
3.31GB这个是源码安装,这种方式安装以后,镜像实在是有点太大了。
总的来说,这个镜像还是太臃肿,最好是几百兆就完美了。
借鉴:
https://www.jianshu.com/p/121e045d14f7
https://blog.csdn.net/weixin_33981932/article/details/92600770
使用docker 基于centos7制作mysql镜像的更多相关文章
- 详解如何使用Docker Hub官方的MySQL镜像生成容器
一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像.但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了.Docker Hub官方提供的CentO ...
- Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云
alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...
- 基于Dockerfile制作tomcat镜像
Docker 概述: 在前面的例子中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一种文件或脚本,我们把想执行的操 ...
- Docker将容器制作成镜像并提交到远程仓库
Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/.或者在阿里云也可以. 2. 然后先创建一个空的镜像名. ...
- 使用docker制作Mysql镜像
一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...
- Dockerfile简介及基于centos7的jdk镜像制作
Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...
- Docker之dockerfile制作jdk镜像
目的: Dockerfile简介 Dockerfile制作jdk镜像 Dockerfile简介 了解dockerfile之前要先了解Docker基本概念和使用可参考:https://www.cnblo ...
- docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器
docker hub上有官方的mysql镜像,我们可以利用它来创建mysql容器,作为一个服务容器使用. 1.下载mysql镜像 docker pull mysql 2.创建镜像 docker run ...
- Docker 制作mysql镜像
# 拉取Ubuntu镜像 docker pull docker.io/ubuntu: # 运行一个容器 docker run --name mysql -p 33:3306 -v /mysql:/va ...
随机推荐
- python预习day1
计算机基础 cpu 大脑 内存 临时记忆 硬盘 永久记忆 输入设备 眼睛 耳朵 输出设备 嘴巴 操作系统 控制计算机硬件工作流程的 应用程序 安装在操作系统之上的软件 python简介 python是 ...
- Java自学-数组 排序
Java 数组选择法,冒泡法排序 步骤 1 : 选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其 ...
- command injection命令注入
命令注入 是指程序中有调用系统命令的部分,例如输入ip,程序调用系统命令ping这个ip.如果在ip后面加一个&&.&.|.||命令拼接符号再跟上自己需要执行的系统命令 在pi ...
- 对于flex布局的使用心得
弹性盒子flex: 对于客户端的布局非常有用,不管是平均分配space-around这个属性还是两端对齐space-betwee在页面布局的时候都会有很好的表现. 对于部分内容区域中,具有很多大致内容 ...
- 基于RBAC模型的权限设计:如何设计系统权限体系?
一.什么是RABC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来间接地赋予用户权限(如下图),从而 ...
- Oracle UNDO块
过程:开始一个事务--通过事务信息找到UNDO块头的所在的段名及数据文件号等--转储UNDO header--在事务表中对应槽位找到前镜像dba--转储数据块--找到对应记录得到bdba--转储数据块 ...
- 使用10046追踪执行计划demo
(一)开启10046追踪 SQL> alter session set events '10046 trace name context forever,level 12'; (二)执行sql语 ...
- LXC容器
1. LXC简述 Linux container是一种资源隔离机制而非虚拟化技术.VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是标准的虚拟化技术,这 ...
- Linux操作系统的计划任务
Linux操作系统的计划任务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.任务计划概述 Linux任务计划.周期性任务执行 未来的某时间点执行一次任务: at: 指定时间点, ...
- python怎么连接MongoDB数据库
Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接. pip 安装: pip3 install pymongo 引入库: import pymo ...