1. 程式人生 > 實用技巧 >docker 製作自己的mysql映象

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