天天看點

Docker核心元件之鏡像(Image)

在CentOS 7上安裝好了Docker引擎後,裡面什麼都沒有,接下來,我們使用Docker鏡像。

鏡像和容器的關系:就像是面向對象程式設計中的類和執行個體一樣。

  • 鏡像是靜态的定義,裡邊有應用。
  • 容器是動态的,是鏡像運作時的實體。

一、配置阿裡雲鏡像加速位址

鏡像倉庫位址,預設從官方的倉庫 Docker Hub上下載下傳,在國外下載下傳起來很慢,容易逾時。

推薦修改預設配置為從國内的阿裡雲鏡像倉庫,或網易雲等下載下傳。

1、擷取阿裡雲鏡像加速位址

登入阿裡雲官網,在“控制台-産品服務-容器鏡像服務-加速器配置”中拿到鏡像加速位址。

注意:阿裡雲為每個賬号配置設定獨自的鏡像加速位址。是以,每個人的都不一樣。

           如果使用網易雲鏡像(http://hub-mirror.c.163.com)的話,直接配置即可。

2. 配置到Docker引擎的配置檔案/etc/docker/daemon.json

Docker引擎的配置檔案的完整配置項資訊,可檢視官方文檔。

Docker核心元件之鏡像(Image)

Docker引擎的配置檔案,預設沒有,我們可建立并添加鏡像配置項。

[[email protected] ~]# ll /etc/docker/
總用量 4
-rw------- 1 root root 244 9月   6 15:49 key.json
[[email protected] ~]# vim /etc/docker/daemon.json
           
{
    "registry-mirrors": ["https://jugduemv.mirror.aliyuncs.com"]                                          
}
           

3. 重新加載配置檔案使其生效,輸入:

[[email protected] ~]# systemctl daemon-reload
           

4. 重新開機Docker,輸入:

[[email protected] ~]# systemctl restart docker
           

5. 檢視Docker資訊,可以看到配置的阿裡雲鏡像,輸入:

[[email protected] ~]# docker info
           
Docker核心元件之鏡像(Image)

二、拉去應用的鏡像 -- pull指令

使用 Docker的 pull指令,把應用鏡像從網絡上的倉庫中拉下來,放到 Docker 主機本地鏡像倉庫裡。

指令格式:docker [image] pull 應用鏡像倉庫名稱:tag标記   

注意:

  • tag标記不寫時,預設 latest。鏡像的latest标簽意味着該鏡像的内容會跟蹤最新版本的變更而變化,内容是不穩定的。在生産環境中不推薦使用latest标記的鏡像。
  • 應用鏡像倉庫名稱,鏡像倉庫位址(即registry, 注冊伺服器)作為字首,跟上應用名稱。預設使用的是官方Docker Hub 服務(registry.hub.docker.com),我們配置了阿裡雲鏡像加速器,該字首是阿裡雲鏡像位址。該字首可以忽略。

Linux中,Docker 主機本地鏡像倉庫通常位于 /var/lib/docker/中。

[[email protected] ~]# ll /var/lib/docker/ 
總用量 0
drwx------ 2 root root 24 9月   6 15:49 builder
drwx--x--x 4 root root 92 9月   6 15:49 buildkit
drwx------ 2 root root  6 9月   6 15:49 containers
drwx------ 3 root root 22 9月   6 15:49 image
drwxr-x--- 3 root root 19 9月   6 15:49 network
drwx------ 3 root root 40 9月   6 17:23 overlay2
drwx------ 4 root root 32 9月   6 15:49 plugins
drwx------ 2 root root  6 9月   6 17:23 runtimes
drwx------ 2 root root  6 9月   6 15:49 swarm
drwx------ 2 root root  6 9月   6 17:23 tmp
drwx------ 2 root root  6 9月   6 15:49 trust
drwx------ 2 root root 25 9月   6 15:49 volumes
           

1、拉去 Redis鏡像

預設 latest:

[[email protected] ~]# docker image pull redis
Using default tag: latest
......
           

指定 tag(6.0.5):

[[email protected] ~]# docker pull redis:6.0.5                     
6.0.5: Pulling from library/redis
......
           

2、鏡像檔案的結構

下載下傳下來的鏡像檔案,是以層的結構組成的,目的是為了共享。

不同的鏡像,如果有相同的部分層檔案,他們不同的鏡像之間會共享相同的層,隻需要下載下傳和儲存不同的層就可以了,這樣就節省了大量的存儲空間。

Docker核心元件之鏡像(Image)

三、檢視鏡像資訊

1、列出本地鏡像 -- docker images 指令

使用docker  images 指令可以列出本地主機上已有鏡像的基本資訊。

基本文法:docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS說明:

  • -a或--all=“true | false” :列出本地所有的鏡像(含中間映像層/臨時檔案,預設情況下,過濾掉中間映像層),預設為否;
  • --digests=“true | false :顯示鏡像的數字摘要資訊,預設為否,不顯示;
  • -f或--filter :顯示滿足條件的鏡像;
  • --no-trunc="true | false” :顯示完整的鏡像資訊,預設是false,設為true顯示完整資訊,比如IMAGE ID;
  • -q :隻顯示鏡像ID。

列出鏡像的數字摘要值:--digests=“true”

[[email protected] ~]# docker images --digests="true"
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
redis               latest              sha256:933c6c01829165885ea8468d87f71127b1cb76a711311e6c63708097e92ee3d1   41de2cc0b30e        4 days ago          104MB
redis               6.0.5               sha256:800f2587bf3376cb01e6307afe599ddce9439deafbd4fb8562829da96085c9c5   235592615444        2 months ago        104MB
           

隻顯示沒有被使用的鏡像:-f或--filter="dangling=true"  

[[email protected] ~]# docker images -f='dangling=true'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
           

顯示滿足條件的鏡像:-f或--filter reference='redi*:lat*'

[[email protected] ~]# docker images --filter reference='redi*:lat*'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              41de2cc0b30e        4 days ago          104MB
           

 顯示完整的鏡像資訊:--no-trunc="true"

[[email protected] ~]# docker images --no-trunc="true"
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
redis               latest              sha256:41de2cc0b30e9fa4fcdda7c8e458dc7619c1b8a81a3501c62e0dccd2b559fafd   4 days ago          104MB
redis               6.0.5               sha256:2355926154447ec75b25666ff5df14d1ab54f8bb4abf731be2fcb818c7a7f145   2 months ago        104MB
           

隻顯示鏡像ID:-q

[[email protected] ~]# docker images -q
41de2cc0b30e
235592615444
           

2、标記/添加鏡像标簽 --docker tag指令

為了友善在工作中使用特定鏡像,可以使用docker  tag指令來為本地鏡像标記新的标簽(任意起名)。将其歸入某一倉庫。

基本文法:docker tag  IMAGE[:TAG]  NAME[:TAG]

比如:添加一個新的 jqredis:v6 鏡像标簽

[[email protected] ~]# docker tag redis:6.0.5 jqredis:v6
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              41de2cc0b30e        4 days ago          104MB
jqredis             v6                  235592615444        2 months ago        104MB
redis               6.0.5               235592615444        2 months ago        104MB
           

3、擷取容器/鏡像的中繼資料 -- docker inspect 指令

使用docker inspect指令可以擷取該鏡像的詳細資訊,包括制作者、适應架構、各層的數字摘要等。

基本文法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS說明:

  • -f format:指定傳回值的模闆檔案。
  • -s :顯示總的檔案大小。
  • --type :為指定類型傳回JSON。

比如:擷取鏡像 redis:6.0.5 的元資訊:

[[email protected] ~]# docker inspect redis:6.0.5
           
Docker核心元件之鏡像(Image)

四、搜尋鏡像 -- docker search 指令

使用docker search 指令可以搜尋Docker Hub官方倉庫中的鏡像。

基本文法:docker search [OPTIONS]  keyword。 

OPTIONS說明:

  • --no-trunc :顯示完整的鏡像描述;
  • -s :列出收藏數不小于指定值的鏡像。
  •  -f,--filter=xxxx:列出滿足條件的鏡像;

比如:搜尋官方提供的鏡像 redis關鍵字:

  • docker search --filter=is-official=true redis
[[email protected] ~]# docker search --filter=is-official=true redis
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis               Redis is an open source key-value store that…   8545                [OK]      
           

比如:搜收藏數量大于等于90的centos的鏡像

  • docker search --filter=stars=90 centos
  • docker search -s 90 centos 
[[email protected] ~]# docker search --filter=stars=90 centos
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                    The official build of CentOS.                   6178                [OK]                
ansible/centos7-ansible   Ansible on Centos7                              132                                     [OK]
consol/centos-xfce-vnc    Centos container with "headless" VNC session…   119                                     [OK]
jdeathe/centos-ssh        OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   115                                     [OK]
[[email protected] ~]# docker search -s 90 centos 
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                    The official build of CentOS.                   6178                [OK]                
ansible/centos7-ansible   Ansible on Centos7                              132                                     [OK]
consol/centos-xfce-vnc    Centos container with "headless" VNC session…   119                                     [OK]
jdeathe/centos-ssh        OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   115                                     [OK]
           

五、删除和清理鏡像

1、删除鏡像 --docker rmi 指令

docker rmi : 删除本地一個或多少鏡像。

基本文法:docker rmi [OPTIONS] IMAGE [IMAGE...]

IMAGE可以是标簽或ID。

OPTIONS說明:

  • -f :強制删除;

比如:删除redis鏡像:

注意:當一個鏡像有多個标志副本的時候,使用标簽(docker rmi jqredis:v6)不會真正删除鏡像,隻會删除副本标簽。建議用ID,真正删除鏡像,靠譜。

[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              41de2cc0b30e        4 days ago          104MB
redis               6.0.5               235592615444        2 months ago        104MB
jqredis             v6                  235592615444        2 months ago        104MB
[[email protected] ~]# docker rmi -f 235592615444   
......
[[email protected] ~]# docker images             
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              41de2cc0b30e        4 days ago          104MB
           

2、清理鏡像 -- docker image prune 指令

使用Docker一段時間後,系統中可能會遺留一些臨時的鏡像檔案,以及一些沒有被使用的鏡像,可以通過docker image prune 指令來進行清理,最後會提示釋放的存儲空間。

OPTIONS說明:

  • -a, -all:删除所有無用鏡像,不光是臨時鏡像;
  • -filter filter: 隻清理符合給定過濾器的鏡像;
  • -f,-force:強制删除鏡像,而不進行提示确認。

比如:會自動清理臨時的遺留鏡像檔案層: 

[[email protected] ~]# docker image prune -f
Total reclaimed space: 0B
           

六、簡單地建立鏡像 -- docker commit 指令

建立方式有很多,開發中可使用 Dockerfile指令等建立。

這裡使用docker [container] commit 指令,在現有容器的基礎上簡單地建立新鏡像。

基本文法:docker [container] commit [OPTIONS]  CONTAINERID  [REPOSITORY[:TAG]]

OPTIONS說明:

  • -a,--author="":作者資訊;
  • -C,--change=[] :送出的時候執行Dockerfile指令,包括CMD | ENTRYPOINT |ENV 等;
  • -m,--message="":送出消息;
  • -p,--pause=true:送出時暫停容器運作。

比如:先拉取一個centos:7的鏡像,運作它。然後建立新鏡像,成功後傳回新建立的鏡像的ID。

[[email protected] ~]# docker pull centos:7
[[email protected] ~]# docker run -it centos:7
[[email protected] /]# 
           
[[email protected] ~]# docker commit -a "jq" -m "簡單建立新鏡像測試" 61b8394f1d9e jqcontos:v7
sha256:e95e8427c1eb933885675dc2f6bf4a33bf0dd6425ddd579d797499f404753987
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jqcontos            v7                  e95e8427c1eb        10 seconds ago      203MB
redis               latest              41de2cc0b30e        4 days ago          104MB
centos              7                   7e6257c9f8d8        3 weeks ago         203MB
           

七、導出和載入鏡像

1、導出鏡像 -- docker save指令

docker  [image] save指令:将指定鏡像儲存成 tar 歸檔檔案。這個本地檔案可以分享給他人使用。

基本文法:docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS 說明:

  • -o :輸出到的檔案。

比如:導出本地的 jqcontos:v7鏡像到本地檔案,檔案名(自定義)為jqcontosv7.tar,這個檔案就是導出的鏡像檔案了。

[[email protected] ~]# docker save -o /root/abc/jqcontosv7.tar jqcontos:v7
[[email protected] ~]# ls /root/abc/ | grep jq
jqcontosv7.tar
           

2、載入鏡像 -- docker [image] load 指令

docker [image] load 指令:将導出的 tar歸檔檔案載入/導入到本地鏡像庫。

基本文法:docker load [OPTIONS]

OPTIONS 說明:

  • --input , -i : 指定導入的檔案,代替 STDIN。

比如:将jqcontosv7.tar導人鏡像及其相關的中繼資料資訊(包括标簽等)到本地鏡像清單。先删除之前存在的 jqcontos:v7鏡像。

輸入:docker load -i /root/abc/jqcontosv7.tar 或者 docker load < /root/abc/jqcontosv7.tar

[[email protected] ~]# docker rmi jqcontos:v7
Untagged: jqcontos:v7
Deleted: sha256:e95e8427c1eb933885675dc2f6bf4a33bf0dd6425ddd579d797499f404753987
[[email protected] ~]# docker load -i /root/abc/jqcontosv7.tar
Loaded image: jqcontos:v7
[[email protected] ~]# docker images                          
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jqcontos            v7                  e95e8427c1eb        21 minutes ago      203MB
redis               latest              41de2cc0b30e        4 days ago          104MB
centos              7                   7e6257c9f8d8        3 weeks ago         203MB
           

至此,Docker在容器中導出鏡像,鏡像載入到本地鏡像庫,擷取鏡像等基本操作的過程與思想有所了解。

—— Stay Hungry. Stay Foolish. 求知若饑,虛心若愚。