问题:建立表并存有数据的mysql 容器通过docker commit的方式生成的镜像,然后利用镜像创建容器,能正常连接,但里面没有之前的数据
解释:mysql数据库中的数据默认是存放在/var/lib/mysql目录下的,而mysql容器通常是将容器内的/var/lib/mysql作为volume挂载,当你使用commit命令把容器打包成镜像时,commit操作并不会包含容器内挂载的volume中的数据变化,所以会发现数据都不在了。
解决方案:
以mysql8为例
mysql镜像的数据默认都在/var/lib/mysql目录下,我们修改默认的数据库的数据位置就行,不要放在/var/lib/mysql下面
在根目录下创建data/mysql目录
mkdir -p /data/mysql
然后复制/var/lib/mysql下的数据到/data/mysql下
cp -r /var/lib/mysql /data/mysql
修改数据库配置文件,文件路径在/etc/my.cnf (docker 容器中没有vi命令,可以使用docker cp 命令复制到宿主机)
vim my.cnf
修改 [mysqld]
下的datadir目录
将数据修改为刚才创建的目录
datadir = /data/mysql/mysql
重启容器,然后导入数据,然后将容器打包成镜像,然后再启动镜像,发现镜像中的数据有我们之前导入的数据。