Docker應(yīng)用詳細(xì)解析(二) —— 在macOS上使用Docker(二)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.11.17 星期六

前言

Docker是一個(gè)跨平臺(tái)的輕量級(jí)虛擬機(jī)诗充,可移植性非常高,一次部署,終生可用稀并。Docker可以在Linux鲫剿、Windows、MacOS等平臺(tái)上安裝使用稻轨。接下來(lái)幾篇我們就一起看一下Docker相關(guān)的內(nèi)容灵莲。感興趣的可以看下面幾篇文章。
1. Docker應(yīng)用詳細(xì)解析(一) —— 在macOS上使用Docker(一)

Mounting Volumes: Sharing Host & Container Files

您經(jīng)常希望在主機(jī)和容器之間共享文件或目錄殴俱。 停止和刪除容器時(shí)政冻,數(shù)據(jù)庫(kù)中的數(shù)據(jù)不應(yīng)消失。 在不同版本的應(yīng)用程序或運(yùn)行相同數(shù)據(jù)庫(kù)應(yīng)用程序的不同容器之間共享數(shù)據(jù)庫(kù)也很方便线欲。 當(dāng)您在容器中運(yùn)行時(shí)明场,您可能希望將配置文件提供給數(shù)據(jù)庫(kù)應(yīng)用程序或?qū)?shù)據(jù)提供給機(jī)器學(xué)習(xí)應(yīng)用程序。 您將在本節(jié)中學(xué)習(xí)如何執(zhí)行這些操作李丰。

1. Persisting Databases After the Container Exits - 容器退出后保留數(shù)據(jù)庫(kù)

要將數(shù)據(jù)庫(kù)存儲(chǔ)在本地主機(jī)系統(tǒng)上苦锨,使其保持不變并且可以被其他容器訪問(wèn),您將在啟動(dòng)CouchDB容器時(shí)在Docker的存儲(chǔ)目錄中創(chuàng)建一個(gè)卷趴泌。

Docker run終端窗口中舟舒,輸入以下命令:

docker run --mount source=couchdbVolume,target=/opt/couchdb/data --network emoji-net -d --name couchdb couchdb

注意:在--mount值中,不要在=符號(hào)周圍或逗號(hào)后面添加空格嗜憔。

第一次運(yùn)行此命令時(shí)秃励,它會(huì)在主機(jī)系統(tǒng)上的Docker存儲(chǔ)目錄中創(chuàng)建couchdbVolume,然后將容器的/ opt / couchdb / data目錄的內(nèi)容復(fù)制到couchdbVolume中吉捶。 然后容器安裝并使用couchdbVolume來(lái)存儲(chǔ)其數(shù)據(jù)庫(kù)夺鲜。

在您的EmojiJournalServer終端窗口中,在同一網(wǎng)絡(luò)上啟動(dòng)EmojiJournalServer容器:

docker run --network emoji-net --name emojijournal -it -p 8090:8080 -v $PWD:/root/project -w /root/project emojijournal-run sh -c .build-ubuntu/release/EmojiJournalServer

刷新或打開localhost:8090 / client呐舔,添加表情符號(hào)币励,然后 - 在Docker cleanup終端窗口中 - 停止并刪除兩個(gè)容器:

docker rm $(docker stop $(docker ps -q))

即使您已刪除創(chuàng)建它的CouchDB容器,該卷仍然存在珊拼。 要查看此信息食呻,請(qǐng)輸入以下命令:

docker volume inspect couchdbVolume

輸出如下:

[
  {
    "CreatedAt": "2018-10-26T08:00:59Z",
    "Driver": "local",
    "Labels": null,
    "Mountpoint": "/var/lib/docker/volumes/couchdbVolume/_data",
    "Name": "couchdbVolume",
    "Options": null,
    "Scope": "local"
  }
]

使用Finder ? Go ? Go to Folder…菜單項(xiàng)以查看mountpoint目錄......好吧,您可以嘗試查看它 - 它不在那里杆麸! Docker的存儲(chǔ)目錄實(shí)際上存在于Docker引擎中并由其管理搁进。 您不打算直接在主機(jī)文件系統(tǒng)上訪問(wèn)它浪感。 您只能通過(guò)將其安裝在Docker容器中來(lái)訪問(wèn)它昔头。

現(xiàn)在,為了證明在刪除CouchDB容器后表情符號(hào)數(shù)據(jù)庫(kù)仍然存在:在Docker run終端窗口中重新運(yùn)行CouchDB命令影兽,在EmojiJournalServer終端窗口中運(yùn)行EmojiJournalServer命令揭斧,然后刷新localhost:8090 / client - 這次,你不會(huì)丟失你的表情符號(hào)!

因?yàn)?code>couchdbVolume已經(jīng)存在讹开,所以CouchDB容器剛剛安裝它盅视,將已經(jīng)存儲(chǔ)在那里的數(shù)據(jù)庫(kù)暴露給EmojiJournalServer容器,該容器找到并加載了由前一個(gè)EmojiJournalServer容器創(chuàng)建的日志條目數(shù)據(jù)庫(kù)旦万。

Clean up:停止并取出容器闹击。 關(guān)閉瀏覽器窗口。 刪除所有未使用的網(wǎng)絡(luò)

docker network prune

2. Sharing a Database With Another Docker Container - 與另一個(gè)Docker容器共享數(shù)據(jù)庫(kù)

您為在emoji-net網(wǎng)絡(luò)上運(yùn)行的CouchDB創(chuàng)建了一個(gè)卷成艘。 您已停止并刪除了CouchDB容器赏半,但卷仍然存在。 您可以將此卷重用于在默認(rèn)網(wǎng)絡(luò)上運(yùn)行的CouchDB容器淆两,從而有效地與另一個(gè)容器共享其數(shù)據(jù)庫(kù)断箫。

為了演示這一點(diǎn),請(qǐng)將couchdbVolume安裝在默認(rèn)橋接網(wǎng)絡(luò)上運(yùn)行的CouchDB容器中秋冰,以便主機(jī)上的EmojiJournalServer可以訪問(wèn)已保存的日記條目數(shù)據(jù)庫(kù)仲义。

在默認(rèn)橋接網(wǎng)絡(luò)上啟動(dòng)CouchDB容器,安裝couchdbVolume并發(fā)布其端口:

docker run --mount source=couchdbVolume,target=/opt/couchdb/data -p 5984:5984 -d --name couchdb couchdb

在您的EmojiJournalServer終端窗口中剑勾,在主機(jī)系統(tǒng)上運(yùn)行EmojiJournalServer

.build/debug/EmojiJournalServer

在您的主機(jī)系統(tǒng)上運(yùn)行的EmojiJournalServercouchdbVolume中查找并加載日記條目數(shù)據(jù)庫(kù)埃撵,因此當(dāng)您加載localhost:8080 / client時(shí),您會(huì)看到來(lái)自EmojiJournalServer容器的表情符號(hào):

在您的EmojiJournalServer終端窗口中虽另,按Control-C停止此EmojiJournalServer盯另。 關(guān)閉瀏覽器窗口。

停止并刪除CouchDB容器洲赵,然后輸入此命令以刪除所有未使用的卷:

docker volume prune

3. Providing Local Files to a Docker Container - 將本地文件提供給Docker容器

在容器中運(yùn)行EmojiJournalServer的命令具有-v $ PWD:/ root / project選項(xiàng)鸳惯,該選項(xiàng)將EmojiJournalServer目錄安裝為容器中的/ root / project。 本節(jié)演示對(duì)主機(jī)文件的更改會(huì)影響容器的文件叠萍,反之亦然芝发。

在您的EmojiJournalServer終端窗口中,在后臺(tái)啟動(dòng)EmojiJournalServer容器:

