dockerfile源码安装mysql_通过Dockerfile安装Percona MySQL

通过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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值