话说,小哥接触Mysql也有几年了,但总是感觉Mysql有很多神秘的特性,一直也不太敢折腾这家伙。昨天准备动动手,可安装过程就花了2天时间。 期间,错误的以为必须要给mysql server挂载本地目录,对数据进行持久化。最终,还是看了docker文档才搞清楚Docker Volume的使用方法。
先讲案例
docker pull mysql/mysql-server:8.0
## 8.0 可以设为7.0 5.6 5.5
docker run --name=mysql1 -d mysql/mysql-server:8.0
docker ps
docker logs mysql1 2>&1 | grep GENERATED
回显,GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs
docker exec -it mysql1 mysql -uroot -p
输入 4步获得的密码。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
完成以上6步,就可以得到一个mysql虚拟机,你可以通过docker exec -it mysql1 mysql -uroot -p
连接到虚拟机内部。
以上步骤,来源于docker hub上mysql server的文档。 https://hub.docker.com/r/mysql/mysql-server/
如果docker 不能持久化数据,重新启动docker,那么写入mysql的数据就都丢失了?
我们采用命令, 重启虚拟机,发现写入的数据没有丢失。
docker stop mysql1
docker start mysql1
在docker 官方文档上,介绍了docker存储原理。docker的一种重要特性,就是分层存储,这个在编译、传输docker时都带来很大优势。
运行的docker容器也是分层的,“writeable container layer”可写层位于docker容器的最顶端,这个层的特点就是不能持久化。
docker运行过程中的写操作都保存在“writeable layer”上,但当容器停止时,这些数据是没有保存,下一次启动docker,就好像启动一块有还原卡的主机,之前操作都没有保存下来。
By default all files created inside a container are stored on a writable container layer. This means that:
volume
docker 提供了三种数据持久化的方案
官网文章 https://docs.docker.com/storage/#good-use-cases-for-volumes 给出了Good use cases for (volume;bind mount;tmpfs)。
官网的图片就可以说明三中类型区别:
docker run -v $PWD/html:/usr/share/nginx/html -d nginx
使用非匿名Volume,首先要创建一个,
docker volume create mydataVolume
挂载Volume,也是-v volume名字:docker路径
docker run --name=nginx -v mydataVolume:/usr/share/nginx/html -d nginx
匿名Volumn,在docker run的时候,创建一个volume并和镜像路径和绑定。
docker run --name=nginx -v /usr/share/nginx/html -d nginx
查看所有的Volume,每次创建新的容器,都会创建新的Volume。注,docker run创建新容器,docker stop可以运行已经停止的容器。
docker volume ls
下图,019 734等都是匿名卷,而wangsen是非匿名卷。
docker volume list
如果镜像被删除了,匿名卷是不会被删除的,调用docker volume rm 卷名
。
如果挂载卷的docker被删除,其他镜像可以挂载这个卷。
一个卷没有任何的镜像挂载,那么它就成了无用的卷,命令docker volume prune
可以批量删除无用卷。
不能直接 -v
一个已经被其他docker挂载的volume,但是可以挂载docker,-volumes-from
命令。
在Mysql的Dockerfile,定义了匿名卷 VOLUME /var/lib/mysql
dockfile
此外docker mysql/mysql-server官方文档关于持久化主题https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker-persisting-data-configuration