数据卷:为了使容器运行过程中的数据可以持久化,而不是删除容器之后数据就没有了。数据卷由docker挂载到容器,docker不会在删除容器时删除挂载的数据卷。
- 数据卷可以在容器之间共享或重用数据
- 数据卷中的更改可以立即生效(html等文件可以立即生效,配置文件还是要重启容器)
- 数据卷中的更改不会包含在镜像的更新中(只会更新当前容器)
- 数据卷默认会一直存在,即使容器被删除
- 数据卷的生命周期一直持续到没有容器使用它
两种方式:
- Data Volumes 容器内数据直接映射到本地主机环境
- Data Volume Containers 使用特定容器维护数据卷
挂载数据卷最好通过run启动容器(create/start命令创建启动容器后,再挂载数据卷相当麻烦)
docker官网推荐尽量进行目录挂载而不是文件挂载
数据卷的类型:
宿主机数据卷
直接在宿主机的文件系统中但是容器可以访问(推荐)
docker run -v /宿主机绝对路径目录:/容器内目录 镜像名
mysql8挂载卷
docker run -itd --name mysql8 --restart always --privileged=true -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v /data/mysql:/var/lib/mysql mysql:8.0 --character-set-server=utf8 --collation-server=utf8_general_ci
#mysql8远程连接需要进入容器重新修改配置
docker exec -it mysql8 bash
mysql -uroot -p
#修改加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
#更新一下用户的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
#刷新权限
FLUSH PRIVILEGES;
查看宿主机的文件
容器目录权限
#ro:readonly 只读
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
#rw:readwrite 可读可写
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
注意
如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。容器中的数据会被干掉
命名的数据卷
磁盘上Docker管理的数据卷,但是这个卷有个名字
#命名为test-nginx的数据卷
docker run -itd --name nginx -p 80:80 -v test-nginx:/etc/nginx nginx:1.19
查看数据卷,Mountpoint是路径
匿名数据卷
磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件
docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19
数据卷容器
需要一个centos系统作为数据卷容器
docker pull centos:7.8.2003
docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v /data/mysql:/var/lib/mysql centos:7.8.2003
虽然docker ps查看data-volume容器是处于停止状态,但是不影响挂载
宿主机上查看
启动Nginx
docker run -itd --name nginx -p 80:80 --volumes-from data-volume nginx:1.19
启动mysql
docker run -itd --name mysql8 --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --volumes-from data-volume mysql:8.0 --character-set-server=utf8 --collation-server=utf8_general_ci