Docker基本常用操作

一事扭、運(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)行所必需的袍镀。除此 之外,并沒有其它的資源冻晤∥郏可以在偽終端中利用 pstop 來查看進(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

這樣就可以記錄在容器輸入過的命令了钓株。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末实牡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轴合,更是在濱河造成了極大的恐慌创坞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件值桩,死亡現(xiàn)場(chǎng)離奇詭異摆霉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奔坟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門携栋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咳秉,你說我怎么就攤上這事婉支。” “怎么了澜建?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵向挖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我炕舵,道長(zhǎng)何之,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任咽筋,我火速辦了婚禮溶推,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蒜危,他們只是感情好虱痕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辐赞,像睡著了一般部翘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上响委,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天新思,我揣著相機(jī)與錄音,去河邊找鬼晃酒。 笑死表牢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贝次。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼彰导,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛔翅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起位谋,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤山析,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掏父,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笋轨,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年赊淑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爵政。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陶缺,死狀恐怖钾挟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饱岸,我是刑警寧澤掺出,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站苫费,受9級(jí)特大地震影響汤锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜百框,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一闲礼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦位仁、人聲如沸柑贞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧嘶。三九已至,卻和暖如春琳疏,著一層夾襖步出監(jiān)牢的瞬間有决,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工空盼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书幕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓揽趾,卻偏偏與公主長(zhǎng)得像台汇,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篱瞎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354