Docker 的鏡像與容器

Docker 是基于 linux 內(nèi)核的 cgroup 和 namespace 等實(shí)現(xiàn)的進(jìn)程隔離技術(shù)癣亚,是操作系統(tǒng)層面的虛擬化技術(shù)。由于進(jìn)程在宿主機(jī)上被分割成獨(dú)立的空間获印,就像一個獨(dú)立的容器將這些進(jìn)程與外界隔離開來述雾,因此被稱為容器。

Docker 容器與傳統(tǒng)的虛擬化技術(shù)最大的區(qū)別在于兼丰,傳統(tǒng)的虛擬化技術(shù)是在宿主機(jī)器上虛擬出一套硬件后玻孟,在其上面運(yùn)行完整的操作系統(tǒng),然后在該系統(tǒng)上運(yùn)行用戶進(jìn)程鳍征,屬于硬件層面的虛擬化技術(shù)黍翎。而 docker 是操作系統(tǒng)層面的虛擬化技術(shù),不需要虛擬化硬件艳丛,同一宿主機(jī)器上的所有容器共享宿主機(jī)的硬件和操作系統(tǒng)內(nèi)核匣掸,只是在用戶態(tài)隔離進(jìn)程的運(yùn)行環(huán)境和存儲空間,因此對于上層用戶而言一個容器就好像是一臺獨(dú)立的主機(jī)氮双。下圖是 docker 官網(wǎng)上的一張對比圖旺聚,左邊描述的是 docker 容器技術(shù)正林,右邊描述的是傳統(tǒng)的虛擬機(jī)技術(shù)鼻听。

docker與虛擬機(jī)的區(qū)別

這個區(qū)別使得 docker 相比與傳統(tǒng)的虛擬化技術(shù)要輕量的多遂蛀,啟動一個虛擬機(jī)需要占用幾 G 到幾十 G 的磁盤空間古胆,需要的時間也是幾分鐘到十幾分鐘不等绳矩,而啟動一個容器只一般只要幾十 M 到上百 M十偶,啟動的速度更是可以在秒級時間內(nèi)完成学歧。

Docker 中有三個最重要的概念:鏡像勾效、容器和倉庫饭入。弄懂這三個概念就可以使用基本的容器了嵌器。首先你可以將容器想象成是一臺 linux 主機(jī),在這個主機(jī)中會啟動需要的進(jìn)程谐丢,比如一個 redis 的容器就會啟動一個 redis 的服務(wù)器爽航。而啟動一個容器需要鏡像蚓让,類似于安裝一個 linux 系統(tǒng)需要安裝包,你可以想象鏡像就是容器的安裝包讥珍。最后倉庫就是存放鏡像的地方历极,方便的是從這個倉庫下載鏡像只需要一個命令就能搞定,就像 apt-get 安裝軟件那樣方便衷佃。

使用鏡像

有了鏡像才能生成容器趟卸,因此我們先來了解鏡像。

下載鏡像——docker pull

下載鏡像使用 docker pull 命令來實(shí)現(xiàn)氏义,該命令格式如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • 可以通過 docker pull --help 查詢幫助信息
  • OPTIONS 中 -a 選項(xiàng)表示拉取所有標(biāo)簽的鏡像锄列,-q 選項(xiàng)表示靜默下載,不打印輸出信息到屏幕
  • NAME 由倉庫名/鏡像名:標(biāo)簽名的格式組成惯悠,倉庫名沒有則從默認(rèn)倉庫 library 拉取邻邮,也就是官方鏡像,鏡像名必須有克婶,標(biāo)簽名沒有則默認(rèn)拉取 latest 標(biāo)簽的鏡像饶囚。同一個鏡像名的鏡像可以有多個標(biāo)簽,一般每更新一個版本就新增一個標(biāo)簽鸠补,latest 標(biāo)簽就是最新的鏡像萝风。

比如可以這樣下載標(biāo)簽為 18.04 的 ubuntu 鏡像:

$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04

列出鏡像——docker image ls

docker image ls 命令可以列出系統(tǒng)中已經(jīng)下載了的所有鏡像。docker 中很多命令與 linux 的命令相似紫岩,因此在使用的時候可以類比规惰,docker 中有諸如 rm、ls泉蝌、ps等命令歇万。將了解更多的命令同樣可以通過 docker image --help 來查看幫助信息。

$ docker image ls         
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zookeeper           latest              e41846a619f5        17 hours ago        224MB
ubuntu              18.04               cf0f3ca922e0        3 days ago          64.2MB
ubuntu              latest              cf0f3ca922e0        3 days ago          64.2MB
redis               latest              f7302e4ab3a8        2 months ago        98.2MB
hello-world         latest              fce289e99eb9        9 months ago        1.84kB

列表分別包含了倉庫名勋陪、標(biāo)簽贪磺、鏡像ID創(chuàng)建時間诅愚、鏡像大小寒锚。docker image ls命令展示的是一個完整鏡像的大小,但是由于鏡像是分層存儲的违孝,不同的鏡像如果使用了相同的層刹前,這個層只會存儲一份數(shù)據(jù),所有鏡像公用雌桑,因此鏡像實(shí)際占用的空間大小要比顯示的小喇喉。