docker run --name emojijournal -itd -p 8090:8080 -v $PWD:/root/project -w /root/project emojijournal-run sh -c .build-ubuntu/release/EmojiJournalServer

然后輸入以下命令:

docker exec -it emojijournal bash

此命令創(chuàng)建運(yùn)行bash Unix shell的交互式終端會(huì)話苛谷。 你得到一個(gè)以?/ project#結(jié)尾的命令行提示符辅鲸。 在此提示符下,輸入此命令以查看容器的project目錄:

ls -l

輸出列出與Finder中的EmojiJournalServer文件夾相同的文件:

使用您喜歡的文本編輯器在此文件夾中創(chuàng)建一個(gè)新文件 - 例如腹殿,包含文本I was herekilroy.txt独悴。在?/ project#提示符下,再次輸入ls -l锣尉,以查看您的新文件容器刻炒。 在?/ project#提示符下輸入以下命令:

rm kilroy.txt

在Finder中,文件消失自沧。 這就是將本地目錄連接到容器是多么容易 - 一個(gè)地方的變化會(huì)影響另一個(gè)坟奥!

Cleanup:停止并移除容器。

4. Choosing Between Volume & Bind Mount

您現(xiàn)在已經(jīng)看到了兩種在容器中掛載主機(jī)目錄的方法:couchdbVolume是一個(gè)volume,而EmojiJournalServer目錄是一個(gè)bind mount爱谁。卷和綁定裝載之間的主要區(qū)別在于它位于主機(jī)文件系統(tǒng)上晒喷,以及是否可以通過(guò)主機(jī)文件系統(tǒng)直接訪問(wèn)它。

您將本地系統(tǒng)上的特定路徑(如EmojiJournalServer文件夾)bind-mount到容器中的特定路徑- / root / project访敌。您可以直接與本地目錄進(jìn)行交互凉敲,更改將顯示在容器中。同樣寺旺,容器所做的更改也會(huì)顯示在Finder中荡陷。

您可以通過(guò)在docker rundocker volume create命令中指定名稱(如couchdbVolume)來(lái)創(chuàng)建volume。該卷位于Docker的存儲(chǔ)目錄中迅涮,位于本地系統(tǒng)的Docker引擎中废赞。您無(wú)法直接與此目錄的內(nèi)容進(jìn)行交互。您可以將其安裝到容器中叮姑,然后可以檢查其元數(shù)據(jù)或?qū)⑵鋭h除唉地。 Docker管理卷中的讀寫文件。

另一個(gè)很大的區(qū)別是當(dāng)您公開現(xiàn)有容器目錄時(shí)會(huì)發(fā)生什么传透。

如果將本地目錄綁定到現(xiàn)有容器目錄耘沼,則本地目錄中的內(nèi)容會(huì)模糊容器目錄的內(nèi)容 - 如果將本地couchdb-config目錄綁定到CouchDB容器的local.d目錄,則會(huì)發(fā)生這種情況朱盐。您有效地覆蓋容器目錄群嗤。別擔(dān)心,原始目錄仍然是只讀鏡像兵琳!

如果將容器目錄公開為volume狂秘,則會(huì)將其內(nèi)容復(fù)制到主機(jī)上的卷中。當(dāng)您使用CouchDB容器的/ opt / couchdb / data目錄作為目標(biāo)創(chuàng)建couchdbVolume時(shí)躯肌,會(huì)發(fā)生這種情況者春。

5. --mount or --volume?

您還可以使用兩個(gè)不同的選項(xiàng)來(lái)裝入卷或綁定裝載本地目錄。 他們做同樣的事情 - 他們只是使用不同的語(yǔ)法清女。

--mount選項(xiàng)比--volume更新钱烟。 它使用逗號(hào)分隔的key=value對(duì),鍵的順序無(wú)關(guān)緊要嫡丙。 此選項(xiàng)沒(méi)有速記版本拴袭。

