今天來說說鏡像,鏡像是 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,更多精彩內容等你來。