4.3基于dockerfile文件添加MySQL服务

step 1 配置centos8 yum

wgethttps://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

step 2 创建容器自启动脚本

vim mysql_entrypoint.sh     #容器启动的时候自动运行些脚本,对mysql做一些必要的配置

#!/bin/bash

chown -R mysql:mysql /var/lib/mysql/   #将mysql数据目录的所有权属性配置为mysql用户

                                       mysql用户是在安装mysql的时候自动创建的。

 chown mysql:mysql /usr/sbin/mysqld    #将mysql的启动文件的所有权属性配置为mysql用户

echo user=mysql>> /etc/my.cnf.d/mysql-server.cnf #在 mysql的配置文件中加入一行“user=mysql”,表示使用mysql这个用户,来启动mysql服务

 mysqld –initialize                   #初始化mysql系统

 mysqld –D                           #在后台启动mysqld服务

MYPASSWORDTEMP=`tail /var/log/mysql/mysqld.log | grep password |awk '{print $NF}'`

#mysqld 8在初始化的时候,会在/var/log/mysql/mysqld.log这个文件中生成一个临时密码,这条命令的作用是将这个临时密码取出来,并将其赋予MYPASSWODTEMP这个变量

mysql -u root -p$MYPASSWORDTEMP -e "alter user user( ) identified by '$MYPASSWORDNEW';" --connect-expired-password

#使用临时密码来更改mysql的root用户密码,新密码使用MYPASSWORDNEW这个变量,这个变量的值,在启动容器的时候通过docker run –e 这个命令带进来

mysql -u root -p$MYPASSWORDNEW -e "update mysql.user set host='%' where user='root'"

#将mysql的root用户的host值改为‘%’,代表可以从何意主机连进来。

mysql -u root -p$MYPASSWORDNEW -e "flush privileges;"

#刷新数据库,让配置的内容立即生效。

step3 创建dockfile文件

vim dockerfile_mysql

FROM centos:latest              #指定基础镜像文件

LABEL auto build mysql           #自定义标签信息

EXPOSE 3306                   #描述端口信息

COPY ./Centos-vault-8.5.2111.repo /root/Centos-vault-8.5.2111.repo   #将yum源文件拷贝到容器

COPY ./mysql_entrypoint.sh /mysql_entrypoint.sh                  #将启动脚本拷贝到容器

RUN chmod 755 /mysql_entrypoint.sh \                          #将启动脚本配置为可执行

&& ln -s /mysql_entrypoint.sh /usr/bin/mysql_entrypoint.sh \    #创建启动脚本软件软链接

&& rm -rf /etc/yum.repos.d/* \                             #清除容器内原有的yum源文件

&& mv /root/Centos-vault-8.5.2111.repo /etc/yum.repos.d/ \     #将yum源文件拷贝到yum目录

&& yum makecache                                      #创建yum缓存

RUN yum install mysql mysql-server -y \                          #安装mysql

&& rm -rf /var/cache/yum/*                               #清除yum缓存文件

CMD mysql_entrypoint.sh;sleep infinity    #配置容器自启动脚本为mysql_entrypoint.sh(就是上一步我们创建的那个脚本文件;sleep infinity这个命令的作用是让启动脚本执行完以后,不要中止,常驻内存。

step 4创建镜像

通过dockerfile-mysql这个dockerfile,创建一个名为mysql:1.0的镜像。

docker build -t mysql:1.0  -f ./dockerfile-mysql .    #注意最后面那个“.”,代表当前目录

 

step 5 启动容器

先在宿主机上创建一个mysql的数据目录。(容器中只跑应用,数据目录直接挂载宿主机中的目录)

mkdir mysqldata

启动容器

docker run -d --name=mysql --hostname=mysql -v /root/dockerlab/mysqldata:/var/lib/mysql -e MYPASSWORDNEW='xxxxxxxx' –p 3306:3306 mysql:1.0

命令注解:

-d :让容器在后台运行

--name=mysql 容器命名为mysql

--hostname=容器的主机名为mysql

-v /root/dockerlab/mysqldata:/var/lib/mysql将宿主机的/root/dockerlab/mysqldata这个目录挂载到容器的/var/lib/mysql目录(此目录为mysql 默认的数据目录)

-e MYPASSWORDNEW='xxxxxxxxx'MYPASSWORDNEW带入到容器中,它的值就是设置容器中mysql系统的root密码)

-p 3306:3306 将宿主机的3306端口映射到容器的3306端口(3306mysql的默认服务端口)

step6 测试容器中mysql是否启动成功

使用mysql连接工具去连接宿主机的3306端口

 

 

发现是可以连接的。

这样就说明我们的mysql已经成功在容器中运行起来了。

查看一下宿主机的mysqldata目录:

 

里面已经有数据了,这些数据就是容器中的mysql产生的数据库文件。

step 7 模拟容器崩溃后的数据恢复

由于容器中只跑了mysql的应用,mysql的数据目录其实是在宿主机的,所以就算容器崩溃了,数据目录其实还是存在的,也很容易恢复。

1)使用mysql工具,在数据库中创建一个新的数据库,命名为test

 

2)我们先把刚创建的容器删掉;

 

3)看一下宿主机中的 mysql数据目录

 

虽然容器已被删除,但其实数据文件都还在,上图红框内的就是我们刚刚新创建的那个数据库test.

4)重新创建并启动容器

docker run -d --name=mysql --hostname=mysql -v /root/dockerlab/mysqldata:/var/lib/mysql -e MYPASSWORDNEW='xxxxxxxx' –p 3306:3306 mysql:1.0

5)再次用mysql连接工具,验证数据

 

这里我们发现,我们之前新建的那个test数据库,还是存在的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