--volume標(biāo)志,簡(jiǎn)寫-v曙博,有三個(gè)冒號(hào)分隔的字段:順序很重要拥刻,但你必須記住或查找每個(gè)字段的含義。

Docker文檔建議使用--mount選項(xiàng)而不是-v選項(xiàng):它更詳細(xì)羊瘩,但這使得理解和記憶更容易泰佳。

以下兩個(gè)命令是等效的 - 它們將當(dāng)前本地目錄bind-mount安裝到容器中的新/ home目錄:

docker run --mount type=bind,source=/`pwd`,target=/home ibmcom/kitura-ubuntu
docker run -v $PWD:/home ibmcom/kitura-ubuntu

以下兩個(gè)命令是等效的 - 它們?cè)?code>Docker的存儲(chǔ)目錄中創(chuàng)建一個(gè)卷:

docker run --mount source=KituraVolume,target=/Kitura-Starter ibmcom/kitura-ubuntu

注意:type=volume是默認(rèn)的盼砍。

docker run -v KituraVolume:/Kitura-Starter ibmcom/kitura-ubuntu

注意:-v選項(xiàng)的第一個(gè)字段是名稱尘吗,而不是路徑逝她,因此Docker創(chuàng)建卷,而不是bind mount.睬捶。

兩個(gè)命令都將/ Kitura-Starter的內(nèi)容復(fù)制到名為KituraVolume的卷中黔宛。 然后Kitura容器安裝并使用KituraVolume。 您可以將KituraVolume安裝在其他容器中擒贸,以便他們?cè)L問(wèn)其內(nèi)容臀晃。

您可以指定read-only訪問(wèn)權(quán)限:

docker run --mount source=KituraVolume,target=/Kitura-Starter,readonly --name kitura ibmcom/kitura-ubuntu
docker run -v KituraVolume:/Kitura-Starter:ro --name kitura ibmcom/kitura-ubuntu

這是來(lái)自Docker文檔的--mount--volume的行為之間的另一個(gè)區(qū)別:

  • 如果使用-v--volume綁定安裝Docker主機(jī)上尚不存在的文件或目錄,則-v會(huì)為您創(chuàng)建端點(diǎn)介劫。 它始終作為目錄創(chuàng)建徽惋。
  • 如果使用--mount綁定安裝Docker主機(jī)上尚不存在的文件或目錄,則Docker不會(huì)自動(dòng)為您創(chuàng)建它座韵,但會(huì)生成錯(cuò)誤险绘。

請(qǐng)注意,如果使用-v將主機(jī)上不存在的目錄綁定安裝到容器中存在的目錄誉碴,則會(huì)將其創(chuàng)建為主機(jī)上的空目錄宦棺,因此其空白會(huì)遮蓋原始目錄容器中的內(nèi)容。 例如黔帕,如果您嘗試使用-v $ PWD / kitura-dir:Kitura-StarterKitura-Starter目錄從容器復(fù)制到本地文件系統(tǒng)代咸,那么您所獲得的只是文件系統(tǒng)中的空目錄容器。

6. Copying Files Between Host & Container - 在主機(jī)和容器之間復(fù)制文件

如果您只想將正在運(yùn)行的Docker容器中的文件或目錄保存到本地系統(tǒng)成黄,則可以復(fù)制它:

docker cp kitura:/Kitura-Starter . 

您還可以將文件或目錄從本地系統(tǒng)復(fù)制到容器:

docker cp kilroy.txt kitura:/var/tmp 

Summary of Docker Commands - Docker命令總結(jié)

你在本教程中看到了很多Docker命令呐芥! 以下是它們的列表。 方括號(hào)中的術(shù)語(yǔ)(如[image])是特定名稱或ID的占位符奋岁。

docker run命令:

docker run [options] [image] [command for -it options]

您在本教程中使用的docker run選項(xiàng):

