docker 制作自己的mysql镜像

1、下载mysql,本次以mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar为例

2、编辑启动脚本start.sh,容器启动时会运行这个脚本,主要是安装并初始化mysql

#!/bin/bash
MYSQL_ROOT_PASSWORD=123456
if [ -z "$MYSQL_ROOT_PASSWORD" ];then
 echo "MYSQL_ROOT_PASSWORD is empty"
 exit 0
fi
INIT_MYSQL(){
   echo "mysql初始化"
   yum install -y libaio  libnuma* net-tools perl.x86_64
   cd /usr/local/src 
   #tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
   rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm
   rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm
   rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm 
   rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm
   mkdir -p /usr/local/mysql/data && chown -R mysql.mysql /usr/local/mysql
   sed -i 's/datadir=/var/lib/mysql/datadir=/usr/local/mysql/data/' /etc/my.cnf
   sed -i '/datadir/i default_password_lifetime=0' /etc/my.cnf
   mysqld  --initialize --user=mysql --datadir=/usr/local/mysql/data
   mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
   dbPassword=`grep 'temporary password' /var/log/mysqld.log | awk '{print $11}'`
   mysqladmin -uroot -p$dbPassword password  $MYSQL_ROOT_PASSWORD
   host='127.0.0.1'
   dbUser='root'
   sql_file='/usr/local/bin/init.sql'
   mysql -h $host -u $dbUser -p$MYSQL_ROOT_PASSWORD -e "source $sql_file";
   echo "Remote connection is set"
   rm -rf /usr/local/src/mysql*
}
if [ `ls /usr/local/mysql/data |wc -l` -eq 0 ];then
   INIT_MYSQL
else
   mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
fi
tail -f /var/log/mysqld.log

3、编写init.sql,主要是开启root 远程连接,看需求可以不要

use mysql;
update user set host = '%' where user = 'root';
flush privileges;

4、编写dockerfile

需要将init.sql 、 localtime(为了和宿主机时间同步,可以不要,要的话,从宿主机拷贝过来即可)、mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar、start.sh放与dockerfile同一目录下

FROM  centos7.2
ADD mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar /usr/local/src
ADD localtime /etc/localtime
ADD start.sh /usr/local/bin
ADD init.sql /usr/local/bin
CMD ["/usr/local/bin/start.sh"]
centos7.2镜像也是自己制作的,可以自己制作系统基础镜像,也可以用网上的

5、制作镜像

docker build -t mysql5.7:v1  . 

6、运行

 docker run -it -e MYSQL_ROOT_PASSWORD=123456 -p 1112:3306  -d mysql5.7:v1

7、其他服务器连接测试

[root@test-02 ~]# mysql -uroot -h 172.16.210.132 -P 1112 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 4
Server version: 5.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> exit
Bye
[root@test-02 ~]# 

---------------------------------------------------------------------

上面制作的镜像,运行环境需要能联网才可以,因为要下载依赖包

如果镜像运行没有网,可以先在有网的环境制作好,再上传到无网环境运行

制作方法类似,只需更改dockerfile 和start.sh

dockerfile

FROM  centos7.2
ADD mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar /usr/local/src
ADD localtime /etc/localtime
ADD start.sh /usr/local/bin
ADD init.sql /usr/local/bin
RUN rpm --rebuilddb && yum install -y libaio  libnuma* net-tools perl.x86_64 
RUN cd /usr/local/src && rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm &&  rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm && rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm && rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm && rm -rf /usr/local/src/mysql*
CMD ["/usr/local/bin/start.sh"]

start.sh

#!/bin/bash
if [ -z "$MYSQL_ROOT_PASSWORD" ];then
 echo "MYSQL_ROOT_PASSWORD is empty"
 exit 0
fi
INIT_MYSQL(){
   echo "mysql初始化"
   mkdir -p /usr/local/mysql/data && chown -R mysql.mysql /usr/local/mysql
   sed -i 's/datadir=/var/lib/mysql/datadir=/usr/local/mysql/data/' /etc/my.cnf
   sed -i '/datadir/i default_password_lifetime=0' /etc/my.cnf
   mysqld  --initialize --user=mysql --datadir=/usr/local/mysql/data
   mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
   dbPassword=`grep 'temporary password' /var/log/mysqld.log | awk '{print $11}'`
   mysqladmin -uroot -p$dbPassword password  $MYSQL_ROOT_PASSWORD
   dbUser='root'
   sql_file='/usr/local/bin/init.sql'
   mysql -u $dbUser -p$MYSQL_ROOT_PASSWORD -e "source $sql_file";
   echo "Remote connection is set"
}
if [ `ls /usr/local/mysql/data |wc -l` -eq 0 ];then
   INIT_MYSQL
else
   mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
fi
tail -f /var/log/mysqld.log

------------------------------------------主从复制镜像--------------------------------------

前提:使用上面制作好的mysql5.7:latest镜像

创建目录

mkdir -p {master,slave}

1、master镜像制作

cd master/

制作my.cnf

[mysqld]
default_password_lifetime=0
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql,test
binlog_format=MIXED
slave_skip_errors=1062

制作dockerfile

FROM mysql5.7:latest
ADD my.cnf /etc/my.cnf

制作镜像

docker build -t mysql5.7:master .

2、slave镜像

cd slave

制作my.cnf

[mysqld]
default_password_lifetime=0
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=2
log-bin=mysql-bin
relay-log=relay-log
relay-log-index=relay-log.index
binlog-ignore-db=mysql,test
binlog_format=MIXED
slave_skip_errors=1062
## relay_log配置中继日志
log_slave_updates=1
read_only=1 #将slave从库设置为只读状态

dockerfile 

FROM mysql5.7:latest
ADD my.cnf /etc/my.cnf
docker build -t mysql5.7:slave .

3、启动

docker run -it -p 1111:3306 -e MYSQL_ROOT_PASSWORD=123456  -d -v /data/master:/usr/local/mysql/data mysql5.7:maste
docker run -it -p 2222:3306 -e MYSQL_ROOT_PASSWORD=123456  -d -v /data/slave:/usr/local/mysql/data mysql5.7:slave
原文地址:https://www.cnblogs.com/zphqq/p/13123910.html