通过Dockerfile安装基于centos7.3的percona mysql,已通过测试,若有任何疑问,欢迎留言。
安装环境:宿主机:CentOS Linux release 7.3.1611
docker:17.06.0-ce
docker-centos:centos7.3
docker-mysql:percona server 5.7.19
docker-mysql安装包目录tree
.
├── conf
│ ├── docker-mysql.conf --配置MySQL启动后的一些用户初始化
│ └── my.cnf --MySQL配置文件
├── Dockerfile --Dockerfile
├── mysqlsetup.sh --容器启动时执行的shell。初始化MySQL并拉起服务
├── pkg --Percona 安装包
│ └── Percona-Server-5.7.19-17-Linux.x86_64.ssl101.tar.gz
└── rpm --MySQL依赖包,基于centos7.3环境
├── libaio-0.3.109-13.el7.x86_64.rpm
└── numactl-libs-2.0.9-7.el7.x86_64.rpm
3 directories, 7 files
Dockerfile:#基于centos7操作系统
FROM centos7
MAINTAINER 18044094
#拷贝压缩
ADD pkg/Percona-Server-5.7.19-17-Linux.x86_64.ssl101.tar.gz /usr/local
#创建用户组和用户
RUN groupadd mysql;useradd mysql -g mysql
#创建配置文件目录
RUN mkdir -p /home/mysql/etc/
#创建安装临时目录
RUN mkdir -p /usr/local/mysqlinstall
#设置软连接
RUN ln -s /usr/local/Percona-Server-5.7.19-17-Linux.x86_64.ssl101 /usr/local/mysql
#拷贝安装所需文件至容器目录
COPY conf/my.cnf /home/mysql/etc/
COPY rpm/*.rpm /usr/local/mysqlinstall/
COPY mysqlsetup.sh /usr/local/mysqlinstall/
COPY conf/docker-mysql.conf /usr/local/mysqlinstall/
#设置环境变量
ENV PATH /usr/local/mysql/bin:$PATH
ENV LD_LIBRARY_PATH=/usr/local/mysql/lib
RUN echo "export PATH=/usr/local/mysql/bin:$PATH" >> /home/mysql/.bash_profile
RUN echo "export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH" >> /home/mysql/.bash_profile
RUN source /home/mysql/.bash_profile
#设置用户限制
RUN echo "mysql hard nofile 65535" >> /etc/security/limits.conf
RUN echo "mysql soft nofile 65535" >> /etc/security/limits.conf
#切换当前目录
WORKDIR /usr/local/mysqlinstall
#安装依赖包
RUN yum -y install *.rpm
#设置启动脚本权限
RUN chmod +x mysqlsetup.sh
#设置挂载点,并将其标记为可供外部挂载的卷
VOLUME ["/mysql","/binlog"]
#设置开放端口
EXPOSE 3306
EXPOSE 22
EXPOSE 3000
#容器启动时运行的脚本
CMD ["./mysqlsetup.sh"]
docker-mysql.conf#DOCKER-MYSQL
MYSQL_NEW_PASSWORD=123456
ADMIN_USER=sndsadmin
ADMIN_PASSWORD=SuningRds@123
REPL_USER=repl
REPL_PASSWORD=123456
mysqlsetup.sh#!/bin/bash
#定义固定参数
DATADIR=/mysql
BINLOGDIR=/binlog/
BASEDIR=/usr/local/mysql
MYCNF=/home/mysql/etc/my.cnf
CURR_DIR=$(cd "$(dirname $0)"; pwd)
CONFIG_FILE=$CURR_DIR/docker-mysql.conf
DATATIME=0
BINLOGTIME=0
MYCOUNT=0
#加载配置文件中的参数
while read line;do
eval "$line"
done
MYSQL_NEW_PASSWORD=$MYSQL_NEW_PASSWORD
ADMIN_USER=$ADMIN_USER
ADMIN_PASSWORD=$ADMIN_PASSWORD
REPL_USER=$REPL_USER
REPL_PASSWORD=$REPL_PASSWORD
#首次启动容器创建数据目录
if [ "`ls -A $DATADIR`" = "" ]; then
echo "mkdir DATADIR..."
mkdir -p $DATADIR/data/_tmp
chown -R mysql.mysql /mysql
DATATIME=1
fi
#首次启动容器创建binlog目录
if [ "`ls -A $BINLOGDIR`" = "" ]; then
echo "mkdir BINLOGDIR..."
mkdir -p $BINLOGDIR
chown mysql.mysql $BINLOGDIR
ln -s $BINLOGDIR /mysql/binlog
BINLOGTIME=1
fi
echo "DATATIME is $DATATIME"
echo "BINLOGTIME is $BINLOGTIME"
#首次启动容器初始化数据库
if [ $DATATIME -eq 1 ] && [ $BINLOGTIME -eq 1 ];then
echo "start initialize..."
cd $BASEDIR
bin/mysqld --defaults-file=$MYCNF --initialize --user=mysql
echo "start mysqld service..."
bin/mysqld_safe --defaults-file=$MYCNF &
sleep 10
else
echo "no need to initialize"
fi
#判断mysqld服务不存在则启动服务,存在则跳过
#MYCOUNT=`ps -ef |grep -c mysqld`
MYCOUNT=`ps -ef |grep mysqld |grep -v grep|wc -l`
echo "MYCOUNT is $MYCOUNT"
if [ $MYCOUNT -eq 0 ];then
cd $BASEDIR
echo "start mysqld service..."
if [ -f "$DATADIR/data/mysql.sock.lock" ];then
rm -rf $DATADIR/data/mysql.sock.lock
fi
bin/mysqld_safe --defaults-file=$MYCNF &
#使不退出容器
tail -f /dev/null
fi
if [ $MYCOUNT -eq 2 ];then
echo "mysqld service is running"
fi
#首次启动容器且Mysqld服务已启动,则初始化数据库用户,密码
if [ $DATATIME -eq 1 ] && [ $BINLOGTIME -eq 1 ] && [ $MYCOUNT -eq 2 ];then
echo "start initialize users and password..."
#获取临时密码
tmp_password="$(cat $DATADIR/data/mysql_error.log |grep 'root@localhost:' |awk -F ' ' '{print $11}')"
#修改临时密码
mysql -uroot -p$tmp_password -hlocalhost -S $DATADIR/data/mysql.sock --connect-expired-password <
alter user root@'localhost' identified by '$MYSQL_NEW_PASSWORD';
flush privileges;
EOF
#创建admin用户
mysql -uroot -p$MYSQL_NEW_PASSWORD -hlocalhost -S $DATADIR/data/mysql.sock <
create user $ADMIN_USER@'%' identified by '$ADMIN_PASSWORD';
grant all on *.* to $ADMIN_USER@'%';
EOF
#创建复制用户
mysql -uroot -p$MYSQL_NEW_PASSWORD -hlocalhost -S $DATADIR/data/mysql.sock <
create user $REPL_USER@'%' identified by '$REPL_PASSWORD';
grant replication slave,super,process,reload on *.* to $REPL_USER@'%';
EOF
#使不退出容器
tail -f /dev/null
fi
安装步骤:
编译dockerfile生成image:docker image build -t mysql .
创建容器网络:(不创建网络也可以,每次重启容器ip会变)docker network create -d bridge --subnet=172.18.0.0/16 mynetwork
docker network ls
创建并在后台运行容器:docker container run -d -p 3310:3306 -p 24:22 --network=mynetwork --ip=172.18.0.3 --hostname mysql1 -v /mysql/dkdata/:/mysql/ -v /binlog/dklog/:/binlog --name mysql1 mysql
查看容器启动日志:docker logs [contained_id] -f
进入容器:docker exec -it [container_id] /bin/bash
远程连接:mysql -uroot -pxxxxxx -h宿主机ip -P3310
配置主从结构:
再创建一个容器:docker container run -d -p 3312:3306 -p 26:22 --network=mynetwork --ip=172.18.0.4 --hostname mysql2 -v /mysql/test/:/mysql/ -v /binlog/testlog/:/binlog --name mysql2 mysql
进入容器:docker exec -it [container_id] /bin/bash
修改my.cnf1.master节点将rpl_semi_sync_slave_enabled置为0
2.slave节点将rpl_semi_sync_master_enabled置为0,read_only置为1,super_read_only置为1。
3.将两节点的server_id置为不同的值。
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_wait_no_slave = 1
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = 1
read_only=1
super_read_only=1
rpl_semi_sync_master_wait_for_slave_count = 1
rpl_semi_sync_master_wait_point = AFTER_SYNC
退出并重启容器exit
docker stop [container_id]
docket start [container_id]
进入slave节点:docker exec -it [container_id] /bin/bash
mysql -uroot -p123456 -hlocalhost -S /mysql/data/mysql.sock
change master to master_host='master_ip',master_user='repl',master_password='123456',master_port=3306,master_auto_position=1;
start slave;