解决Docker之mysql容器数据库更改不生效的问题

 更新时间:2020年11月20日 14:43:25   作者:大树168  
这篇文章主要介绍了解决Docker之mysql容器数据库更改不生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

用官方的mysql 镜像需要修改一些内容,比如配置文件的修改,DB数据文件的目录等,更改之后如果重新运行容器,改过的文件就无效了,新生成的容器不会有之前改变的内容

第一种是修改官方下载的镜像,修改之后 提交一个新的镜像文件 docker commit -m 等新生成的镜像信息,

第二种MYSQL的DB数据,容器关闭后 如果用 docker restart 重启同一容器,那么数据是正常的,如果重新docker run 容器那么数据就不会显示,因为每个容器都有一个文件地址

这就需要把数据文件挂载出来,供其它容器读取,

在docker中启动mysql容器,在mysql容器中对数据库的更改(如创建数据库,更改数据等),在commit后再次进入容器发现之前的更改全部没有保存

1.后台运行mysql容器,设置容器名称为mysql:

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql

f80791a0daf194fdba94f16a9d89ebec8ba8fbd8af28d3ea8b599b9d705f85ba

2.进入容器bash和mysql,创建一个数据库TEST_DB,并验证TEST_DB创建成功:

[root@localhost ~]# docker exec -it mysql bash root@f80791a0daf1:/# mysql -uroot -p 
show databases; 
create database TEST_DB;

3.退出容器,并commit更改到镜像: 这个数据其实是在宿主机上修改,不是mysql镜像的东西。所以不生效

mysql> exit
Bye
root@f80791a0daf1:/# exit
exit
[root@localhost ~]# docker commit mysql owenchen1992/mysql

4.重新启动容器并进入bash和mysql,发现之前创建的TEST_DB不见了,说明之前的更改无效:

