使用 Docker 鏡像 | Docker 系列

今天來說說鏡像,鏡像是 Docker 中特別重要的概念,是容器運行的基礎,沒有鏡像,後面的一切都不成立。

典型的鏡像表示方法分三部分,用 / 分隔:

remote image hub/namespace/name:tag
  • remote image hub:存儲鏡像的 Web 服務器地址;
  • namespace:命名空間,表示一個用戶或組織下的所有鏡像;
  • name:鏡像名稱;
  • tag:鏡像標籤。

其實,我們常看到的鏡像是長這樣的 name:tag,因爲從 Docker 官方倉庫拉下來的鏡像,是可以省略前兩部分的。

獲取鏡像

使用 docker pull name[:tag] 命令來下載鏡像,如果不顯式指定 tag,則默認會選擇 latest 標籤。

$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
76df9210b28c: Pull complete
Digest: sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest

查看鏡像信息

使用 docker images 命令列出本機鏡像。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              1c35c4412082        6 days ago          1.22MB

鏡像 ID 十分重要,它唯一標識了鏡像。

使用 docker tag 命令來給本地鏡像添加新的標籤。

$ docker tag busybox:latest mybusybox:latest

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              1c35c4412082        6 days ago          1.22MB
mybusybox           latest              1c35c4412082        6 days ago          1.22MB

可以看到,現在本地的兩個鏡像 ID 是相同的,表示它們指向了同一個鏡像,只是標籤不同而已。

使用 docker inspect 命令來獲取鏡像的詳細信息。

使用 docker history 命令列出鏡像各層的創建信息。

搜索鏡像

使用 docker search 命令來搜索鏡像。

$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6039                [OK]
ansible/centos7-ansible            Ansible on Centos7                              130                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   116                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114                                     [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   76
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              58                                      [OK]

刪除和清理鏡像

使用 docker rmi 命令來刪除鏡像,分兩種方式:一種是通過鏡像名和標籤來刪除;一種是通過鏡像 ID 來刪除。平時使用過程中,大部分都是通過鏡像 ID 來刪除。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              1c35c4412082        8 days ago          1.22MB
mybusybox           latest              1c35c4412082        8 days ago          1.22MB

$ docker rmi mybusybox:latest
# 或者
$ docker rmi 1c35c4412082

如果鏡像被容器引用了的話,是無法刪除的,需要先刪除依賴該鏡像的容器,然後再刪除鏡像。或者比較暴力的話,直接使用 -f 參數來刪除,也能達到效果,但還是不推薦這種做法。

使用 docker image prune 命令來清理系統中遺留的一些臨時鏡像,以及一些沒有被使用的鏡像。

創建鏡像

創建鏡像有三種方式:

  • 基於已有容器創建
  • 基於本地模板導入
  • 基於 Dockerfile 創建

1、基於已有容器創建

# 運行一個容器
$ docker run -it centos /bin/bash

# 在容器中創建一個文件,然後退出
[root@f0767e2e8964 /]# touch text.txt
[root@f0767e2e8964 /]# exit
exit

# 查看容器
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f0767e2e8964        centos              "/bin/bash"         17 seconds ago      Exited (0) 4 seconds ago                       stupefied_ptolemy

# 基於容器創建鏡像
$ docker commit -a 'add file' f0767e2e8964 centos:1.0
sha256:a651491d9bfe6d00eef7a23bd290be839d59efafa31183ef2038399271dee459

# 查看除了原有鏡像,還有新生成的鏡像,標籤不同
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              1.0                 a651491d9bfe        4 seconds ago       237MB
centos              latest              470671670cac        4 months ago        237MB

2、基於本地模板導入

使用 docker import 命令將模板導入成鏡像。

3、基於 Dockerfile 創建

這是在實際工作中使用最多的方法,先賣個關子,後續單獨寫一篇來詳細介紹。

存出和載入鏡像

使用 docker save 命令保存鏡像到文件。

$ docker save -o busybox.tar busybox

執行之後,在當前目錄下就會有 busybox.tar 文件了,然後可以把這個文件分享給其他人。

收到文件之後,使用 docker load 命令來載入鏡像。

$ docker load < busybox.tar

上傳鏡像

使用 docker push 命令將鏡像上傳到鏡像倉庫,這樣在其他服務器上想用這個鏡像,直接 docker pull 一下就可以了,非常方便。

默認的話,會上傳到 Docker Hub 官方倉庫,我們也可以搭建自己的私有倉庫。一般來說,公司內部都會有自己的鏡像倉庫,我們根據需求來使用就可以了。

這篇就到這裏吧,下篇來說說容器。

參考書籍:

  • 《Docker 技術入門與實戰》
  • 《Docker 進階與實戰》

技術博客:

https://github.com/yongxinz/tech-blog

同時,也歡迎關注我的微信公衆號 AlwaysBeta,更多精彩內容等你來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章