目录
docker挂载mysql
我们在vmware上的linux系统上安装启动mysql服务后,可以在本机windows系统上通过navicat远程访问,可以进行数据库表的增删改查,但是会存在一个问题
此时如果通过docker关闭mysql容器,就会导致数据丢失(可以理解为数据库中的提交事务,未提交事务会导致数据没保存成功 ),因此修改容器之后需要保存或者挂载mysql数据库
1.下载镜像
# 最新版本 docker pull mysql # 如 5.7 版本 本文基于5.7版本 docker pull mysql:5.7
2.启动mysql容器
# 运行mysql命名容器名称为mysql并且设置root账号初始密码为root docker run -p 3306:3306 --name mysql -e mysql_root_password="root" -d mysql:5.7
3.确定mysql配置文件路径
#进入docker容器,mysql为刚安装的容器名称 docker exec -it mysql或者mysql容器id /bin/bash # 查找docker内,mysql配置文件my.cnf的位置 mysql --help | grep my.cnf # 会输出数据文件的存放路径 /var/lib/mysql/ show variables like '�tadir%';
4.创建本地路径并挂载docker内数据
拷贝mysql容器配置文件
mkdir -p /usr/local/mysql/conf && mkdir -p /usr/local/mysql/data # 将容器的配置复制到服务器 docker cp mysql:/etc/mysql/* /usr/local/mysql/conf/ 或 docker cp mysql:/etc/mysql/. /usr/local/mysql/conf/ # 修改字符集 vim /usr/local/mysql/conf/my.cnf character-set-server=utf8
如果遇到如下错误:
/usr/bin/docker-current:error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/1b1d4a0234ee4caxxxxx/merged: invalid argument.
see '/usr/bin/docker-current run --help'.
这个是因为用的overlay2文件系统,而系统默认只能识别overlay文件系统,更新文件系统即可
systemctl stop docker //停掉docker服务 rm -rf /var/lib/docker //注意会清掉docker images的镜像 vim /etc/sysconfig/docker-storage //将文件里的overlay2改成overlay即可
如:docker_storage_options="--storage-driver overlay"
vim /etc/sysconfig/docker //去掉option后面的--selinux-enabled
然后启动docker即可:systemctl start docker
5.重新启动mysql容器
docker stop mysql docker rm mysql docker run --name mysql \ -p 3306:3306 \ -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/log:/logs \ -e mysql_root_password=admin123456 \ --restart=always \ -d mysql:5.7 docker run --name mysql -p 3306:3306 -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/log:/logs -e mysql_root_password=admin123456 --restart=always -d mysql
映射mysql数据文件后,删除或者停止mysql容器后能保留数据库文件,不至于导致数据库丢失
初识docker挂载mysql挂载备份
首先下载一个mysql:docker pull mysql
运行mysql容器,需要做数据挂载(挂载就是将mysql中的文件,挂载到linux中,下次修改mysql配置文件,就不需要进入mysql,也可以备份mysql的数据):##安装启动mysql,需要配置密码:
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e mysql_root_password=自己设置的密码 --name mysql01 mysql
-d
后台启动-p
端口映射,将3306映射到外部端口-v
卷挂载,将mysql内部文件同步到linux的文件中,做到备份-e
环境配置,这里配置的是mysql密码--name
容器名称
挂载方式有具名挂载和匿名挂载
#查看所有volume(卷挂载)的情况 :docker volume ls
#匿名挂载:-v 容器内路径
docker run -d -p --name mysql01 -v /etc/mysql mysql
(-p 随机映射端口)
#具名挂载:
docker run -d -p --name mysql02 -v juming-mysql:/etc/mysql mysql
(具名挂载名称:juming-mysql)
#通过 -v 卷名:容器内路径
#查看一下这个卷:
docker volume inspect juming-mysql
#所有的docker容器卷,在没有指定目录的情况下,都存储在 /var/lib/docker/volumes/xxx/_data
**如何确定是具名挂载还是匿名挂载,还是指定路径挂载!** -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载
拓展
#通过 -v 容器内路径:ro rw 改变读写权限 ro readonly #只读 rw readwrite #可读可写 #一旦设置了容器权限,容器对我们挂载出来的内容就有限定 docker run -d -p --name mysql02 -v juming-mysql:/etc/mysql:ro mysql docker run -d -p --name mysql02 -v juming-mysql:/etc/mysql:rw mysql #ro,只要看到ro就说明这个路径只能通过宿主机操作,容器内部是无法操作的!
在测试的时候发现,如果一个文件名,如juming-mysql挂载过一次,删除容器后,再使用这个名字时,会无法挂载上,原因是docker 里面的volumes缓存没有清除:
可以使用 docker --help 可以看到命令
再使用:docker system --help
这个就是docker清理volumes缓存的选项,输入docker system prune
确定时输入y,即可删除 挂载缓存
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。