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