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