版本記錄
版本號(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)行的EmojiJournalServer
在couchdbVolume
中查找并加載日記條目數(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 here
的kilroy.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 run
或docker 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-Starter
將Kitura-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ǔ)漂坏。 以下是一些可以幫助您的資源:
- Docker’s documentation非常全面且非常有用景埃。
- 你可以在網(wǎng)上找到很多
Docker cheat sheets
媒至,比如github.com/wsargent/docker-cheat-sheet和devhints.io/docker。 - Awesome Docker是Docker資源和項(xiàng)目的精選列表谷徙。
后記
本篇主要講述了在macOS上使用Docker拒啰,感興趣的給個(gè)贊或者關(guān)注~~~