在之前的文章中,其實已經對鏡像做出了說明,鏡像其實就是容器中的文件系統,也可以說是一個極度精簡的Linux程序運行環境。而在上一篇文章的末尾,運行第一個docker(hello-world)的輸出也給出了容器運行的相關步驟說明,其中就包含鏡像的獲取,Docker守護進程從Docker Hub上拉取一個名爲hello-world的鏡像到本地,然後Docker守護進程創建一個新的容器,從而輸出信息到終端。
Docker鏡像倉庫:
鏡像存儲中的核心概念倉庫(Repository)是鏡像存儲的位置。Docker註冊服務器(Registry)是倉庫存儲的位置。每個倉庫包含不同的鏡像。
比如一個鏡像名稱 ubuntu:14.04,冒號前面的ubuntu是倉庫名,後面的14.04是TAG,不同的TAG可以對應相同的鏡像,TAG通常設置爲鏡像的版本號。
Docker Hub 是Docker官方提供公共倉庫,提供大量的常用鏡像,由於國內網絡原因經常連接Docker Hub會比較慢,所以我們也可以選擇一些國內提供類似Docker Hub鏡像服務站點。比如網易雲、阿里雲以及DaoCloud等,我們可以使用它們所提供的加速服務來更加快捷的從Docker Hub上拉取鏡像。這裏爲了後面介紹鏡像的管理更加方便,我們先進行Docker鏡像站點的配置。
修改Docker鏡像站點:
[root@centos7 docker]# cat /etc/docker/daemon.json {} [root@centos7 docker]# echo > /etc/docker/daemon.json [root@centos7 docker]# cat >> /etc/docker/daemon.json << EOF > { > "registry-mirrors": ["https://registry.docker-cn.com"] > } > EOF [root@centos7 docker]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } [root@centos7 docker]# systemctl restart docker
查找鏡像:
docker search [image_name][:tag]
上面的實例是在Docker Hub上查找所有名稱帶有busybox的鏡像,命令執行後的輸出包含如下幾列:
索引(INDEX)
倉庫名:鏡像所在的倉庫名稱
鏡像描述:對鏡像的描述
星級(STARS):用戶評價,反映出一個鏡像的受歡迎程度
是否官方(OFFICIAL):是否是官方推出並維護的鏡像(比如Ubuntu,CentOS等在Docker Hub上都有官方團隊管理維護的鏡像)
自動構建(AUTOMATED):標識這個鏡像是由Docker Hub的自動構建(Automated Build)流程創建的
該命令一共包含如下參數:
-f, --filter filter :根據提供的條件檢索輸出結果
--limit int :限定輸出結果的最大值
--no-index :不截斷輸出結果
--no-trunc :不截斷輸出結果
[root@centos7 ~]# docker search --filter=is-official=true busybox INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/busybox Busybox base image. 1503 [OK] [root@centos7 ~]# docker search -f "is-official=true" busybox INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/busybox Busybox base image. 1503 [OK] [root@centos7 ~]# docker search -f "stars=10" busybox INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/busybox Busybox base image. 1503 [OK] docker.io docker.io/progrium/busybox 68 [OK] docker.io docker.io/hypriot/rpi-busybox-httpd Raspberry Pi compatible Docker Image with ... 45 docker.io docker.io/radial/busyboxplus Full-chain, Internet enabled, busybox made... 21 [OK] # 注意:這裏的stars=10檢索的結果並沒有星級等於10的,因爲stars=10是filter的參數格式要求,這裏的檢索條件等同於檢索星級最低爲10且名稱包含busybox的鏡像。 [root@centos7 ~]# docker search --no-trunc -f "is-official=true" -f "stars=10" busybox INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/busybox Busybox base image. 1503 [OK] [root@centos7 ~]# docker search --no-trunc --limit 25 -f "is-automated=true" -f "stars=2" busybox INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/progrium/busybox 68 [OK] docker.io docker.io/radial/busyboxplus Full-chain, Internet enabled, busybox made from scratch. Comes in git and cURL flavors. 21 [OK] docker.io docker.io/odise/busybox-curl 2 [OK] docker.io docker.io/prom/busybox Prometheus Busybox Docker base images 2 [OK] # 可以同時指定多個參數
拉取鏡像:
docker pull [image_name][:tag]
[root@centos7 ~]# docker pull busybox Using default tag: latest Trying to pull repository docker.io/library/busybox ... latest: Pulling from docker.io/library/busybox 57c14dd66db0: Pull complete Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0 Status: Downloaded newer image for docker.io/busybox:latest [root@centos7 ~]# docker pull busybox:1.30 Trying to pull repository docker.io/library/busybox ... 1.30: Pulling from docker.io/library/busybox Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0 Status: Downloaded newer image for docker.io/busybox:1.30
該命令還有一個-a選項,用來從倉庫中下載所有的標記的鏡像,一般不常用,不過多介紹。
列出鏡像:
docker images [OPTIONS] [REPOSITORY]
-a, --all=false :顯示所有鏡像,默認不顯示中間層鏡像
-f, --filter=[]:根據過濾條件顯示鏡像
--no-trunc=false:指定不使用截斷的形式顯示信息
-q, --quiet=false:只顯示鏡像的IMAGE ID
結果信息:
REPOSITORY: 鏡像的倉庫名
TAG: 鏡像的標籤名
IMAGE ID: 鏡像的唯一ID
CREATED: 鏡像建立的時間
VIRTUAL SIZE: 鏡像的大小
示例:
1)列出所有鏡像,-a參數是默認值,加不加結果都一樣
[root@centos7 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB [root@centos7 ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB
2)列出包含指定名稱的鏡像
[root@centos7 ~]# docker images busybox REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB
3)列出包含指定名稱和對應標籤的鏡像
[root@centos7 ~]# docker images busybox:1.30 REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB
4)列出沒有打標籤的鏡像(因爲本地沒有未打標籤的鏡像,輸出爲空)
[root@centos7 ~]# docker images -f 'dangling=true' REPOSITORY TAG IMAGE ID CREATED SIZE
5)列出所有打標籤的鏡像,且不截斷輸出結果
[root@centos7 ~]# docker images -f 'dangling=false' --no-trunc REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e 5 weeks ago 1.84 kB docker.io/busybox 1.30 sha256:3a093384ac306cbac30b67f1585e12b30ab1a899374dabc3170b9bca246f1444 5 weeks ago 1.2 MB docker.io/busybox latest sha256:3a093384ac306cbac30b67f1585e12b30ab1a899374dabc3170b9bca246f1444 5 weeks ago 1.2 MB
6)列出創建時間比hello-world鏡像早的鏡像
[root@centos7 ~]# docker images -f 'before=hello-world' REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB
7)列出創建時間比busybox:1.30鏡像晚的鏡像
[root@centos7 ~]# docker images -f 'since=busybox:1.30' REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB
8)列出關聯匹配指定模式的鏡像
[root@centos7 ~]# docker images -f 'reference=hello*' REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB
9)列出本地所有鏡像的ID(批量刪除鏡像時會用到)
[root@centos7 ~]# docker images -a -q fce289e99eb9 3a093384ac30 3a093384ac30
查看鏡像的詳細信息:
docker inspect [OPTION] CONTAINER|IMAGE [CONTAINER|IMAGE...]
-f, --format="": 以指定格式顯示鏡像的詳細信息
-s, --size:如果使用該鏡像創建了容器則顯示總的文件大小
--type: 對於特定屬性使用JSON格式返回結果
1)查看busybox:1.30鏡像的容器配置中的Hostname
[root@centos7 ~]# docker inspect --format='{{.ContainerConfig.Hostname}}' $(docker images -q busybox:1.30) 72124b9bac2f
2)查看busybox:1.30鏡像的架構
[root@centos7 ~]# docker inspect --format='{{.Architecture}}' $(docker images -q busybox:1.30) amd64
3)查看busybox:1.30鏡像的系統類型
[root@centos7 ~]# docker inspect --format='{{.Os}}' $(docker images -q busybox:1.30) linux
4)查看busybox:1.30鏡像的系統環境變量
[root@centos7 ~]# docker inspect --format='{{.Config.Env}}' $(docker images -q busybox:1.30) [PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
5)查看busybox:1.30鏡像的Config字段配置,並以JSON格式返回輸出結果
[root@centos7 ~]# docker inspect --format='{{json .Config}}' $(docker images -q busybox:1.30) {"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"ArgsEscaped":true,"Image":"sha256:a6633a61b3209de4088bd822bc5b3fa470f57c7f3df4fa0544cb20907915a65a","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null}
6)使用busybox鏡像啓動一個容器,並使用--size參數獲取其大小
[root@centos7 ~]# docker run -itd --name busybox01 busybox [root@centos7 ~]# docker inspect --size busybox01 # 這裏要使用容器的名稱或ID ...... "SizeRw": 3, "SizeRootFs": 1199420, ...... # 輸出過多,已省略
構建鏡像:
構建鏡像常用的方法:
1)docker commit 基於容器構建鏡像
2)docker build 使用dockerfile構建鏡像
3)其他方法,包含docker import, docker load等
1、基於容器創建鏡像
步驟1:登錄Docker Hub (這裏暫時沒有私有倉庫,以Docker Hub爲例)
步驟2:拉取一個鏡像
[root@centos7 ~]# docker pull centos:6 Trying to pull repository docker.io/library/centos ... 6: Pulling from docker.io/library/centos 9bfcefca2b8d: Pull complete Digest: sha256:935c45b2e2c4f01aa5a6ff8625632390c7685835a8dfcfdd50790aabc9c24d11 Status: Downloaded newer image for docker.io/centos:6
步驟3:使用拉取的鏡像創建容器
[root@centos7 ~]# docker run -itd --name mycentos01 centos:6 8c671b1133638f18e996a02bcbac7d24ed014b9cacd9a827106ef7abb8fb7221
步驟4:對容器做出修改
[root@centos7 ~]# docker exec -it mycentos01 /bin/bash [root@8c671b113363 /]# yum -y install nginx
步驟5:提交修改
[root@centos7 ~]# docker commit mycentos01 jerry12356/testcentos6 sha256:0aada46be3cfed2d55c84f86a6c73b570d8ae31d495e8e84526b95cfccfad691
步驟6:驗證
[root@centos7 ~]# docker images jerry12356/testcentos6 REPOSITORY TAG IMAGE ID CREATED SIZE jerry12356/testcentos6 latest 0aada46be3cf 31 seconds ago 253 MB
2、使用Dockerfile進行構建
步驟1:創建Dockerfile
[root@centos7 ~]# mkdir testimage [root@centos7 ~]# vi testimage/Dockerfile [root@centos7 ~]# cat testimage/Dockerfile from centos:6 ENV HOSTNAME=mycentos02
步驟2:使用Dockerfile構建鏡像
[root@centos7 ~]# cd testimage/ [root@centos7 testimage]# docker build -t testimage . Sending build context to Docker daemon 2.048 kB Step 1/2 : FROM centos:6 ---> 0cbf37812bff Step 2/2 : ENV HOSTNAME mycentos02 ---> Running in 9bc163c742e6 ---> cebe8edc579a Removing intermediate container 9bc163c742e6 Successfully built cebe8edc579a
步驟3:驗證
[root@centos7 testimage]# docker images testimage REPOSITORY TAG IMAGE ID CREATED SIZE testimage latest cebe8edc579a 10 seconds ago 194 MB
3、其他方法構建鏡像(因不作爲常用的構建方式,故不在此舉例,後面會有對應的介紹)
提交鏡像:
docker commit [OPTION] CONTAINER [REPOSITORY[:TAG]]
-a, --author="": 指定作者
-m, --message="": 指定鏡像構建的信息
-p, --pause=true: 可以在不暫停容器的情況下構建鏡像
注:上面構建鏡像中已有示例,故不多做贅述
推送鏡像:
docker push IMAGE[:TAG]
注:上面構建鏡像中已有示例,需先登錄Docker Hub或私有倉庫
刪除鏡像:
docker rmi [OPTIONS] IMAGE [IMAGES...]
-f, --force=false: 強制刪除鏡像
--no-prune=false:刪除鏡像的同時保留該鏡像的父鏡像
示例:
1)刪除指定鏡像
[root@centos7 testimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testimage latest cebe8edc579a 10 minutes ago 194 MB jerry12356/testcentos6 latest 0aada46be3cf 22 minutes ago 253 MB docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB docker.io/centos 6 0cbf37812bff 4 months ago 194 MB [root@centos7 testimage]# docker rmi jerry12356/testcentos6 Untagged: jerry12356/testcentos6:latest Deleted: sha256:0aada46be3cfed2d55c84f86a6c73b570d8ae31d495e8e84526b95cfccfad691 Deleted: sha256:2d3e8446066084493a55b97a2e8256553373eca56af7926eff05003e0d4bf14f [root@centos7 testimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testimage latest cebe8edc579a 10 minutes ago 194 MB docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB docker.io/centos 6 0cbf37812bff 4 months ago 194 MB
2)強制刪除指定鏡像
[root@centos7 testimage]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8c671b113363 centos:6 "/bin/bash" 26 minutes ago Up 26 minutes mycentos01 [root@centos7 testimage]# docker rmi centos:6 Error response from daemon: conflict: unable to remove repository reference "centos:6" (must force) - container 8c671b113363 is using its referenced image 0cbf37812bff [root@centos7 testimage]# docker rmi -f centos:6 Untagged: centos:6 Untagged: docker.io/centos@sha256:935c45b2e2c4f01aa5a6ff8625632390c7685835a8dfcfdd50790aabc9c24d11 [root@centos7 testimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testimage latest cebe8edc579a 13 minutes ago 194 MB docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB
3)刪除所有鏡像
[root@centos7 testimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testimage latest cebe8edc579a 13 minutes ago 194 MB docker.io/hello-world latest fce289e99eb9 5 weeks ago 1.84 kB docker.io/busybox 1.30 3a093384ac30 5 weeks ago 1.2 MB docker.io/busybox latest 3a093384ac30 5 weeks ago 1.2 MB [root@centos7 testimage]# docker rmi $(docker images -q) [root@centos7 testimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE