docker中实现自定义mysql数据目录datadir并挂载

docker中实现自定义mysql数据目录datadir并挂载

本文介绍使用dockerfile自建mysql镜像,同时实现将宿主机数据目录挂载到容器内。

环境描述:

centos:7.6
mysql:5.7.29,yum安装
docker:19.03.6

基本需求:

根据项目要求,需要在一个docker镜像中包含mysql、nginx等,以及项目应用。
同时:

  1. 根据宿主机上的配置文件去配置mysql及nginx
  2. 根据宿主机上的sql脚本去初始化mysql的库表
  3. 将mysql的数据文件保存到宿主机
  4. 将mysql的错误日志文件保存到宿主机

主要思路:

  1. 写dockerfile构建一个环境镜像mysql-env-image ,包含mysql、nginx等。
  2. 写dockerfile,基于环境镜像,添加项目应用程序包,构建项目应用镜像mysql-project-image.
  3. 基于项目应用镜像,启动docker容器时挂载宿主机文件或路径。

实现挂载mysql数据目录的思路:

1、启停MYSQL

在构建环境镜像的dockerfile中,RUN命令安装mysql完成后执行shell脚本:先启动mysql,再停止mysql。这样数据文件会被存放于默认路径/var/lib/mysql/
注意:停止mysql的命令需要用到root密码,按照5.7的要求必须先修改root的默认密码。

dockerfile:

RUN  ... \
    && yum install mysql-community --nogpgcheck  \
    && mysqld --initialize --explicit_defaults_for_timestamp --user=mysql  \
    && bash /opt/mysql/mysql_init.sh \
    ...

mysql_init.sh:

############## start MYSQL ...
mysqld --user=mysql & 
############## change MYSQL root temp password ...
PASSWORD=$(awk '/password/{print $NF}' /var/log/mysqld.log)
echo "change root password..."
mysql --connect-expired-password -uroot -p"$PASSWORD" << EOF
alter user 'root'@'localhost' identified by '$INIT_ROOT_PASSWORD';
grant all on *.* to root@'%' identified by '$INIT_ROOT_PASSWORD';
EOF
############## MYSQL shutdown... 
mysqladmin -uroot -p$INIT_ROOT_PASSWORD shutdown
2、创建挂载点

在构建项目应用镜像的dockerfile中,创建等待挂载的目录,修改所属为mysql:mysql

dockerfile:

RUN mkdir -p /data/mysql_conf  \
    mkdir -p /data/mysql/  \
    ...
ENTRYPOINT ["/opt/bootstrap.sh"]

bootstrap.sh:

mkdir -p /data/mysql/{data,log,tmp}
chown -R mysql:mysql /data/mysql
3、创建软连接替换配置文件

使用新的配置文件/data/mysql_conf/my.cnf,并创建链接,替换原有配置文件/etc/my.cnf

bootstrap.sh:

mv /etc/my.cnf /etc/my.cnf.old
ln -s /data/mysql_conf/my.cnf /etc/my.cnf
4、修改配置文件,指定数据目录

mysql的数据目录由配置文件my.cnf中的datadir参数指定。
修改配置文件,指定数据存放路径datadir=/data/mysql/data(这一步,可以根据项目需要事先修改好,在启动容器时通过挂载,覆盖容器中的配置文件)。

mysql.mount.cnf(宿主机中事先准备好的mysql配置文件):

#datadir=/var/lib/mysql
datadir=/data/mysql/data
5、复制数据文件

将原有数据目录下的全部文件复制到新数据目录下。

bootstrap.sh:

cp -rf /var/lib/mysql/* /data/mysql/data/
chown -R mysql:mysql /data/mysql
6、启动mysql

启动mysql,新的配置文件生效,新数据目录被使用。

bootstrap.sh:

mysqld --user=mysql & 
7、容器启动及挂载

容器启动命令中通过-v参数进行挂载。

注意:挂载后shell脚本会将mysql原有数据目录下的所有文件复制过来。所以挂载前,一定要先清空宿主机挂载路径下的全部内容。

rm -rf /xxxx/mount/mysql/{data,log,tmp}/*
docker run -v /tmp/:/tmp   \
  -v /xxxx/mount/mysql_conf/mysql.mount.cnf:/data/mysql_conf/my.cnf \
  -v /xxxx/mount/mysql/:/data/mysql  \
  ...

-v:挂载目录或文件。格式:宿主机路径:容器内路径

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jason9211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值