说明:由于业务需要使用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镜像的更多相关文章

  1. 详解如何使用Docker Hub官方的MySQL镜像生成容器

    一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像.但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了.Docker Hub官方提供的CentO ...

  2. Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云

    alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...

  3. 基于Dockerfile制作tomcat镜像

    Docker 概述:   在前面的例子中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一种文件或脚本,我们把想执行的操 ...

  4. Docker将容器制作成镜像并提交到远程仓库

    Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/.或者在阿里云也可以. 2. 然后先创建一个空的镜像名. ...

  5. 使用docker制作Mysql镜像

     一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...

  6. Dockerfile简介及基于centos7的jdk镜像制作

    Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...

  7. Docker之dockerfile制作jdk镜像

    目的: Dockerfile简介 Dockerfile制作jdk镜像 Dockerfile简介 了解dockerfile之前要先了解Docker基本概念和使用可参考:https://www.cnblo ...

  8. docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器

    docker hub上有官方的mysql镜像,我们可以利用它来创建mysql容器,作为一个服务容器使用. 1.下载mysql镜像 docker pull mysql 2.创建镜像 docker run ...

  9. Docker 制作mysql镜像

    # 拉取Ubuntu镜像 docker pull docker.io/ubuntu: # 运行一个容器 docker run --name mysql -p 33:3306 -v /mysql:/va ...

随机推荐

  1. python 基础(集合)

    #set里的元素是唯一的,即没有重复的,可以用set()函数,去数据的重复冗余 L = [1,1,1,2,4,5,6,7] S = set(L) print(S) #打印结果{1, 2, 4, 5, ...

  2. IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容

    IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容 Step 1:设置鼠标移动到类上自动显示Javadoc文档 step2:为jdk下载javadoc Step3: ...

  3. 彻底弄懂ES6中的Map和Set

    Map Map对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值.构造函数Map可以接受一个数组作为参数. Map和Object的区别 一个Object 的键只能是字符串或者 Symb ...

  4. honeyd使用

    honeyd可以同时模仿上千个不同的计算机 官网 honeyd-1.5c.tar.gz:http://www.honeyd.org 依赖包 libevent-1.3a.tar.gz:http://li ...

  5. HDFS之安全模式

    1.namenode启动的时候,首先将映像文件[fsimage]载入内存,并执行编辑日志[edits]中的各项操作. 2.一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件[这 ...

  6. 【Python】模块和包

    模块 模块的概念 1. 每一个以扩展名 `py` 结尾的 `Python` 源代码文件都是一个 模块 2. 模块名 同样也是一个 标识符,需要符合标识符的命名规则 3. 在模块中定义的 全局变量 .函 ...

  7. 小米8seroot后更改hosts文件记录

    1.先备份原有文件,在设置中有个备份与恢复,可以备份,备份后链接电脑,传电脑上 2.下载开发版miui,安装 3.解bl锁,先到官网申请,按照提示操作. 4.备份文件传到手机,恢复文件 5.获得roo ...

  8. Linux访问控制列表(Access Control List,简称ACL)

    Linux访问控制列表(Access Control List,简称ACL) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ACL概述 ACL:Access Control L ...

  9. NUCLEO-8L152开发板中文应用笔记整理集合

    [AN5182]基于Adafruit TFT Shield与STM8 Nucleo-64板的图片查看器:https://www.yiboard.com/thread-962-1-1.html 本应用笔 ...

  10. python图像处理库Pillow基本使用方法

    安装pillow pillow的文档页面,documentation of Pillow 生成一个有单一颜色的图像 from PIL import Image, ImageDraw img = Ima ...