使用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 ...
随机推荐
- Matlab适配器模式
适配器模式是连接两个不兼容接口的桥梁,主要分为三种:类适配器.对象适配器以及接口适配器,本文根据https://blog.csdn.net/u012359453/article/details/791 ...
- 【开发笔记】- Java中关于HashMap的元素遍历的顺序问题
今天在使用如下的方式遍历HashMap里面的元素时 for (Entry<String, String> entry : hashMap.entrySet()) { MessageForm ...
- 【开发工具】- Windows下多个jdk版本切换
一.直接安装jdk,如图我安装了JDK6.JDK7和JDK8三个版本: 二.在安装JDK8后需要在 C:\Windows\System32 该目录下删除 java.exe 和 javaw.exe两个文 ...
- vscode+phpstudy构建php调试环境
由于vs code开源和跨平台,而且插件很多,所以打算以后编写和调试php都用vs code. 配置vs code+phpstudy的php调试环境步骤如下: 1.配置phpstudy,其他选项菜单- ...
- Telnet入侵Windows2000
开启Telnet 打开控制面板,管理工具 计算机管理 连接刚刚探测到的主机 输入探测到的主机IP 如下图所示,连接成功 找到Telnet服务 启动Telnet服务 远程登录 注意 Telnet登录需要 ...
- Android开发之常用Intent.Action【转】
1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putEx ...
- git指令集合
原网页:https://www.linuxidc.com/Linux/2018-04/151809.htm Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文 ...
- 无法将“ng”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 通用解决方案
1.找到你安装的路径 以@angular/cli 为例 (找到 ng.cmd 这个指令的具体位置) 2. 右键 这台电脑 添加路径到 系统变量的 Path中, 如下图 3.关闭所有的 cmd,并重新打 ...
- mongodb replica-set
mongodb 主从复制 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系 ...
- memcached——学习
文章:memcached 常用命令及使用说明 远程清除memcached缓存 使用命令行: telnet 127.0.0.1 11211 连上memcached 然后使用命令:flush_all ...