docker中实现自定义mysql数据目录datadir并挂载
本文介绍使用dockerfile自建mysql镜像,同时实现将宿主机数据目录挂载到容器内。
文章目录
环境描述:
centos:7.6
mysql:5.7.29,yum安装
docker:19.03.6
基本需求:
根据项目要求,需要在一个docker镜像中包含mysql、nginx等,以及项目应用。
同时:
- 根据宿主机上的配置文件去配置mysql及nginx
- 根据宿主机上的sql脚本去初始化mysql的库表
- 将mysql的数据文件保存到宿主机
- 将mysql的错误日志文件保存到宿主机
主要思路:
- 写dockerfile构建一个环境镜像
mysql-env-image
,包含mysql、nginx等。 - 写dockerfile,基于环境镜像,添加项目应用程序包,构建项目应用镜像
mysql-project-image
. - 基于项目应用镜像,启动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
:挂载目录或文件。格式:宿主机路径
:容器内路径