一事扭、運(yùn)行
docker run -it --rm \
ubuntu:18.04 \
bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
docker run
就是運(yùn)行容器的命令魄揉,具體格式我們會(huì)在 容器 一節(jié)進(jìn)行詳細(xì)講解随橘, 我們這里簡(jiǎn)要的說明一下上面用到的參數(shù)蕴坪。
-
-it
:這是兩個(gè)參數(shù),一個(gè)是-i
:交互式操作碌廓,一個(gè)是-t
終端传轰。我們這里打算進(jìn)入bash
執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端氓皱。 -
--rm
:這個(gè)參數(shù)是說容器退出后隨之將其刪除路召。默認(rèn)情況下勃刨,為了排障需求波材,退出的容器并不會(huì)立即刪除,除非手動(dòng)docker rm
身隐。我們這里只是隨便執(zhí)行個(gè)命令廷区,看看結(jié)果,不需要排障和保留結(jié)果贾铝,因此使用--rm
可以避免 浪費(fèi)空間隙轻。 -
ubuntu:18.04
:這是指用ubuntu:18.04
鏡像為基礎(chǔ)來啟動(dòng)容器。 -
bash
:放在鏡像名后的是 命令垢揩,這里我們希望有個(gè)交互式Shell
玖绿,因此用的是bash
。
進(jìn)入容器后叁巨,我們可以在 Shell 下操作斑匪,執(zhí)行任何所需的命令。這里锋勺,我們執(zhí)行了 cat /etc/os-release
蚀瘸,這是 Linux 常用的查看當(dāng)前系統(tǒng)版本的命令狡蝶,從返回的 結(jié)果可以看到容器內(nèi)是 Ubuntu 18.04.1 LTS
系統(tǒng)。
最后我們通過exit
退出了這個(gè)容器贮勃。
二贪惹、列出鏡像
要想列出已經(jīng)下載下來的鏡像,可以使用docker image ls
命令
docker image ls
列表包含了倉庫名寂嘉、標(biāo)簽 奏瞬、鏡像 ID、創(chuàng)建時(shí)間以及所占用的空間泉孩。
其中倉庫名丝格、標(biāo)簽在之前的基礎(chǔ)概念章節(jié)已經(jīng)介紹過了。鏡像 ID則是鏡像的唯一 標(biāo)識(shí)棵譬,一個(gè)鏡像可以對(duì)應(yīng)多個(gè) 標(biāo)簽显蝌。因此,在上面的例子中订咸,我們可以看到 ubuntu:18.04 和 ubuntu:latest 擁有相同的 ID曼尊,因?yàn)樗鼈儗?duì)應(yīng)的是同一個(gè)鏡像。
查看鏡像脏嚷、容器骆撇、數(shù)據(jù)卷所占用的空間
docker system df
顯示中間層鏡像
為了加速鏡像構(gòu)建、重復(fù)利用資源父叙,Docker 會(huì)利用 中間層鏡像神郊。所以在使用一段 時(shí)間后,可能會(huì)看到一些依賴的中間層鏡像趾唱。默認(rèn)的 docker image ls
列表中 只會(huì)顯示頂層鏡像涌乳,如果希望顯示包括中間層鏡像在內(nèi)的所有鏡像的話,需要加 -a
參數(shù)甜癞。
docker image ls -a
這樣會(huì)看到很多無標(biāo)簽的鏡像夕晓,與之前的虛懸鏡像不同,這些無標(biāo)簽的鏡像很多都 是中間層鏡像悠咱,是其它鏡像所依賴的鏡像蒸辆。這些無標(biāo)簽鏡像不應(yīng)該刪除,否則會(huì)導(dǎo) 致上層鏡像因?yàn)橐蕾噥G失而出錯(cuò)析既。實(shí)際上躬贡,這些鏡像也沒必要?jiǎng)h除,因?yàn)橹罢f 過眼坏,相同的層只會(huì)存一遍拂玻,而這些鏡像是別的鏡像的依賴,因此并不會(huì)因?yàn)樗鼈儽?列出來而多存了一份,無論如何你也會(huì)需要它們纺讲。只要?jiǎng)h除那些依賴它們的鏡像 后擂仍,這些依賴的中間層鏡像也會(huì)被連帶刪除。
列出部分鏡像
不加任何參數(shù)的情況下熬甚,docker image ls
會(huì)列出所有頂層鏡像逢渔,但是有時(shí)候我們只希望列出部分鏡像。docker image ls
有好幾個(gè)參數(shù)可以幫助做到這個(gè)事情乡括。
根據(jù)倉庫名列出鏡像
docker image ls ubuntu
列出特定的某個(gè)鏡像肃廓,也就是說指定倉庫名和標(biāo)簽
docker image ls ubuntu:18.04
除此以外, docker image ls
還支持強(qiáng)大的過濾器參數(shù) --filter
诲泌,或者簡(jiǎn)寫 -f
盲赊。之前我們已經(jīng)看到了使用過濾器來列出虛懸鏡像的用法,它還有更多的用 法敷扫。比如哀蘑,我們希望看到在 mongo:3.2
之后建立的鏡像,可以用下面的命令:
docker image ls -f since=mongo:3.2
想查看某個(gè)位置之前的鏡像也可以葵第,只需要把since
換成before
即可绘迁。此外,如果鏡像構(gòu)建時(shí)卒密,定義了LABEL
缀台,還可以通LABEL
來過濾。
docker image ls -f label=com.example.version=0.1
以特定格式顯示
默認(rèn)情況下哮奇,docker image ls
會(huì)輸出一個(gè)完整的表格膛腐,但是我們并非所有時(shí)候 都會(huì)需要這些內(nèi)容。比如鼎俘,剛才刪除虛懸鏡像的時(shí)候哲身,我們需要利用 docker image ls
把所有的虛懸鏡像的 ID 列出來,然后才可以交給 docker image rm
命令作為參數(shù)來刪除指定的這些鏡像而芥,這個(gè)時(shí)候就用到了 -q
參數(shù)律罢。
docker image ls -q
三、刪除本地鏡像
如果要?jiǎng)h除本地的鏡像棍丐,可以使用docker image rm
命令,其格式為:
docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]
用 ID沧踏、鏡像名歌逢、摘要?jiǎng)h除鏡像
其中,<鏡像>可以是鏡像短 ID翘狱、鏡像長(zhǎng) ID秘案、鏡像名或者鏡像摘要。
我們可以用鏡像的完整 ID,也稱為 長(zhǎng) ID 阱高,來刪除鏡像赚导。使用腳本的時(shí)候可能會(huì) 用長(zhǎng) ID,但是人工輸入就太累了赤惊,所以更多的時(shí)候是用 短 ID 來刪除鏡 像吼旧。 docker image ls
默認(rèn)列出的就已經(jīng)是短 ID 了,一般取前3個(gè)字符以上未舟,
只要足夠區(qū)分于別的鏡像就可以了圈暗。
Untagged 和 Deleted
如果觀察上面這幾個(gè)命令的運(yùn)行輸出信息的話,你會(huì)注意到刪除行為分為兩類裕膀,一 類是 Untagged
员串,另一類是Deleted
。我們之前介紹過昼扛,鏡像的唯一標(biāo)識(shí)是其 ID 和摘要寸齐,而一個(gè)鏡像可以有多個(gè)標(biāo)簽。
因此當(dāng)我們使用上面命令刪除鏡像的時(shí)候抄谐,實(shí)際上是在要求刪除某個(gè)標(biāo)簽的鏡像访忿。 所以首先需要做的是將滿足我們要求的所有鏡像標(biāo)簽都取消,這就是我們看到的 Untagged
的信息斯稳。因?yàn)橐粋€(gè)鏡像可以對(duì)應(yīng)多個(gè)標(biāo)簽海铆,因此當(dāng)我們刪除了所指定 的標(biāo)簽后,可能還有別的標(biāo)簽指向了這個(gè)鏡像挣惰,如果是這種情況卧斟,那么Delete
行為就不會(huì)發(fā)生。所以并非所有的 docker image rm
都會(huì)產(chǎn)生刪除鏡像的行 為憎茂,有可能僅僅是取消了某個(gè)標(biāo)簽而已珍语。
當(dāng)該鏡像所有的標(biāo)簽都被取消了,該鏡像很可能會(huì)失去了存在的意義竖幔,因此會(huì)觸發(fā) 刪除行為板乙。鏡像是多層存儲(chǔ)結(jié)構(gòu),因此在刪除的時(shí)候也是從上層向基礎(chǔ)層方向依次 進(jìn)行判斷刪除拳氢。鏡像的多層結(jié)構(gòu)讓鏡像復(fù)用變得非常容易募逞,因此很有可能某個(gè)其它 鏡像正依賴于當(dāng)前鏡像的某一層。這種情況馋评,依舊不會(huì)觸發(fā)刪除該層的行為放接。直到 沒有任何層依賴當(dāng)前層時(shí),才會(huì)真實(shí)的刪除當(dāng)前層留特。這就是為什么纠脾,有時(shí)候會(huì)奇 怪玛瘸,為什么明明沒有別的標(biāo)簽指向這個(gè)鏡像,但是它還是存在的原因苟蹈,也是為什么 有時(shí)候會(huì)發(fā)現(xiàn)所刪除的層數(shù)和自己 docker pull
看到的層數(shù)不一樣的原因糊渊。
除了鏡像依賴以外,還需要注意的是容器對(duì)鏡像的依賴慧脱。如果有用這個(gè)鏡像啟動(dòng)的 容器存在(即使容器沒有運(yùn)行)渺绒,那么同樣不可以刪除這個(gè)鏡像。之前講過磷瘤,容器 是以鏡像為基礎(chǔ)芒篷,再加一層容器存儲(chǔ)層,組成這樣的多層存儲(chǔ)結(jié)構(gòu)去運(yùn)行的采缚。因此該鏡像如果被這個(gè)容器所依賴的针炉,那么刪除必然會(huì)導(dǎo)致故障。如果這些容器是不需 要的扳抽,應(yīng)該先將它們刪除篡帕,然后再來刪除鏡像。
用 docker image ls 命令來配合
像其它可以承接多個(gè)實(shí)體的命令一樣贸呢,可以使用 docker image ls -q
來配合使 用 docker image rm
镰烧,這樣可以成批的刪除希望刪除的鏡像。我們?cè)凇扮R像列表”章節(jié)介紹過很多過濾鏡像列表的方式都可以拿過來使用楞陷。
比如怔鳖,我們需要?jiǎng)h除所有倉庫名為redis
的鏡像:
docker image rm $(docker image ls -q redis)
或者刪除所有在mongo:3.2
之前的鏡像:
docker image rm $(docker image ls -q -f before=mongo:3.2)
充分利用你的想象力和 Linux 命令行的強(qiáng)大,你可以完成很多非常贊的功能固蛾。
三结执、操作 Docker 容器
容器是 Docker 又一核心概念。
簡(jiǎn)單的說艾凯,容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用献幔,以及它們的運(yùn)行態(tài)環(huán)境。對(duì)應(yīng)的趾诗, 虛擬機(jī)可以理解為模擬運(yùn)行的一整套操作系統(tǒng)(提供了運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán) 境)和跑在上面的應(yīng)用蜡感。
本節(jié)將具體介紹如何來管理一個(gè)容器,包括創(chuàng)建恃泪、啟動(dòng)和停止等郑兴。
啟動(dòng)容器
啟動(dòng)容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動(dòng)悟泵,另外一個(gè)是將在終止 狀態(tài)(stopped
)的容器重新啟動(dòng)杈笔。
因?yàn)?Docker 的容器實(shí)在太輕量級(jí)了,很多時(shí)候用戶都是隨時(shí)刪除和新創(chuàng)建容器糕非。
新建并啟動(dòng)
所需要的命令主要為docker run
蒙具。 例如,下面的命令輸出一個(gè) “Hello World”朽肥,之后終止容器禁筏。
docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world
這跟在本地直接執(zhí)行 /bin/echo 'hello world'
幾乎感覺不出任何區(qū)別。 下面的命令則啟動(dòng)一個(gè) bash 終端衡招,允許用戶進(jìn)行交互篱昔。
docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
其中,-t
選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入 上始腾,-i
則讓容器的標(biāo)準(zhǔn)輸入保持打開州刽。
在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令浪箭,例如
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin
srv sys tmp usr var
當(dāng)利用 docker run
來創(chuàng)建容器時(shí)穗椅,Docker 在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器
- 分配一個(gè)文件系統(tǒng)奶栖,并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
- 從地址池配置一個(gè) ip 地址給容器
- 執(zhí)行用戶指定的應(yīng)用程序 執(zhí)行完畢后容器被終止
啟動(dòng)已終止容器
可以利用 docker container start
命令匹表,直接將一個(gè)已經(jīng)終止的容器啟動(dòng)運(yùn)行。
容器的核心為所執(zhí)行的應(yīng)用程序宣鄙,所需要的資源都是應(yīng)用程序運(yùn)行所必需的袍镀。除此 之外,并沒有其它的資源冻晤∥郏可以在偽終端中利用 ps
或 top
來查看進(jìn)程信息。
root@ba267838cc1b:/# ps
可見鼻弧,容器中僅運(yùn)行了指定的 bash 應(yīng)用设江。這種特點(diǎn)使得 Docker 對(duì)資源的利用率 極高,是貨真價(jià)實(shí)的輕量級(jí)虛擬化温数。
后臺(tái)運(yùn)行
更多的時(shí)候绣硝,需要讓 Docker 在后臺(tái)運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時(shí)撑刺,可以通過添加 -d
參數(shù)來實(shí)現(xiàn)鹉胖。 下面舉兩個(gè)例子來說明一下。 如果不使用 -d
參數(shù)運(yùn)行容器够傍。
$ docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
此時(shí)容器會(huì)在后臺(tái)運(yùn)行并不會(huì)把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面(輸出結(jié) 果可以用 docker logs
查看)甫菠。 注: 容器是否會(huì)長(zhǎng)久運(yùn)行,是和 docker run
指定的命令有關(guān)冕屯,和 -d
參數(shù)無 關(guān)寂诱。 使用 -d
參數(shù)啟動(dòng)后會(huì)返回一個(gè)唯一的 id
,也可以通過 docker container ls
命令來查看容器信息安聘。要獲取容器的輸出信息痰洒,可以通過docker container logs
命令瓢棒。
終止容器
可以使用 docker container stop
來終止一個(gè)運(yùn)行中的容器。 此外丘喻,當(dāng) Docker 容器中指定的應(yīng)用終結(jié)時(shí)脯宿,容器也自動(dòng)終止。 例如對(duì)于上一章節(jié)中只啟動(dòng)了一個(gè)終端的容器泉粉,用戶通過 exit
來退出終端時(shí)连霉,所創(chuàng)建的容器立刻終止。
終止?fàn)顟B(tài)的容器可以用 docker container ls -a
命令看到嗡靡。
處于終止?fàn)顟B(tài)的容器跺撼,可以通過docker container start
命令來重新啟動(dòng)。
此外讨彼,docker container restart
命令會(huì)將一個(gè)運(yùn)行態(tài)的容器終止歉井,然后再重新啟動(dòng)它。
進(jìn)入容器
在使用-d
參數(shù)時(shí)点骑,容器啟動(dòng)后會(huì)進(jìn)入后臺(tái)酣难。 某些時(shí)候需要進(jìn)入容器進(jìn)行操作,包括使用 docker attach
命令或 docker exec
命令黑滴,推薦大家使用 docker exec
命令憨募,原因會(huì)在下面說明。
attach
命令
下面示例如何使用docker attach
命令袁辈。
docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
docker container ls
docker attach 243c
root@243c32535da7:/#
注意: 如果從這個(gè) stdin 中 exit菜谣,會(huì)導(dǎo)致容器的停止。
exec
命令
-i
-t
參數(shù)
docker exec
后邊可以跟多個(gè)參數(shù)晚缩,這里主要說明-i
-t
參數(shù)尾膊。
只用 -i
參數(shù)時(shí),由于沒有分配偽終端荞彼,界面沒有我們熟悉的 Linux 命令提示符冈敛,但命令執(zhí)行結(jié)果仍然可以返回。
當(dāng) -i
-t
參數(shù)一起使用時(shí)鸣皂,則可以看到我們熟悉的 Linux 命令提示符抓谴。
docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6
docker container ls
docker exec -i 69d1 bash
ls
bin
boot
dev
docker exec -it 69d1 bash
root@69d137adef7a:/#
如果從這個(gè) stdin 中 exit,不會(huì)導(dǎo)致容器的停止寞缝。這就是為什么推薦大家使用 docker exec
的原因癌压。
更多參數(shù)說明請(qǐng)使用docker exec --help
查看。
導(dǎo)出和導(dǎo)入容器
導(dǎo)出容器
如果要導(dǎo)出本地某個(gè)容器荆陆,可以使用docker export
命令滩届。
docker container ls -a
docker export 7691a814370e > ubuntu.tar
這樣將導(dǎo)出容器快照到本地文件。
導(dǎo)入容器快照
可以使用docker import
從容器快照文件中再導(dǎo)入為鏡像被啼,例如
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker image ls
此外帜消,也可以通過指定 URL 或者某個(gè)目錄來導(dǎo)入棠枉,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
注:用戶既可以使用 docker load
來導(dǎo)入鏡像存儲(chǔ)文件到本地鏡像庫,也可以使用docker import
來導(dǎo)入一個(gè)容器快照到本地鏡像庫券犁。這兩者的區(qū)別在于容 器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài))术健,而鏡像存儲(chǔ)文件將保存完整記錄汹碱,體積也要大粘衬。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息咳促。
刪除容器
可以使用docker container rm
來刪除一個(gè)處于終止?fàn)顟B(tài)的容器稚新。例如
docker container rm trusting_newton
如果要?jiǎng)h除一個(gè)運(yùn)行中的容器,可以添加-f
參數(shù)跪腹。Docker 會(huì)發(fā)送SIGKILL
信號(hào)給容器褂删。
清理所有處于終止?fàn)顟B(tài)的容器
用 docker container ls -a
命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器,如果數(shù)量太多要一個(gè)個(gè)刪除可能會(huì)很麻煩冲茸,用下面的命令可以清理掉所有處于終止?fàn)顟B(tài)的容器屯阀。
docker container prune
四、Docker 數(shù)據(jù)管理
這一節(jié)介紹如何在 Docker 內(nèi)部以及容器之間管理數(shù)據(jù)轴术,在容器中管理數(shù)據(jù)主要有兩種方式:
- 數(shù)據(jù)卷(Volumes)
- 掛載主機(jī)目錄 (Bind mounts)
數(shù)據(jù)卷
數(shù)據(jù)卷
是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄难衰,它繞過 UFS,可以提供很多有用的特性:
-
數(shù)據(jù)卷
可以在容器之間共享和重用 - 對(duì)
數(shù)據(jù)卷
的修改會(huì)立馬生效 - 對(duì)
數(shù)據(jù)卷
的更新逗栽,不會(huì)影響鏡像 -
數(shù)據(jù)卷
默認(rèn)會(huì)一直存在盖袭,即使容器被刪除
注意:
數(shù)據(jù)卷
的使用,類似于 Linux 下對(duì)目錄或文件進(jìn)行 mount彼宠,鏡像中的被指定為掛載點(diǎn)的目錄中的文件會(huì)隱藏掉鳄虱,能顯示看的是掛載的數(shù)據(jù)卷
。
創(chuàng)建一個(gè)數(shù)據(jù)卷
docker volume create my-vol
查看所有的數(shù)據(jù)卷
docker volume ls
在主機(jī)里使用以下命令可以查看指定數(shù)據(jù)卷
的信息
docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
啟動(dòng)一個(gè)掛載數(shù)據(jù)卷的容器
在用 docker run
命令的時(shí)候凭峡,使用--mount
標(biāo)記來將數(shù)據(jù)卷
掛載到容器里拙已。在一次 docker run
中可以掛載多個(gè)數(shù)據(jù)卷
。
下面創(chuàng)建一個(gè)名為web
的容器摧冀,并加載一個(gè)數(shù)據(jù)卷
到容器的/webapp
目錄倍踪。
docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py
查看數(shù)據(jù)卷的具體信息
在主機(jī)里使用以下命令可以查看web
容器的信息
docker inspect web
數(shù)據(jù)卷
信息在 "Mounts" Key 下面
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
刪除數(shù)據(jù)卷
docker volume rm my-vol
數(shù)據(jù)卷
是被設(shè)計(jì)用來持久化數(shù)據(jù)的,它的生命周期獨(dú)立于容器按价,Docker 不會(huì)在 容器被刪除后自動(dòng)刪除數(shù)據(jù)卷
惭适,并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的數(shù)據(jù)卷
。如果需要在刪除容器的同時(shí)移除數(shù)據(jù)卷楼镐●荆可以在刪除容器的時(shí)候使用docker rm -v
這個(gè)命令。
無主的數(shù)據(jù)卷可能會(huì)占據(jù)很多空間框产,要清理請(qǐng)使用以下命令
docker volume prune
掛載主機(jī)目錄
掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷
使用--mount
標(biāo)記可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去凄杯。
docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
上面的命令加載主機(jī)的 /src/webapp
目錄到容器的 /opt/webapp
目錄错洁。這個(gè) 功能在進(jìn)行測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中戒突,來查看容器是否正常工作屯碴。本地目錄的路徑必須是絕對(duì)路徑,以前使用 -v
參數(shù)時(shí)如果本地目錄不存在 Docker 會(huì)自動(dòng)為你創(chuàng)建一個(gè)文件夾膊存,現(xiàn)在使用 --mount
參數(shù)時(shí)如果本地目錄不存在导而,Docker 會(huì)報(bào)錯(cuò)。
Docker 掛載主機(jī)目錄的默認(rèn)權(quán)限是讀寫
隔崎,用戶也可以通過增加 readonly
指定為只讀
今艺。
docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly
之后,就掛載為只讀
了爵卒,如果你在容器內(nèi)/opt/webapp
目錄新建文件虚缎,會(huì)顯示如下錯(cuò)誤
/opt/webapp # touch new.txt
touch: new.txt: Read-only file system
查看數(shù)據(jù)卷的具體信息
在主機(jī)里使用以下命令可以查看web
容器的信息。
docker inspect web
掛載主機(jī)目錄
的配置信息在 "Mounts" Key 下面
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/opt/webapp",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
掛載一個(gè)本地主機(jī)文件作為數(shù)據(jù)卷
--mount
標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中
$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.ba
sh_history \
ubuntu:18.04 \
bash
root@2affd44b4667:/# history
1 ls
2 diskutil list
這樣就可以記錄在容器輸入過的命令了钓株。