目录
一、第一次启动mysql容器的命令
docker run --name mysql --privileged=true --restart=always -d \
-p 3306:3306 \
-v /root/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf \
-v /root/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD="123456" mysql:5.7
这个命令的-v 使用的就是数据卷的知识。-v 宿主机目录:容器目录,来达到宿主机和容器之间数据和配置文件的同步修改、增加、删除的同步;
至于容器中的配置文件和数据目录在哪个目录,需要参考官网提供的参考命令:mysql镜像
二、数据卷的理解及使用
1、数据卷理解
(1)将宿主机中的某个目录映射到容器中的某个目录,在容器中对此映射目录的修改,即便容器关闭、删除,宿主机上映射目录的数据也会保留下来,可以供宿主机和其他容器访问。
(2)容器内新建、删除、修改文件,宿主机外部挂载的目录同步新建、删除、修改;容器删除,宿主机外部挂载的目录不会同步删除目录及里面的文件;
(3)由于容器中有时候会遇到没有vim、vi、ll等Linux命令,而又要修改容器的某个配置文件,使用容器下载安装这些命令有比较麻烦,故将容器目录挂载到宿主机,直接在宿主机修改,使其自动同步到容器即可;
(4)数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用;
- 对数据卷的修改会立马生效;
- 对数据卷的更新,不会影响镜像;
- 卷会一直存在,直到没有容器使用;
2、数据卷的使用-mysql
在开头mysql容器运行的前提下,分别进入宿主机的/root/docker/mysql/data目录下和mysql容器的/var/lib/mysql目录下:
以上宿主机目录和容器目录数据完全一样;
现在在容器目录新增一个文件test.txt,观察宿主目录变化:
容器向test.txt追加“wwww”,观察宿主机的变化:
root@564e72c5f688:/var/lib/mysql# echo "wwww" >> test.txt
[root@docker data]# cat test.txt
wwww
容器删除test.txt,观察宿主机的变化:
宿主机增加test01.txt,观察容器变化:
宿主机向test01.txt追加数据,观察容器的变化:
删除容器,观察宿主机目录的变化:
三、数据卷的挂载
数据卷的挂载包括:匿名挂载,具名挂载 ,指定路径挂载;
1、匿名挂载
使用 -v 参数的时候,仅仅指定容器内部挂载路径,不指定外部挂载的卷;
# -v 后 未指定宿主机路径以及挂载名
docker run -d -v /data redis:5.0
2、具名挂载
容器与宿主机进行挂载的时候指定一个名字;
#-v 参数后 指点挂载的卷名:/容器内路径
docker run -d -v path01:/data --name jmgz redis:5.0
查看卷所在宿主机位置:
docker volume inspect 卷名
如果未指定目录,都会挂载到默认目录/var/lib/docker/volumes/下;
3、指定路径挂载
在挂载的时候,宿主机目录和容器目录都要写;开头启动mysql容器就是使用的指定路径挂载;
四、容器间数据共享-mysql
容器之间数据共享,使用数据卷挂载命令:--volumes-from 要挂载容器ID,但是必须一个容器启动,不能共同启动使用。
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
在mysql01新建一个mytest库,然后将mysql01容器停止,启动mysql02容器,里面也会有一个mytest库;