[root@localhost ~]# docker container stop mysql
mysql
[root@localhost ~]# docker container rm mysql 
mysql
[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql
a1a1b4174caaadda0ec4b01b9fe5f92d6b3464d85284042274f71aebde0915dd
[root@localhost ~]# docker exec -it mysql bash
root@a1a1b4174caa:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20 MySQL Community Server (GPL)
 
mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql    |
| performance_schema |
| sys    |
+--------------------+
4 rows in set (0.00 sec)

问题原因:

在mysql的Dockerfile中有这样一行:

VOLUME /var/lib/mysql

这意味在容器中的目录/var/lib/mysql的所有修改会对应到宿主机的某个位置,可以通过命令查看具体对应的宿主机目录:docker inspect containerID/name. 当运行docker commit时,容器中的/var/lib/mysql目录的更改并不会提交到镜像中,但这些更改是随时与宿主机对应的目录同步的。

当重新启动commit后的镜像时,container会重新在宿主机中创建一个目录来保存其数据更新,因此并不是原先的宿主机目录,所以新开启的容器看不到之前的数据更改。

解决方法:

我们已经知道了问题发生的原因,就不难解决这个问题了,步骤如下:

可以直接去这个目录下查看为每个容器生成的数据目录

1.找到mysql容器对应的宿主机目录"/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data":

[root@localhost ~]# docker inspect mysql
[
......
    "Source": "/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data",
    "Destination": "/var/lib/mysql",
......
]

把之前的创建容器运行的步骤再执行一步,运行新的容器,然后建一张TEST表,先关闭容器后删除容器服务

4.后台运行容器新的容器,并将宿主机对应的目录挂载到容器的/var/lib/mysql目录下并开启读写权限(关键步骤):

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -v /var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data:/var/lib/mysql:rw -d owenchen1992/mysql

5.此时进入新开启的容器,并查看数据库:发现刚才创建的数据库TEST_DB没有因为重新运行容器而消失,问题解决

步骤是,1 新建一张表,2 关掉建表的容器,3重新运行容器,并且挂载数据目录到/var/lib/mysql下,问题就解决了!

补充知识:docker环境下使用mysql出现编码格式问题修改编码格式的方法

方法一(适用于单机器修改)

首先确定mysql服务处于开始状态

键入docker exec -it +服务名 /bin/bash 进入控制台

键入apt-get update 命令

键入apt-get install vim (上述两条命令用于下载vim编辑器),

输入vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令 进入mysqld.cnf文件

4.使用i打开编辑模式,在文本的最后输入以下内容:

注意:下面的内容一定不能输错,否则会造成配置文件失效

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8

ESC退出,shift+冒号wq保存 退出。

5.进入mysql控制台

6.输入show variables like ‘char%'; 即可查看到修改后的相应信息

修改完毕重启数据库后:输入show variables like"char%"即可

出现上述结果说明已经修改成功

方法二(适用于集群搭建)

将配置文件拷贝出原目录,使用外部文件修改,此方法用于发送文件到多台服务器进行数据库默认编码修改

docker exec -it +服务名 /bin/bash 进入控制台

输入cd /etc/mysql/conf.d/ 进入配置文件目录

输入pwd获取文件绝对路径

输入cd回退到控制台,exit退出

输入docker cp 服务名:/etc/mysql/conf.d/mysql.cnf /usr/soft ( 将docker中的mysql.cnf文件拷贝到linux下的soft文件夹中)

开启外部编辑器(如notepad++)进行配置文件书写 如下:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci'
init_connect=‘SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

PS:注意配置文件的内容要有间隔,这一点很重要

保存好

7.docker cp /usr/soft/mysql.cnf 服务名:/etc/mysql/conf.d/ 将修改后的文件拷贝到原来的目录下覆盖

8.重启docker中的mysql服务,然后

9.输入 show variables like ‘char%';命令即可查看已经修改好的字符编码格式

以上这篇解决Docker之mysql容器数据库更改不生效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker工作模式及原理详解

    Docker工作模式及原理详解

    Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!DockerServer接受到DockerClient的指令,就会执行这个命令
    2021-09-09
  • Docker安装Nacos详细图文教程

    Docker安装Nacos详细图文教程

    这篇文章主要为大家详细介绍了Docker安装Nacos详细图文教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 在Ubuntu中安装Docker教程

    在Ubuntu中安装Docker教程

    这篇文章主要介绍了在Ubuntu中安装Docker教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Docker中搭建配置Git环境的过程

    Docker中搭建配置Git环境的过程

    工作中遇到了需要在Docker环境中操作GitLab仓库的场景,需要事先在Docker中搭好Git环境,但是很多朋友不是很清楚Docker配置Git环境的过程,今天通过本文给大家详细介绍下,需要的朋友参考下吧
    2021-08-08
  • Docker容器数据卷的基本操作

    Docker容器数据卷的基本操作

    为了能保存数据在docker中我们使用卷,本文主要介绍了Docker容器数据卷的基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 详解Docker容器运行多条命令(supervisor)

    详解Docker容器运行多条命令(supervisor)

    本篇文章主要介绍了详解Docker容器运行多条命令(supervisor),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • deepin apt命令安装最新版本的docker的方法

    deepin apt命令安装最新版本的docker的方法

    这篇文章主要介绍了deepin apt命令安装最新版本的docker的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 对已有的docker容器增加新的端口映射问题(两种方式)

    对已有的docker容器增加新的端口映射问题(两种方式)

    这篇文章主要介绍了对已有的docker容器增加新的端口映射,在运行容器时指定映射端口运行后,如果想要添加新的端口映射,使用两种方式都可以,需要的朋友可以参考下
    2022-01-01
  • Docker 容器监控原理及 cAdvisor的安装与使用说明

    Docker 容器监控原理及 cAdvisor的安装与使用说明

    这篇文章主要介绍了Docker 容器监控原理及 cAdvisor的安装与使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Docker常用命令总结大全(推荐!)

    Docker常用命令总结大全(推荐!)

    Dokcer里面有很多命令,全部的可以参考官方Reference文档,命令太多我们只需要掌握部分命令即可,这篇文章主要给大家介绍了关于Docker常用命令总结大全的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论