二、docker 存储
docker四种方式:默认、volumes数据卷、bind mounts挂载、tmpfs mount(仅在linux环境中提供),其中volumes、bind mounts两种实现持久化容器数据;
-
默认:数据保存在运行的容器中,容器删除后,数据也随之删除;
-
volumes:数据卷,数据存放在主机文件系统/var/lib/docker/volumes/目录下,该目录由docker管理,其它进程不允许修改,推荐该种方式持久化数据;
-
Bind mounts:直接挂载主机文件系统的任何目录或文件,类似主机和容器的共享目录,主机上任何进程都可以访问修改,容器中也可以看到修改,这种方式最简单。
-
tmpfs:数据暂存在主机内存中,不会写入文件系统,重启后,数据删除。
(一)卷管理以及文件系统挂在语法
1、Docker 卷管理语法
docker volume create :创建一个新卷
docker volume ls:列出本地docker主机上的卷
docker volume imspect:查看卷的详细信息,包括卷在Docker主机文件系统中的具体位置
docker volume prune:删除未被容器或者服务副本使用的全部卷
docker volume rm:删除未被使用的指定卷
2、容器的文件系统挂在语法
(1)-v 选项的语法
-v [主机中的挂在源]容器中的挂在目标[:<选项>]
注:第三个选项是ro,默认是rw
(2)–mount 选项的语法格式
--mount <键>=<值>,<键>=<值>
type:指定要挂在的类型,值可以是 bind(绑定挂载)、volume(卷)或 tmpfs。默认使用volume
source(或sc):指定挂载源,对于卷,挂载源卷,挂载源为主机上的目录或者文件
destionation(或dist、target):指定挂载目标,即容器中的挂在点,必须采用绝对路径的形式
readonly:指定只读选项,表示源以只读方式挂在到容器中
其他键:可以被多次指定,由若干键值对组成。卷和绑定挂载有不同的键
(二)案例
1、创建和管理卷
(1)创建卷
# docker volume create volume-test01
(2)查看卷的详细信息
# docker volume inspect volume-test01
(3)启动容器时挂载卷
# docker run -it -d -v volume-test01:/txt centos /bin/bash
(4)删除卷
docker volume rm volume-test01
注:没有容器使用该卷以后,才可以删除卷。
(5)启动容器时自动创建卷
启动带有卷的容器时,如果卷不存在,则docker会自动创建这个卷,即在docker根目录的volumes子目录下生成相应的目录结构。
# docker run -it -d --name com-test01 --mount source=vol-test01,target=/app nginx
2、使用容器填充卷、使用只读卷和使用匿名卷
(1)使用容器填充卷
如果容器启动时挂载已经存在并包含数据的卷,则容器不会将其挂载点目录的数据复制到该卷,而是直接使用卷。
如果容器启动时挂载空白卷(卷已经存在但是没有任何数据)或者自动创建新卷,而容器的挂在点目录下已经有文件或者目录,则该挂载卷目录的内容会被复制到卷中,即将容器中挂在点目录的数据填充到卷中。
(2)使用只读卷
# docker rm -it -d --name=nginx --mount soruce=nginx-vol01,destination=/usr/share/nginx/html,readonly nginx:latest
(3)使用匿名卷
# docker run -it -d --mount destination=/app nginx
注:匿名卷并不是没有名称的,而是docker自动为匿名卷生成一个UUID作为名称。
3、使用容器进行绑定挂载
# docker run -it -d --name con-test-01 --mount type=bind,source="$(pwd)"/nginx,target=/app nginx
4、创建、备份、恢复卷容器
docker run --rm :停止容器时自动删除容器
--volumes-from :基于卷容器创建新的容器,并挂载卷容器提供的卷
(1)创建卷容器
# docker create --name data-store01 -v /data01 ubuntu /bin/bash
(2)备份卷容器
① 启动新的容器并从data-store01容器中挂载卷
② 将本地主机的当前目录挂载为/backup
③ 传送命令,将data01卷的内容打包为/backup/backup.tar文件
# docker run --rm --volumes-from data-store01 -v $(pwd):/backup ubuntu tar -cvf /backup/backup.tar /data01
(3)从备份中恢复卷容器
# docker run -v /data01 --name data-store02 ubuntu /bin/bash
# docker run --rm --volumes-from data-store02 -v $(pwd):/backup ubuntu bash -c "cd /data01 && tar -xvf /backup/backup.tar --strip 1"