鏡像的操作
- 下載鏡像
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]倉(cāng)庫(kù)名[:標(biāo)簽]
具體的選項(xiàng)可以通過(guò) docker pull --help 命令看到馏予,這里我們說(shuō)一下鏡像名稱的格式。
Docker 鏡像倉(cāng)庫(kù)地址:地址的格式一般是 <域名/IP>[:端口號(hào)]。默認(rèn)地址是 Docker Hub。
倉(cāng)庫(kù)名:如之前所說(shuō),這里的倉(cāng)庫(kù)名是兩段式名稱对粪,即 <用戶名>/<軟件名>。對(duì)于 Docker Hub装蓬,如果不給出用戶名著拭,則默認(rèn)為 library,也就是官方鏡像牍帚。
比如:
$ docker pull ubuntu:16.04
16.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:16.04
上面的命令中沒(méi)有給出 Docker 鏡像倉(cāng)庫(kù)地址儡遮,因此將會(huì)從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:16.04暗赶,因此將會(huì)獲取官方鏡像 library/ubuntu 倉(cāng)庫(kù)中標(biāo)簽為 16.04 的鏡像鄙币。
從下載過(guò)程中可以看到我們之前提及的分層存儲(chǔ)的概念肃叶,鏡像是由多層存儲(chǔ)所構(gòu)成。下載也是一層層的去下載十嘿,并非單一文件因惭。下載過(guò)程中給出了每一層的 ID 的前 12 位。并且下載結(jié)束后绩衷,給出該鏡像完整的 sha256 的摘要蹦魔,以確保下載一致性。
在使用上面命令的時(shí)候咳燕,你可能會(huì)發(fā)現(xiàn)勿决,你所看到的層 ID 以及 sha256 的摘要和這里的不一樣。這是因?yàn)楣俜界R像是一直在維護(hù)的招盲,有任何新的 bug低缩,或者版本更新,都會(huì)進(jìn)行修復(fù)再以原來(lái)的標(biāo)簽發(fā)布宪肖,這樣可以確保任何使用這個(gè)標(biāo)簽的用戶可以獲得更安全表制、更穩(wěn)定的鏡像健爬。
如果從 Docker Hub 下載鏡像非常緩慢控乾,說(shuō)明你沒(méi)有配置鏡像加速。
-
運(yùn)行
有了鏡像后娜遵,我們就能夠以這個(gè)鏡像為基礎(chǔ)啟動(dòng)并運(yùn)行一個(gè)容器蜕衡。以上面的 ubuntu:16.04 為例,如果我們打算啟動(dòng)里面的 bash 并且進(jìn)行交互式操作的話设拟,可以執(zhí)行下面的命令慨仿。
$ docker run -it --rm \
ubuntu:16.04 \
bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
(終端命令太長(zhǎng),換行輸入的方法是在文端末尾“\”+Enter侥呻省)
docker run 就是運(yùn)行容器的命令镰吆,我們這里簡(jiǎn)要的說(shuō)明一下上面用到的參數(shù)。
docker run 就是運(yùn)行容器的命令跑慕,我們這里簡(jiǎn)要的說(shuō)明一下上面用到的參數(shù)万皿。
- -it:這是兩個(gè)參數(shù),一個(gè)是-i:交互式操作核行,一個(gè)是 -t 終端牢硅。我們這里打算進(jìn)入 bash 執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端芝雪。
- --rm:這個(gè)參數(shù)是說(shuō)容器退出后隨之將其刪除减余。默認(rèn)情況下,為了排障需求惩系,退出的容器并不會(huì)立即刪除位岔,除非手動(dòng) docker rm如筛。我們這里只是隨便執(zhí)行個(gè)命令,看看結(jié)果抒抬,不需要排障和保留結(jié)果妙黍,因此使用 --rm 可以避免浪費(fèi)空間。
- ubuntu:16.04:這是指用 ubuntu:16.04 鏡像為基礎(chǔ)來(lái)啟動(dòng)容器瞧剖。
-
bash:放在鏡像名后的是命令拭嫁,這里我們希望有個(gè)交互式 Shell,因此用的是 bash抓于。
進(jìn)入容器后做粤,我們可以在 Shell 下操作,執(zhí)行任何所需的命令捉撮。這里怕品,我們執(zhí)行了 cat /etc/os-release,這是 Linux 常用的查看當(dāng)前系統(tǒng)版本的命令巾遭,從返回的結(jié)果可以看到容器內(nèi)是 Ubuntu 16.04.4 LTS 系統(tǒng)肉康。
最后通過(guò) exit 退出了這個(gè)容器,并且這個(gè)容器被刪除掉了灼舍。
- 鏡像的常用命令
- 要想列出已經(jīng)下載下來(lái)的鏡像吼和,可以使用 docker images 命令。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
mongo 3.2 fe9198c04d62 5 days ago 342 MB
<none> <none> 00285df0df87 5 days ago 342 MB
ubuntu 16.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest f753707788c5 4 weeks ago 127 MB
ubuntu 14.04 1e0c3dd64ccd 4 weeks ago 188 MB
列表包含了 倉(cāng)庫(kù)名骑素、標(biāo)簽炫乓、鏡像 ID、創(chuàng)建時(shí)間 以及 所占用的空間献丑。
其中倉(cāng)庫(kù)名末捣、標(biāo)簽在之前的基礎(chǔ)概念章節(jié)已經(jīng)介紹過(guò)了。鏡像 ID 則是鏡像的唯一標(biāo)識(shí)创橄,一個(gè)鏡像可以對(duì)應(yīng)多個(gè)標(biāo)簽箩做。因此,在上面的例子中妥畏,我們可以看到 ubuntu:16.04 和 ubuntu:latest 擁有相同的 ID邦邦,因?yàn)樗鼈儗?duì)應(yīng)的是同一個(gè)鏡像。
- 虛懸鏡像
上面的鏡像列表中咖熟,還可以看到一個(gè)特殊的鏡像圃酵,這個(gè)鏡像既沒(méi)有倉(cāng)庫(kù)名,也沒(méi)有標(biāo)簽馍管,均為 <none>郭赐。:
<none> <none> 00285df0df87 5 days ago 342 MB
這個(gè)鏡像原本是有鏡像名和標(biāo)簽的,原來(lái)為 mongo:3.2,隨著官方鏡像維護(hù)捌锭,發(fā)布了新版本后俘陷,重新 docker pull mongo:3.2 時(shí),mongo:3.2 這個(gè)鏡像名被轉(zhuǎn)移到了新下載的鏡像身上观谦,而舊的鏡像上的這個(gè)名稱則被取消拉盾,從而成為了 <none>。除了 docker pull 可能導(dǎo)致這種情況豁状,docker build 也同樣可以導(dǎo)致這種現(xiàn)象捉偏。由于新舊鏡像同名,舊鏡像名稱被取消泻红,從而出現(xiàn)倉(cāng)庫(kù)名夭禽、標(biāo)簽均為 <none> 的鏡像。這類無(wú)標(biāo)簽鏡像也被稱為 虛懸鏡像(dangling image) 谊路,可以用下面的命令專門顯示這類鏡像:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
一般來(lái)說(shuō)讹躯,虛懸鏡像已經(jīng)失去了存在的價(jià)值,是可以隨意刪除的缠劝,可以用下面的命令刪除潮梯。
$ docker image prune
- 刪除鏡像
docker rmi 鏡像名稱/鏡像id
如果刪除不成功,就是這個(gè)鏡像已經(jīng)有生成的容器惨恭,這時(shí)候就要先去容器里把容器停止并且刪除
docker stop 容器名稱/容器id(停止容器)
docker rm 容器名稱/容器id(刪除容器)
或者可以直接使用
docker rm -f 容器名稱/容器id (強(qiáng)制刪除鏡像)