刪除鏡像——docker image rm

docker image rm 命令可以刪除鏡像,一般配合docker image ls命令來使用校坑。docker image rm命令的使用格式是:

docker image rm [OPTIONS] IMAGE [IMAGE...]
  • 使用 docker image rm --help 可以查看幫助信息
  • OPTIONS: --force/-f 強(qiáng)制刪除
  • 鏡像可以是鏡像名拣技,或者鏡像名加標(biāo)簽千诬,或者鏡像的ID

比如可以這樣刪除標(biāo)簽為 latest 的 ubuntu 鏡像:

$ docker image rm ubuntu:latest
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36

Untagged 和 Deleted
在執(zhí)行 docker image rm 時,出現(xiàn)了兩種情況膏斤,Untagged 和 Deleted徐绑。因?yàn)橥粋€鏡像(不只是同名,而是真正意義上的同一個)可以對應(yīng)多個標(biāo)簽掸绞,當(dāng)執(zhí)行 rm 命令時先移除這個指定的標(biāo)簽,只有當(dāng)移除的標(biāo)簽是最后一個標(biāo)簽的時候才會同時刪除這個鏡像耕捞。除此之外衔掸,因?yàn)殓R像是分層存儲的,要刪除的鏡像可能是別的鏡像的基礎(chǔ)層俺抽,如果刪除了這個鏡像也會導(dǎo)致依賴方出現(xiàn)問題敞映。因此,如果有別的鏡像依賴這個鏡像磷斧,那么這是這個鏡像也不會被刪除振愿。另外,如果有其他容器依賴于這個鏡像弛饭,那么也不能刪除這個鏡像冕末,因?yàn)閯h除這個鏡像必然會導(dǎo)致容器出現(xiàn)故障。

操作容器

運(yùn)行容器——docker run

運(yùn)行容器有兩種方式侣颂,一種是新建一個容器并啟動档桃,另一種是啟動一個已終止的容器。

docker run 命令用來新建一個容器并啟動憔晒,該命令的使用格式是:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

比如下面這個命令會通過 ubuntu 鏡像創(chuàng)建并運(yùn)行一個容器藻肄,然后執(zhí)行 /bin/bash 命令。

$ docker run -it ubuntu /bin/bash

其中常見的命令選項(xiàng)有:

  • -i 選項(xiàng)是讓容器標(biāo)準(zhǔn)輸入打開拒担,就可以接受鍵盤輸入了
  • -t 選項(xiàng)是讓docker分配一個偽終端嘹屯,綁定到標(biāo)準(zhǔn)輸入上。通過這個偽終端就可以像操作一臺 linux 機(jī)器來操作這個容器了从撼。
  • --name <容器名稱> 選項(xiàng)為容器指定一個名稱
  • -d 選項(xiàng)讓容器在后臺運(yùn)行州弟,什么是后臺運(yùn)行,下文有說明
  • -rm 選項(xiàng)是讓容器終止時自動銷毀

用這個命令啟動一個容器后低零,就可以像操作一臺普通的 ubuntu 機(jī)器一樣呆馁,操作這個容器了』僬祝可以嘗試在這個容器中執(zhí)行一些 linux 命令浙滤。

root@e7cd5bc73508:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   10 pts/0    00:00:00 ps

root@e7cd5bc73508:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

需要注意的是,對于這種以交互模式啟動的容器气堕,當(dāng)終止交互后纺腊,容器就退出了畔咧。

docker container start 可以啟動一個終止的容器,該命令的使用格式是:

docker container start [OPTIONS] CONTAINER [CONTAINER...]

要啟動一個容器揖膜,需要知道容器的ID來作為docker container start的參數(shù)誓沸,接下來介紹如何查看容器。

查詢?nèi)萜鳡顟B(tài)——docker container ls

docker container ls 列出所有正在運(yùn)行的容器

docker container ls -a 列出所有的容器壹粟,包括已經(jīng)終止的容器

列出的容器信息包括:

  • 容器ID(CONTAINER ID)拜隧,這是容器的唯一標(biāo)識,操作容器相關(guān)的命令都需要帶上這個標(biāo)識
  • 依賴的鏡像名稱(IMAGE)
  • 執(zhí)行的命令(COMMAND)
  • 創(chuàng)建的時間(CREATED)
  • 容器的狀態(tài)(STATUS)趁仙,UP 是運(yùn)行狀態(tài)洪添,Exited 是終止?fàn)顟B(tài)
  • 暴露的端口(PORTS)
  • 容器的名稱(NAMES),可以在啟動容器的時候通過 --name 選項(xiàng)指定容器的名稱雀费,如果沒有指定干奢,系統(tǒng)會生成一個默認(rèn)名稱

終止容器——docker container stop

docker container stop 命令用來終止一個正在運(yùn)行的容器

終止的容器可以通過 docker container start 命令啟動,docker container restart 命令會先終止容器盏袄,然后再啟動容器忿峻。

守護(hù)態(tài)運(yùn)行

