天天看點

docker築基篇-02-鏡像管理1 鏡像再探2 基礎指令

  • 鏡像再探
  • 基礎指令
    • 1 檢視鏡像
    • 2 拉取鏡像
    • 3 搜尋鏡像
    • 4 删除鏡像

1 鏡像再探

docker鏡像是由FileSystem疊加而成的。

和傳統的linux一樣,最底層是bootfs;之上是rootfs。

和linux不同的是,docker裡的rootfs永遠都是隻讀狀态的。之是以你看起來像是修改了它(給它擴充新功能),是因為docker的聯合加載技術(一次同時加載多個檔案系統,并将各層檔案系統的功能組合)。

有了聯合加載技術,最終的檔案系統就有了所有已經加載了的檔案系統的功能。是不是感覺有點像面向對象的繼承呢?

在實際使用中,一個docker鏡像往往都是由另一個docker鏡像擴充而來的。被擴充的那個鏡像就稱之為父鏡像。最原始的那個父鏡像被稱為base image(基礎鏡像)。

看看這個經典的圖吧:

docker築基篇-02-鏡像管理1 鏡像再探2 基礎指令

最上面那一層是可讀寫的。在容器第一次啟動的時候,該層是空的。

當我們修改某個檔案時,被修改的檔案會從讀寫層下面的隻讀層複制到讀寫層。這樣一來檔案的隻讀版本還保留着,我們修改的隻是一個副本,并将這個副本保留在了最上面的讀寫層,同時隻讀版本被讀寫層的檔案隐藏了。

而這個正是docker的另一牛逼哄哄的特性

寫時複制

通過這種機制,每個隻讀層都是永遠不會發生變化的了。當每次建立或擴充一個容器時,都會在容器棧的最頂層增加一個可寫層。在可寫層發生的變更隐藏掉底層的部分之後,各層在組合功能,進而擴充容器。

總感覺這東西真是和面向對象設計原則中的開閉原則不謀而合啊!!!

對修改關閉(除了第一層的可寫層都是隻讀的),對擴充開放(在最頂層修改,擴充容器)。

2 基礎指令

2.1 檢視鏡像

docker images
    -a, --all=true|false
        顯示所有鏡像。預設情況下,那些中間層的鏡像不會被顯示.The default is false.
    --digests=true|false
        Show image digests. The default is false.
    --no-trunc=true|false
        不會截斷輸出. The default is false.
    -f, --filter=[]
        帶條件地列出鏡像
           

鏡像儲存于倉庫中,這裡說的倉庫有點類似于git的倉庫。

一個倉庫可以存儲多個鏡像,通過 TAG 來區分。

倉庫存在于Registry中,預設情況下,Registry是DockerHub。

[root@h1 ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
csphere/centos                                 e3a35d3b1588         hours ago         MB
hub.c..com/library/nginx   latest              b1d6e5f8fe92         days ago           MB
daocloud.io/centos                               eb24acd8692d         weeks ago          MB
centos                        latest              baab0af79c4         weeks ago          MB
centos                                         e46367f846         weeks ago          MB
centos                        centos7.      a77536ad4c         weeks ago          MB
hello-world                   latest              f0cb9bdcaa69         months ago         kB
<none>                        <none>              b45d87d28         months ago        MB
[root@h1 ~]#

[root@h1 ~]# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              baab0af79c4         weeks ago          MB
centos                               e46367f846         weeks ago          MB
centos              centos7.      a77536ad4c         weeks ago          MB
           

2.2 拉取鏡像

docker pull 指令其實就是下載下傳鏡像用的。預設情況下是從DockerHub下載下傳。

當我們使用run指令來從一個鏡像啟動容器時,如果鏡像不在本地,docker就會從DockerHub去pull該鏡像對應的最新版本,即TAG為latest的版本。

docker pull
    -a, --all-tags=true|false
         Download all tagged images in the repository. The default is false.  
           
[[email protected] ~]# docker pull fedora
latest: Pulling from fedora
daf0c008c194: Pull complete 
daf0c008c194: Pulling fs layer 
Digest: sha256:e34f51fc00844fe87fd2cf3afe43d7e2f360fabedb56a7c81791958df1
Status: Downloaded newer image for fedora:latest

[[email protected] ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
csphere/centos                                 e3a35d3b1588         hours ago         MB
hub.c.com/library/nginx   latest              b1d6e5f8fe92         days ago           MB
daocloud.io/centos                               eb24acd8692d         weeks ago          MB
centos                        latest              baab0af79c4         weeks ago          MB
centos                                         f846         weeks ago          MB
centos                        centos7      a77536ad4c         weeks ago          MB
fedora                        latest              daf0c008c194         weeks ago          MB
hello-world                   latest              f0cb9bdcaa69         months ago         kB
<none>                        <none>              b45d87d28         months ago        MB
[[email protected] ~]#

# 指定TAG
[[email protected] ~]# docker pull fedora:20
: Pulling from fedora
a45be3b30145: Downloading [======>……
…………………………
…………………………
           

2.3 搜尋鏡像

這裡指的搜尋不是本地搜尋,而是在遠端的DockerHub上搜尋。比如:

[[email protected] ~]# docker search nginx
NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                     Official build of Nginx.                              [OK]       
jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...                     [OK]
richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...                     [OK]
million12/nginx-php       Nginx + PHP-FPM , ,  (NG), CentOS...                      [OK]
# ...............
[[email protected] ~]#
           
以上搜尋結果的标題含義:
  • NAME:鏡像所在倉庫名,可以用它來pull鏡像
  • DESCRIPTION:鏡像描述
  • STARS:使用者評價
  • OFFICIAL:是否是官方的
  • AUTOMATED:是否是使用自動建構流程建立的

2.4 删除鏡像

docker rmi:删除指定鏡像


# 删除fedora最新版的鏡像
[[email protected] ~]# docker rmi -f fedora:latest
Untagged: fedora:latest
Deleted: daf0c008c194f2bae4f4bf36327d9166bc1dfa9fbbadb2ad585c1f11037fd787