1.容器数据卷技术解决什么问题
docker可将应用和环境打包成一个镜像。容器是镜像的实例化。
我们的数据如果都在容器中,一旦容器删除,数据就会丢失。
数据卷技术可将容器产生的数据同步到本地,容器之间也可以共享,从而实现容器数据的持久化。
当本地和容器可以实现目录映射,修改容器配置就不必进入容器,有了映射直接在本地修改即可。
2.使用数据卷(volumes)
# 创建一个容器,-v选项表示携带一个数据卷,选项后面是一个目录的映射
docker run -v 主机目录:容器内目录 image
实例1
# 将本地/home/test目录与容器的/home目录进行映射
# -it选项对应/bin/bash,表示分配一个shell用于和容器交互
docker run -it -v /home/test:/home centos /bin/bash
# 接着,我在容器的/home目录下面新建了一个hello.java,如下图
在本地/home/test目录下面我们可以看到数据已经同步
实例2:mysql数据持久化
docker pull mysql:8.0 # 拉取镜像
# 启动一个mysql容器,MYSQL_ROOT_PASSWORD用于设置密码
# 这里将mysql容器的配置文件目录和数据目录都做了一个本地映射
docker run --name mysql01 -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
查看本地/home/mysql/data目录
可以用Navicat测试一下数据库的连接,并且创建一个test数据库
再次查看本地/home/mysql/data目录,数据已更新,多了一个test数据库
3.具名挂载和匿名挂载
# 指定路径挂载,-v 宿主机路径:容器内路径
# 匿名挂载, -v 容器内路径
# -P 表示随机分配端口,-v后面只指明了容器中要挂载的目录
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 具名挂载, -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看volume的情况,匿名挂载会随机分配一个volume name,如下图
docker volume ls
docker inspect 卷名获取容器中的目录挂载到本地的位置
拓展
# :ro 表示只读,说明这个路径只能通过宿主机来操作,容器内部无法操作
# :rw 表示可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx