本文共 3081 字,大约阅读时间需要 10 分钟。
话说,小哥接触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的文档。
如果docker 不能持久化数据,重新启动docker,那么写入mysql的数据就都丢失了?
我们采用命令, 重启虚拟机,发现写入的数据没有丢失。
docker stop mysql1docker 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:
- The data doesn’t persist when that container is no longer running, and it can be difficult to get the data out of the container if another process needs it.
- A container’s writable layer is tightly coupled to the host machine where the container is running. You can’t easily move the data somewhere else.
- Writing into a container’s writable layer requires a to manage the filesystem. The storage driver provides a union filesystem, using the Linux kernel. This extra abstraction reduces performance as compared to using data volumes, which write directly to the host filesystem.
docker 提供了三种数据持久化的方案
官网文章 给出了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 rm 卷名
。
如果挂载卷的docker被删除,其他镜像可以挂载这个卷。
一个卷没有任何的镜像挂载,那么它就成了无用的卷,命令docker volume prune
可以批量删除无用卷。
不能直接 -v
一个已经被其他docker挂载的volume,但是可以挂载docker,-volumes-from
命令。
在Mysql的Dockerfile,定义了匿名卷 VOLUME /var/lib/mysql
转载地址:http://gjdvl.baihongyu.com/