摘要:解决中的容器文件不能持久的问题目前下使用的主流方式还是使用需要借用虚拟器启动一个宿主机才能在上面启动多个容器当我们在容器中运行服务时经常会有需要将服务数据持久化的场景比如运行集群时需要将索引数据持久保存到磁盘那具体保存到哪里呢容器的无状态特
解决Docker Machine中的容器文件不能持久的问题
目前Mac下使用docker的主流方式还是使用Docker machine.
Docker machine需要借用Virtual Box虚拟器启动一个Linux宿主机, 才能在上面启动多个Docker容器.
当我们在docker容器中运行服务时,经常会有需要将服务数据持久化的场景.比如运行Elasticsearch集群时, 需要将索引数据持久保存到磁盘.
那具体保存到哪里呢?容器的无状态特性决定了我们不应该将数据保存在容器中, 因为容器一旦重启, 文件数据就会丢失.一般应该使用volume参数,通过挂载外部文件系统到Docker容器中来保存数据.
当我在Mac下使用Docker开发时, 遇到这种场景, 自然就想到了将服务数据保存到Linux宿主机上. 结果很不辛, 使用Docker Machine创建的Linux宿主机的文件系统几乎也是不能持久的, Linux重启后, 之前写入的文件都会丢失.
不过好在使用Docker Machine创建的Linux宿主机上面,自动挂载了Mac上的用户目录到Linux宿主机上. 如下:
Linux: /Users ---> Mac : /Users
我们挂载文件系统时, 将应用的数据保存到/Users不久可以了吗?
然而现实还是那么残酷. 当我使用按照这个方式启动Elasticsearch时:
docker run -v "/Users/isaac/work/data":/usr/share/elasticsearch/data elasticsearch:2.3.3
却得到了以下错误:
Exception in thread "main" java.lang.IllegalStateException: Unable to access "path.data" (/usr/share/elasticsearch/data/elasticsearch) Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/elasticsearch at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384) at java.nio.file.Files.createDirectory(Files.java:674) at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781) at java.nio.file.Files.createDirectories(Files.java:767) at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:337) at org.elasticsearch.bootstrap.Security.addPath(Security.java:314) at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:259) at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:212) at org.elasticsearch.bootstrap.Security.configure(Security.java:118) at org.elasticsearch.bootstrap.Bootstrap.setupSecurity(Bootstrap.java:196) at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:167) at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270) at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
经过分析, 文件操作失败是因为用户权限的问题.
查看Linux宿主机的用户信息:
docker-machine ssh default cat /etc/passwd
得到以下内容:
root:x:0:0:root:/root:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/false tc:x:1001:50:Linux User,,,:/home/tc:/bin/sh docker:x:1000:50:Linux User,,,:/home/docker:/bin/sh
所以通过指定启动Docker容器的用户, 可以解决此问题:
docker run -u 1000 -v "/Users/isaac/work/data":/usr/share/elasticsearch/data elasticsearch:2.3.3
其中:-u 1000 代表使用id为1000的docker用户来启动应用
在docker-compose.yml中指定启动用户为docker用户:
elasticsearch1: image: elasticsearch:2.3.3 command: "elasticsearch -Des.cluster.name=elasticsearch -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master" links: - elasticsearch_master volumes: - /Users/isaac/work/data:/usr/share/elasticsearch/data user: "1000"
ok,启动服务后, 数据终于持久不丢失了.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26591.html
摘要:发现问题之后,相应的解决方法也很简单把当前目录的拥有者赋值给,再启动容器就一切正常了。这时我们已经可以知道容器的本地数据卷中文件目录的权限是和宿主机上一致的,只是在容器和宿主机中可能映射为不同的用户组名称。 Volume数据卷是Docker的一个重要概念。数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性: 持久化数据与容器的生命周期解耦:在容器删除之后数据卷...
摘要:市长信箱邮件查询服务在上安装作为一个服务在上一章我完成了替换的工作按照之前的计划现在是该把迁移到的时候了为什么要迁移到为后续展示的弹性做准备使用可以方便的部署多节点很火我开发机是要在上使用需要安装的原理就是在上安装一台虚拟机作为容器的宿 市长信箱邮件查询服务: 在Docker上安装Elasticsearch作为一个服务 在上一章,我完成了Elasticsearch替换Mysql的工作....
摘要:对于开发人员而言,他们的最终目标是拥有自己的数据中心,使他们能够在贴近真实情况的副本上测试他们的服务。这个想法在最近的六个月来变得非常受欢迎,因为许多大型机构已经开始为开发人员提供一个完整的以让数据中心能够在本地运行。 对于开发人员而言,他们的最终目标是拥有自己的数据中心(data center),使他们能够在贴近真实情况的副本上测试他们的服务。然而,开发人员的开发过程中却充满了妥协。...
阅读 2475·2023-04-25 21:41
阅读 1649·2021-09-22 15:17
阅读 1923·2021-09-22 10:02
阅读 2434·2021-09-10 11:21
阅读 2574·2019-08-30 15:53
阅读 997·2019-08-30 15:44
阅读 950·2019-08-30 13:46
阅读 1129·2019-08-29 18:36