什么是容器数据卷?
数据?如果数据都在容器中,那么我们容器一删除,数据就会丢失。需求:数据可以持久化。
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。
总结一句话:容器的持久化和同步操作。
使用数据卷
- 使用命令挂载
docker run -it -v [主机目录]:[容器目录] [镜像] [命令]#一个例子docker run -it -v /home/test:/volume centos:latest /bin/bashdocker inspect [容器id] #可以看到容器信息

Mysql数据同步
#注意mysql需要设置密码#-e 环境变量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=123456 \--name=mysql-test \mysql:5.7#之前有一次密码设置没有成功,是要加引号吧-e MYSQL_ROOT_PASSWORD='Root123!@$'#navicat无法连接,哭了#尝试了网上给出的解决办法都不行docker exec -it mysql-test /bin/bashmysql -u root -p#输入密码123456select host,user,plugin,authentication_string from mysql.user;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';grant all privileges on *.* to 'root'@'%' ;flush privileges;#提示10060 UNKNOWN ERROR
就算容器删除,本地的数据也都还在,实现了数据的持久化存储。
具名和匿名挂载
即是否指定volume的名字
#匿名挂载-v [容器内路径]docker run -d -P --name nginx-test-01 -v /etc/nginx nginx#查看volumedocker volume ls(base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume lsDRIVER VOLUME NAMElocal 0e1a26d1b73da328799b29c7babb19997c6ca3ad7da2053bb83298c346135979local 0eb47cb4500fdc7e3045e9eb11898df4dba3c561d3e2722f3dd37e9b26edbdea......#像这种volume name一串的就是匿名挂载#具名挂载#volume-name,前面没有斜杠,就不是指定宿主机路径,而是volume名字docker run -d -P --name nginx-test-02 -v volume-name:/etc/nginx nginx(base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume lsDRIVER VOLUME NAME......local volume-name#可以看到这里新增加的一条的volume名字#用下面命令可以看到挂载的具体位置(base) [root@izuf64eqyhnvmcv50ay73gz home]# docker volume inspect volume-name[{"CreatedAt": "2021-05-15T20:00:10+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/volume-name/_data","Name": "volume-name","Options": null,"Scope": "local"}](base) [root@izuf64eqyhnvmcv50ay73gz home]#
所有docker容器的卷,没有指定目录的情况下,都是在/var/lib/docker/volumes/…里
平时为什么/var/lib/docker/volumes里有那么多文件,我觉得就是因为镜像本身创建的时候指定了volume(参考下面Dockerfile的第一个例子),虽然我们run的时候没有把挂载显式写在命令里面,还是自动做了匿名挂载。使用docker inspect [容器id]命令,可以看到mounts里的信息。
# 修改数据卷的读写权限# -v [卷名]:[容器内路径]:[权限]# ro read only# rw read write# 一旦在这里设置了权限,容器对我们挂载出来的文件的操作就有限制。docker run -d -P --name nginx-test3 -v nginx3-vol:/etc/nginx:ro nginxdocker run -d -P --name nginx-test4 -v nginx4-vol:/etc/nginx:rw nginx# ro 只能从外部改变,只能从宿主机操作
初识Dockerfile
Dockerfile就是用来构建docker镜像的文件。命令脚本。
镜像的一层一层,就是脚本里的一个个命令。
FROM centosVOLUME ["volume01","volume02"]CMD echo "---end---"CMD /bin/bash
#注意最后有一个点docker build -t my-centos:v0.1 .#-f 指定Dockerfile位置,可以不叫“Dockerfile”docker build -f /home/docker-test-volume/Dockerfile -t my-centos:v0.1 .
数据卷容器
多个容器同步数据,数据卷的生命周期一直持续到没有容器使用为止。
可以实现配置信息的传递等
docker run -itd --name docker01 test-0515:v0.1docker run -itd --name docker02 --volumes-from docker01 test-0515:v0.1#两个容器,/volume01和/volume02中的文件同步#如果把docker01这个容器删掉,docker02中的文件还在,所以相当于docker02通过指定--volumes-from挂载到了与docker01相同的主机目录
