您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关docker中怎么挂载数据卷,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
一、创建和加载一个数据卷容器
查看命令参数:docker run --help
看到-v的命令帮助
这里我们可以看到-v相关命令一共有三个参数
解释:创建一个容器数据卷,要挂载容器数据卷首先要有容器数据卷,这个命令就是创建一个容器数据卷。
比如:
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结果都一样,这对于开发者来说很容易误解,所以建议写成绝对路径。
我们注意到上面查询出来的--volume命令的参数类型是list,所以我们可以在一个容器中创建多个数据卷。
比如:
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命令
解释:从指定容器安装数据卷
当我们已经创建好一个数据卷容器后或者已经存在一个数据卷容器,我们如何去加载这个数据卷容器到另一个容器呢?这就需要用到--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,只读和读写。默认使用数据卷相同的权限。
解释:为容器选择数据卷驱动
此命令不在此次讨论范围内,读者有兴趣可自行查阅相关资料。
二、挂载主机目录作为容器卷
上面讲了如何把容器作为一个数据卷,在容器之间共享数据的方法。但其实更多的时候我们是把主机中的目录作为一个数据卷加载到容器中,容器中的目录“外挂”,以方便运维人员维护和修改项目配置。
上面的命令等价于:-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中怎么挂载数据卷了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。