一、如何实现nginx容器内目录与宿主机文件目录自动双向映射?(volume)
nginx容器:静态资源目录:/usr/share/nginx/html
配置文件目录:/etc/nginx/conf
宿主机文件系统:/var/lib/docker/volumes/html/_data
/var/lib/docker/conf/_data
数据卷可实现对应功能:
数据卷(Volume)是一个虚拟目录(逻辑上),是容器内目录与宿主机文件目录之间映射的桥梁。(可理解为文件共享目录)
1.创建数据卷:docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载;
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷(即匿名卷);
数据卷必须在创建容器时指定路径,容器创建完毕后无法进行文件数据卷创建。
2.查看所有数据卷:docker volume ls
3.查看某个数据卷详情:docker volume inspect
(挂载点目录:/var/lib/docker/volumes/html/_data)
(root目录下也可查看:cat /var/lib/docker/volumes/html/_data/index.html)
4.删除指定数据卷:docker volume rm
5.清除数据卷:docker volume prune
【注1】查看指令使用规则:docker volumes --help
【注2】查看其他容器是否有数据卷挂载: docker inspect 容器名
- 二、如何基于宿主机目录实现mysql数据目录、配置文件、初始化脚本的挂载?(bind mount)
宿主机:数据目录:/var/share/mysql
配置文件:/etc/mysql/conf.d
初始化脚本:/docker-entrypoint-initdb.d
容器:数据目录:/root/mysql/data
配置文件:/root/mysql/conf
初始化脚本:/root/mysql/init
在执行docker run 命令时,使用 -v 本地目录:容器内目录 可以完成本地目录挂载
本地目录必须以“/”或“./”开头,如果直接以 名称开头会被识别为数据卷而非本地目录
-v mysql:/var/share/mysql 会被识别为一个数据卷叫mysql
-v ./mysql:/var/share/mysql 会被识别为当前目录下的mysql目录
1.创建文件:
2.创建并挂载:
docker run -d --name mysql -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/conf.d mysql
【说明】存储驱动-storage driver
1.存储驱动处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户提供了多层数据和合并后的统一视图;
2.存储驱动可以通过merge驱动方式将容器可读可写层融合在镜像上
默认地址/var/lib/docker/overlay2
3.存储驱动管理的容器层,一般用于防止无状态的应用数据,即不需要持久化存储的数据,对于需要持久化存放的数据,则需要使用卷volume或者绑定挂载bing mount
(1)无论是volume还是bind mount,其本质上是宿主机文件系统中 的目录或文件
(2)无论是volume还是bind mount,其上存放 的数据生命周期独立于容器,即容器删除之后,volume或bind mount上的数据,依旧存在
4.除卷和绑定挂载以外还可以提供tmpfs挂载,与卷和绑定挂载相反,tmpfs挂载是临时的,并且仅持久保存在主机内存中,当容器停止时,tmpfs挂载将被删除,并且在该容器中写入的文件将不会保留。
5.linux绑定挂载(bind mount)主要作用是允许一个目录或者文件(不是整个设备)挂载到一个指定的目录上
6.在该挂载点上进行的任何操作,只是发生在被挂载的目录或文件上,而原挂载点的内容则会被隐藏起来且不受影响
7.容器运行过程中,对bind mount 目录中改动 的数据,将被保存,删除容器后,bind mount中的数据仍然存在
8.bind mount 可以挂载一个目录到容器,也可以挂载一个文件到容器,但必须要指定目录或文件的路径,即mount源,当然也必须指定 mount point,这也限制了容器的可移植性
9.若将bind mount 绑定到容器上的某非空目录下,则会隐藏容易目录下的现有内容,若不希望容器的整个目录被覆盖,可单独挂载某个文件
10.若mount源指向的文件或目录在宿主机上不存在,则会自动创建
11.使用 bind mount 时,可通过ro 参数将容器对数据的权限设置为只读(设置ro 参数后,容器无法对数据进行修改,但宿主机依旧有权限修改其内容)