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,如下图


docker卷管理器 docker swarm 数据卷_nginx

在本地/home/test目录下面我们可以看到数据已经同步


docker卷管理器 docker swarm 数据卷_数据卷_02

实例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目录


docker卷管理器 docker swarm 数据卷_nginx_03

可以用Navicat测试一下数据库的连接,并且创建一个test数据库 


docker卷管理器 docker swarm 数据卷_docker_04

再次查看本地/home/mysql/data目录,数据已更新,多了一个test数据库

docker卷管理器 docker swarm 数据卷_docker_05

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卷管理器 docker swarm 数据卷_docker_06

docker inspect 卷名获取容器中的目录挂载到本地的位置 


docker卷管理器 docker swarm 数据卷_docker_07

拓展

# :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