摘要:解決中的容器文件不能持久的問題目前下使用的主流方式還是使用需要借用虛擬器啟動一個宿主機才能在上面啟動多個容器當我們在容器中運行服務時經(jīng)常會有需要將服務數(shù)據(jù)持久化的場景比如運行集群時需要將索引數(shù)據(jù)持久保存到磁盤那具體保存到哪里呢容器的無狀態(tài)特
解決Docker Machine中的容器文件不能持久的問題
目前Mac下使用docker的主流方式還是使用Docker machine.
Docker machine需要借用Virtual Box虛擬器啟動一個Linux宿主機, 才能在上面啟動多個Docker容器.
當我們在docker容器中運行服務時,經(jīng)常會有需要將服務數(shù)據(jù)持久化的場景.比如運行Elasticsearch集群時, 需要將索引數(shù)據(jù)持久保存到磁盤.
那具體保存到哪里呢?容器的無狀態(tài)特性決定了我們不應該將數(shù)據(jù)保存在容器中, 因為容器一旦重啟, 文件數(shù)據(jù)就會丟失.一般應該使用volume參數(shù),通過掛載外部文件系統(tǒng)到Docker容器中來保存數(shù)據(jù).
當我在Mac下使用Docker開發(fā)時, 遇到這種場景, 自然就想到了將服務數(shù)據(jù)保存到Linux宿主機上. 結果很不辛, 使用Docker Machine創(chuàng)建的Linux宿主機的文件系統(tǒng)幾乎也是不能持久的, Linux重啟后, 之前寫入的文件都會丟失.
不過好在使用Docker Machine創(chuàng)建的Linux宿主機上面,自動掛載了Mac上的用戶目錄到Linux宿主機上. 如下:
Linux: /Users ---> Mac : /Users
我們掛載文件系統(tǒng)時, 將應用的數(shù)據(jù)保存到/Users不久可以了嗎?
然而現(xiàn)實還是那么殘酷. 當我使用按照這個方式啟動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)
經(jīng)過分析, 文件操作失敗是因為用戶權限的問題.
查看Linux宿主機的用戶信息:
docker-machine ssh default cat /etc/passwd
得到以下內(nèi)容:
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,啟動服務后, 數(shù)據(jù)終于持久不丟失了.
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26591.html
摘要:發(fā)現(xiàn)問題之后,相應的解決方法也很簡單把當前目錄的擁有者賦值給,再啟動容器就一切正常了。這時我們已經(jīng)可以知道容器的本地數(shù)據(jù)卷中文件目錄的權限是和宿主機上一致的,只是在容器和宿主機中可能映射為不同的用戶組名稱。 Volume數(shù)據(jù)卷是Docker的一個重要概念。數(shù)據(jù)卷是可供一個或多個容器使用的特殊目錄,可以為容器應用存儲提供有價值的特性: 持久化數(shù)據(jù)與容器的生命周期解耦:在容器刪除之后數(shù)據(jù)卷...
摘要:市長信箱郵件查詢服務在上安裝作為一個服務在上一章我完成了替換的工作按照之前的計劃現(xiàn)在是該把遷移到的時候了為什么要遷移到為后續(xù)展示的彈性做準備使用可以方便的部署多節(jié)點很火我開發(fā)機是要在上使用需要安裝的原理就是在上安裝一臺虛擬機作為容器的宿 市長信箱郵件查詢服務: 在Docker上安裝Elasticsearch作為一個服務 在上一章,我完成了Elasticsearch替換Mysql的工作....
摘要:對于開發(fā)人員而言,他們的最終目標是擁有自己的數(shù)據(jù)中心,使他們能夠在貼近真實情況的副本上測試他們的服務。這個想法在最近的六個月來變得非常受歡迎,因為許多大型機構已經(jīng)開始為開發(fā)人員提供一個完整的以讓數(shù)據(jù)中心能夠在本地運行。 對于開發(fā)人員而言,他們的最終目標是擁有自己的數(shù)據(jù)中心(data center),使他們能夠在貼近真實情況的副本上測試他們的服務。然而,開發(fā)人員的開發(fā)過程中卻充滿了妥協(xié)。...
閱讀 2471·2023-04-25 21:41
閱讀 1647·2021-09-22 15:17
閱讀 1921·2021-09-22 10:02
閱讀 2433·2021-09-10 11:21
閱讀 2569·2019-08-30 15:53
閱讀 996·2019-08-30 15:44
閱讀 946·2019-08-30 13:46
閱讀 1125·2019-08-29 18:36