- --detach / -d
- --env / -e [ENV_VAR=value] 
- --interactive --tty / -it ... [command]
- --name [name]
- --network [network]
- --mount source=[volume],target=[container-dir]
- --publish / -p [host port]:[container port]
- --volume / -v [host-dir]:[container-dir]

您在本教程中使用的其他Docker命令(加上一兩個(gè)您沒(méi)見過(guò)的相關(guān)命令):

- docker pull [image]
- docker images or docker image ls
- docker ps -a or docker container ls -a
- docker ps -a -q -f [filter condition]
- docker exec -it [container] bash
- docker stop [container]
- docker start [container]
- docker rm $(docker ps -a -q -f status=exited)
- docker rm $(docker stop $(docker ps -q))
- docker rm [container IDs or names] 
- docker rmi [image] or docker image rm [image]
- docker container inspect [container]
- docker network create [network-name]
- docker network inspect [network-name]
- docker network ls
- docker network prune
- docker volume create [volume-name]
- docker volume inspect [volume-name]
- docker volume ls
- docker volume prune
- docker cp [container:container-path] [host-path]
- docker cp [host-path] [container:container-path] 

一些有用的方法來(lái)分離在前臺(tái)運(yùn)行的容器:

  • Control-P-Q在不停止容器的情況下分離
  • 如果容器位于前臺(tái)贩耐,因?yàn)槟\(yùn)行了docker run -it ... bash,則在bash shell提示符處退出會(huì)停止容器厦取。
  • 如果容器位于前臺(tái)潮太,因?yàn)槟\(yùn)行了docker exec -it ... bash,則exit bash shell提示符退出bash shell但不會(huì)停止容器虾攻。

本教程向您介紹了Docker的一小部分功能和可能性铡买。 它沒(méi)有涉及創(chuàng)建自己的Docker鏡像,組成Docker服務(wù)霎箍,使用Docker for CI / CD奇钞,集群和使用Docker Swarm調(diào)度容器等等。 希望本教程為您探索Docker世界提供了堅(jiān)實(shí)的基礎(chǔ)漂坏。 以下是一些可以幫助您的資源:

后記

本篇主要講述了在macOS上使用Docker拒啰,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市完慧,隨后出現(xiàn)的幾起案子谋旦,更是在濱河造成了極大的恐慌,老刑警劉巖屈尼,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册着,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脾歧,警方通過(guò)查閱死者的電腦和手機(jī)甲捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鞭执,“玉大人司顿,你說(shuō)我怎么就攤上這事〔隙” “怎么了免猾?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)囤热。 經(jīng)常有香客問(wèn)我猎提,道長(zhǎng),這世上最難降的妖魔是什么旁蔼? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任锨苏,我火速辦了婚禮,結(jié)果婚禮上棺聊,老公的妹妹穿的比我還像新娘伞租。我一直安慰自己,他們只是感情好限佩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布葵诈。 她就那樣靜靜地躺著,像睡著了一般祟同。 火紅的嫁衣襯著肌膚如雪作喘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天晕城,我揣著相機(jī)與錄音泞坦,去河邊找鬼。 笑死砖顷,一個(gè)胖子當(dāng)著我的面吹牛贰锁,可吹牛的內(nèi)容都是我干的赃梧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼豌熄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼授嘀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起房轿,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粤攒,失蹤者是張志新(化名)和其女友劉穎所森,沒(méi)想到半個(gè)月后囱持,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焕济,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年纷妆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴弃。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掩幢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上鞠,到底是詐尸還是另有隱情际邻,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布芍阎,位于F島的核電站世曾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谴咸。R本人自食惡果不足惜轮听,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岭佳。 院中可真熱鬧血巍,春花似錦、人聲如沸珊随。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叶洞。三九已至鲫凶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間京办,已是汗流浹背掀序。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭婿,地道東北人不恭。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓叶雹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親换吧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子折晦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容