怎么用docker中的mysql连接数据库(解决Docker之mysql容器数据库更改不生效的问题)
怎么用docker中的mysql连接数据库
解决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 ip地址分配(docker添加网桥并设置ip地址范围操作)
- docker容器连接宿主机(docker 实现容器与宿主机无缝调用shell命令)
- docker 重置容器的映射端口(运行中的docker容器端口映射如何修改详解)
- docker中的centos镜像为何很小(CentOS 7.x docker使用overlay2存储方式)
- docker推荐单个容器运行(docker容器状态的转换实现)
- docker安装教程图解(Docker在线、离线安装及其常用命令操作)
- docker容器默认内存大小(Docker 修改docker存储位置 修改容器镜像大小限制操作)
- docker容器的使用过程(详解docker容器的层的概念)
- docker 增大mysql连接数(docker中修改mysql最大连接数及配置文件的实现)
- docker容器运行环境(Docker 清理环境操作)
- docker 限制cpu使用率(docker CPU限制的实现)
- docker常用命令详解(docker常用命令总结推荐)
- docker测试环境搭建(docker环境搭建JMeter+Grafana+influxdb可视化性能监控平台的教程)
- docker离线安装步骤(Docker安装FastDFS的方法步骤)
- docker的安装部署(Docker快速安装Zookeeper的详细教程)
- centosdocker镜像安装mysql(linux下利用Docker安装mysql的步骤)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
- 小敏家 剧情离谱一锅乱炖,但他们俩绝对是这部剧的一大 亮点(剧情离谱一锅乱炖)
- 《倚天屠龙记》再遭翻拍,关晓彤主演赵敏,蒋劲夫演张无忌,你怎么看(倚天屠龙记再遭翻拍)
- 吴启华与曾舜晞两代张无忌同框,戏里经典的他却没活出原著的潇洒(吴启华与曾舜晞两代张无忌同框)
- 经常发这三种 朋友圈 的人,要迅速屏蔽(经常发这三种朋友圈)
- 有种尴尬叫朋友圈忘屏蔽,大学生上演社死现场,父母亲自下场吐槽(有种尴尬叫朋友圈忘屏蔽)
热门推荐
- 使用docker对集群进行管理(使用docker搭建kong集群操作)
- css文字竖排代码(纯 CSS 实现多行文字截断功能)
- pythonjson格式化原理(详解pythonstr与json类型转换)
- phpstudy安装后在哪里开启(phpstudy怎么卸载?如何彻底删除phpstudy)
- canvas小程序海报(使用canvas生成含有微信头像的邀请海报没有微信头像问题)
- js的逻辑关系和思路(js Proxy的原理详解)
- dedecms中的有些功能如何修改(Dedecms 生成速度慢 的解决办法)
- docker容器基础入门认知网络篇(Docker 容器生命周期 架构 以及和VM之间的差异详解)
- css长度单位有哪些(聊一聊CSS中的长度单位的使用)
- dedecms移动端如何设置(dedecms删除系统自定义变量的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9