关于docker挂载数据卷

docker挂载数据卷能够分两种状况:挂载主机目录做为容器卷和挂载一个容器卷html

1、建立和加载一个数据卷容器

1.建立一个数据卷容器

查看命令参数:docker run --helplinux

看到-v的命令帮助docker

这里咱们能够看到-v相关命令一共有三个参数centos

--volume(等同于-v)

解释:建立一个容器数据卷,要挂载容器数据卷首先要有容器数据卷,这个命令就是建立一个容器数据卷。tomcat

好比:运维

docker run -d --volume /var/volume --name DATA centos ls

上面的命令即从名为centos的镜像启动(守护线程)一个容器,容器命名为DATA,启动以后执行ls命令。而且将容器中的/var/volume目录(或文件)分享出去,这样就建立了一个数据卷容器。上面的命令等价于:docker run -v /var/volume -name DATA centos学习

这里的/var/valume建议写成绝对路径,虽然相对路径没有报错,可是很容易引发误解。由于这里即便写成相对路径,docker也会当成绝对路径来处理。好比把这里的/var/valume写成./var/volume或var/valume结果都同样,这对于开发者来讲很容易误解,因此建议写成绝对路径。ui

咱们注意到上面查询出来的--volume命令的参数类型是list,因此咱们能够在一个容器中建立多个数据卷。spa

好比:命令行

docker run -d --volume /var/volume1 --volume /var/volume2 --name DATA centos ls

这样咱们就在DATA 容器中建立了两个数据卷

除了上面的建立数据卷容器外,咱们还能够在Dockerfile中建立数据卷,使用 VOLUME 命令。

好比:

# BUILD-USING:        docker build -t data .
# RUN-USING:          docker run -name DATA data
FROM          base-image
VOLUME        ["/var/volume1", "/var/volume2"]
CMD           ["ls"]

注:这里的ls命令并非必须的,由于容器启动后要执行一个命令,这个命令能够写在docker启动命令行的最后,也能够写在Dockerfile的CMD命令中,且命令行中的命令会覆盖Dockerfile中的CMD命令

2.加载数据卷

--volumes-from

解释:从指定容器安装数据卷

当咱们已经建立好一个数据卷容器后或者已经存在一个数据卷容器,咱们如何去加载这个数据卷容器到另外一个容器呢?这就须要用到--volumes-from命令。

这个命令就是从指定的一个或多个数据卷容器加载数据卷到当前的容器中。加载的意思就是若是当前容器若是存在数据卷的目录结果则被覆盖,若是没有则直接加载。

好比:

docker run -d --volumes-from DATA:rw --name client centos ls

上面的命令即从名为centos的镜像中启动(守护线程)一个容器,容器命名为client,而且从名为DATA的容器中加载数据卷(读写),启动后执行ls命令。这样DATA中的数据卷(/var/volume)就和client中的加载的数据卷(/var/volume)共享了,只要任意一方对数据卷作出更改都会同步到另外一方。值得注意的时这里并非利用相似复制粘贴的功能实现的同步数据,而是直接修改数据,这对于超大文件颇有用。

这里的--volumes-from命令的参数类型一样是list,因此也是能够指定多个数据卷容器的。

好比:

docker run -d --volumes-from DATA1:ro --volumes-from DATA2:ro --name client centos ls

注:--volumes-from加载的数据卷能够赋予读写权限[rw|ro],也就是read write和read only,只读和读写。默认使用数据卷相同的权限。

--volume-driver

解释:为容器选择数据卷驱动

此命令不在这次讨论范围内,读者有兴趣可自行查阅相关资料。

2、挂载主机目录做为容器卷

上面讲了如何把容器做为一个数据卷,在容器之间共享数据的方法。但其实更多的时候咱们是把主机中的目录做为一个数据卷加载到容器中,容器中的目录“外挂”,以方便运维人员维护和修改项目配置。

--volume [host-dir]:[container-dir]:[rw|ro]

上面的命令等价于:-v [host-dir]:[container-dir]:[rw|ro]

解释:将主机的目录(host-dir)做为数据卷加载到容器(container-dir)中,并指定读写权限默认使用数据卷的权限

好比:

docker run -d --volume /var/logs:/var/host_logs:ro tomcat

上面的命令即从名为tomcat的镜像(守护线程)启动一个容器,容器名随机。挂载主机目录/var/logs做为数据卷,并加载到当前启动的容器/var/host_logs,指定只读权限。这样的话就把主机的logs目录和容器的host_logs目录数据共享,当容器(数据卷)中或主机(数据卷)数据更改会同步。实际的以些应用场景有项目的配置文件挂载、日志文件挂载等,由于这些文件都是常常查看和修改的,若是每次都进入容器修改和查看十分麻烦,因此直接挂载一个主机数据卷就能够经过修改和查看主机的数据卷同步容器中的数据,简化的操做步骤。

这里有几个点须要注意:

主机目录和容器目录须要绝对路径,若是不指定绝对路径启动会报错,错误提示为invalid mount path,mount path must be abstract。

若是主机目录不存在则会自动建立,建立的目录权限为docker容器中对应的目录权限。

若是容器目录不存在则会自动建立,建立的权限为宿主机对应的目录权限,用户和用户组为1000(貌似默认的)

若是主机目录和容器目录都存在,则主机目录的内容会覆盖掉容器目录的内容,但目录名不会改变。

容器内部没法删除挂载的数据卷(目录),但主机能够删除挂载的数据卷,删除后容器内的目录依旧存在但内容为空。删除失败 Device or resource busy

容器中止和删除都不影响主机数据卷,即便容器已经删除了,主机数据卷内容任然存在。

挂载数据卷的操做是在容器执行启动成功后的命令以前完成的,也就是在Dockerfile的CMD命令以前。因此你可能会在挂载数据卷后进容器查看数据卷内容发现与进容器以前看到的主机数据卷不一致,其实数据卷已经被容器启动后作了数据数据更改了,当你退出容器查看主机数据卷已经同步。

 

总结

Docker是一个开源引擎,能够轻松地从任何应用程序建立轻量,可移植,自给自足的容器。docker的出现给项目的部署提供了一种更为方便的方式。docker利用linux的name space技术,实现了轻量、可移植、数据隔离,其优秀的可移植性和数据隔离赋予了受到众多运维人员的青睐。工欲善其事必先利其器,docker的轻量方便也是创建在优秀的镜像和容器制做之上的,因此要想有一个高可用的容器,制做过程须要细心研究。

本文乃做者我的研究有感而写,若有错误或不妥之处,我的学习是小耽误他人前途是大,还望各位读者指正。

转载请指明出处。

 

参考文档:

https://docker-doc.readthedocs.io/zh_CN/latest/index.html

https://docs.docker.com/get-started/

相关文章
相关标签/搜索