大多數(shù)時候需要容器在后臺運(yùn)行,不需要將輸出結(jié)果打印到宿主主機(jī)上辕羽。此時逛尚,可以通過 -d 參數(shù)來實(shí)現(xiàn)。

不使用 -d 選項(xiàng)啟動下面這個容器刁愿,表現(xiàn)如下:

$ docker run ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
hello world

使用 -d 選項(xiàng)啟動這個容器黑低,表現(xiàn)如下:

$ docker run -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
574ee145e9ca501639a233601efe9574a356a8d7bdef461d240b2212b6aeaf77

在宿主的終端只輸出了該容器的 ID。如果需要查看容器的輸出可以使用 docker container logs 命令酌毡。本文在說容器的這些命令時都省略了最后一個參數(shù)容器 ID克握,這個讀者在使用的時候需要自行加上,查詢?nèi)萜?ID 的方法前面已經(jīng)介紹過了枷踏。如果想要持續(xù)獲取容器的輸出可以使用 docker container logs -f 命令菩暗。

進(jìn)入容器

使用 -d 參數(shù)啟動容器后,容器在后臺運(yùn)行旭蠕,如果需要進(jìn)入容器可以使用 docker attach 命令或 docker exec 命令停团。建議使用 docker exec 命令,原因在下面進(jìn)行說明掏熬。

docker attach

$ docker run -it -d ubuntu
2b10efdeaa9f0f24f0060bf636cc8f1bae9598f5e0176b498447a7b63ea10d06

$ docker container ls
CONTAINER ID    IMAGE     COMMAND       CREATED             STATUS              PORTS          NAMES
2b10efdeaa9f    ubuntu    "/bin/bash"   13 seconds ago      Up 11 seconds                      cocky_golick

$ docker attach 2b10efdeaa9f
root@2b10efdeaa9f:/# 

使用 attach 命令佑稠,如果從這個終端退出后,這個容器也會被終止旗芬,這就是不推薦使用 attach 命令的原因舌胶。

docker exec

$ docker run -it -d ubuntu
61299a9b910b029f9a8667131a45aff92fbc35633e4f86c8fcfb72e6362c5115

$ docker container ls
CONTAINER ID        IMAGE      COMMAND         CREATED             STATUS          PORTS           NAMES
61299a9b910b        ubuntu     "/bin/bash"     6 seconds ago       Up 5 seconds                    friendly_hawking

$ docker exec -it 61299a9b910b /bin/bash

使用 exec 命令,可以生成新的偽終端與容器進(jìn)行交互疮丛,因此退出時不會導(dǎo)致容器退出幔嫂。

刪除容器

docker container rm 命令可以刪除一個容器辆它,如果要刪除一個正在運(yùn)行的容器可以使用docker container rm -f

如果要清除所有終止的容器可以使用 docker container prune 命令履恩。

訪問倉庫

  • docker login 登錄到docker hub倉庫
  • docker logout 退出登錄
  • docker search <關(guān)鍵詞> 搜索鏡像
  • docker pull 從倉庫下載鏡像
  • docker push 將本地倉庫推送到遠(yuǎn)程倉庫

下面演示一下這些命令的使用:

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxx
Password: xxx
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

$ docker pull hello-world

# 為鏡像 hello-world 生成一個新的標(biāo)簽锰茉,而且指定倉庫為自己倉庫的用戶名
$ docker tag hello-world:latest oscarwin/hello-world:3.0

# 將鏡像推送到遠(yuǎn)程倉庫,那么就可以在 docker hub 里看到自己推送的這個鏡像了
$ docker push oscarwin/hello-world
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切心,一起剝皮案震驚了整個濱河市飒筑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绽昏,老刑警劉巖协屡,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異而涉,居然都是意外死亡著瓶,警方通過查閱死者的電腦和手機(jī)联予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門啼县,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沸久,你說我怎么就攤上這事季眷。” “怎么了卷胯?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵子刮,是天一觀的道長。 經(jīng)常有香客問我窑睁,道長挺峡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任担钮,我火速辦了婚禮橱赠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箫津。我一直安慰自己狭姨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布苏遥。 她就那樣靜靜地躺著饼拍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪田炭。 梳的紋絲不亂的頭發(fā)上师抄,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音教硫,去河邊找鬼司澎。 笑死欺缘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挤安。 我是一名探鬼主播谚殊,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛤铜!你這毒婦竟也來了嫩絮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤围肥,失蹤者是張志新(化名)和其女友劉穎剿干,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穆刻,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡置尔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氢伟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜轿。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朵锣,靈堂內(nèi)的尸體忽然破棺而出谬盐,到底是詐尸還是另有隱情,我是刑警寧澤诚些,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布飞傀,位于F島的核電站,受9級特大地震影響诬烹,放射性物質(zhì)發(fā)生泄漏砸烦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一绞吁、第九天 我趴在偏房一處隱蔽的房頂上張望幢痘。 院中可真熱鬧,春花似錦掀泳、人聲如沸雪隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脑沿。三九已至,卻和暖如春马僻,著一層夾襖步出監(jiān)牢的瞬間庄拇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留措近,地道東北人溶弟。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像瞭郑,于是被迫代替她去往敵國和親辜御。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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