# 六角鼠年鐵人賽 Week 4 - Docker Images 操作指令
==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai==
### 秋夕 杜牧
:::info
銀燭秋光冷畫屏,輕羅小扇扑流螢。
天階夜色涼如水,坐看牽牛織女星。
:::
前面簡單的介紹過 Docker Image 後,本篇文就會開始實際的操作各種 Image 的指令了。
### 查詢映像檔資訊
#### 列出 Image 的基本資訊
```
docker image ls
docker image ls -a
docker image ls --all
docker images
```


:::success
上述四句指令功用完全一樣,因為程式預設會幫忙帶入 -a 或是 --all 的指令,因此不需要特別加,Docker 都會秀出所有 Image
:::
#### 列出指定 Image 的基本資訊
```
docker image ls [Image Name]
docker images [Image Name]
docker image ls [Image Name]:[TAG]
docker images [Image Name]:[TAG]
Kai 的操作範例為
docker image ls tomcat
docker images tomcat
docker image ls tomcat:7.0.100-jdk8-corretto
docker images tomcat:7.0.100-jdk8-corretto
```


:::success
如果只想列出某一支 Image 的話,可以在原先的指令後加入該 Image 的名稱
若想更加明確找出是哪一個版本,可以在後方 加上: 加上 TAG 輔助查詢
:::
#### 列出 Images 完整資訊(適用於指定 Image)
```
docker images --no-trunc
docker image ls [Image Name] --no-trunc
Kai 的操作範例
docker image ls tomcat --no-trunc
```


:::success
此指令會顯示完整 Images 的資訊
不論是全部 Images 還是單個 Image 都適用
:::
#### 查詢 Digests 值
```
docker image ls --digests
```

:::success
- Digests 是 Docker 1.6 和 registory 2 加入的資訊,是用來識別 Image 的 SHA值
- SHA值 是經由 SHA (全名Secure Hash Algorithm 安全散列函式) 算出的值,被廣泛使用在資安認證上
- SHA 同時也是 FIPS 所認證的安全雜湊演算法
- FIPS 全名 Federal Information Processing Standards 聯邦資訊處理標準
:::
#### 查詢透過 Filter 篩選
:::warning
Filter 的寫法,可以是以下方式:
```
-f
--filter
```
後續接應的字串可以是 "Input String" 也可以接在 filter 後,等有需要輸入文字再輸入即可。
```
-f 'dangling=true'
-f=dangling='true'
```
:::
```
docker images -f dangling=true
docker images -f dangling=false
```

:::success
dangling 是表示那些沒有 TAG (標記)的 Image,常發生於自行建立的 Image 上,若是從 Docker Hub 或其他地方 pull 下來的幾乎都不會有這問題。
系統判定這些未被 TAG 的 Image,不被用於任何 Images Layer 中,同時也占用了磁碟空間,因此註記為 dangling,提醒開發人員此 Image 的狀況。
開發人員可以做的動作是將其 TAG、保持不變或刪除。
:::
```
docker images -f "before=[ImageName:TAC]"
docker images -f "since=[ImageName:TAC]"
Kai 的操作範例
docker images -f "before=tomcat:7.0.100-jdk8-corretto"
docker images -f "since=tomcat:7.0.100-jdk8-corretto"
```


:::success
**before** 可以從範例中看出,是篩選列出某個 Image 往前(下)的其他 Image
**since** 可以從範例中看出,是篩選列出某個 Image 往後(上)的其他 Image
:::
```
docker images -f=reference='Input String'
Kai 的操作範例
docker images -f=reference='tomcat'
```

:::success
可以用來篩選出自同一個來源的 Images,像是 OS、DB、Apache 這類型的 Images 有可能會下載不只一個版本,眾多 Images 放在一起的時候難以整頓,這時候就可以利用 **reference** 來篩選同個來源的 Images,方便統整作業。
:::
:::warning
其他還有許多舉不完的例子,例如 **Label (label)**、**Running (running)** 等。
此外也支援 Linux 的查詢語法,所以也可以用類似
```
docker images 'Input String\/*'
docker images | grep Input String
```
的方式來找尋 Images
:::
#### 使用 format 進行 OutPut 控制
```
docker images --format "{{.Item}}: {{.Item}}"
Kai 的操作範例
docker images --format "{{.ID}} : {{.Tag}}"
```

:::success
在 format 的 Item 中帶入正確的 Item Name 就可以指定該到資料欄位,下面是列出所有可以下的 Item Name:
|Item Name|Info|Chinese Info|
|-|-|-|
|.ID|Image ID|Image 的 ID|
|.Repository|Image repository|Image 倉庫名稱|
|.Tag|Image tag|Image 的 TAG|
|.Digest|Image digest|Image 的 digest|
|.CreatedSince|Elapsed time since the image was created|Image 在 Local (本地端) 自建立到現在的時間|
|.CreatedAt|Time when the image was created|Image 在 Local (本地端) 的建立時間|
|.Size| Image disk size|Image 占用的空間|
|.Name||Image 的名稱 (Search可用)|
|.StarCount||Image 的星星積分 (Search可用)|
|.IsOfficial||Image 是否為官方建立 (Search可用)|
|.IsAutomated||Docker Hub 提供的功能,會在該 Image 的 Repo 更新時,自動根據 DockerFile 重建新 Image,目前適用 Github 和 Bitbucket (Search可用)|
format 不限於在 Images 查詢時使用,包含下方的 Search 也可以下 format 指令
:::
### Docker Hub Image 的操作
#### 查詢 Docker Hub 的 Image
```
docker search [Image Name]
docker search --filter [filter condition] [Image Name]
docker search --format "[format condition]" [Image Name]
Kai 的操作範例
docker search mysql
docker search --filter stars=10 mysql
docker search --format "{{.Name}}: {{.StarCount}} : {{.IsOfficial}}: {{.IsAutomated}}" mysql
```



:::success
透過此指令可以讓 Docker 連上 Docker Hub 找尋想找的 Image
另外還可以透過 Filter 方式篩選、Format 方式進行查詢結果輸出等功能
:::
#### 從 Docker Hub 下載 Image
```
docker pull [Image Name]:[TAG]
docker pull [Image Name] -a
docker pull [Image Name]
Kai 的操作範例
docker pull mysql:5.7
```

:::success
透過 Pull 的方式,將想下載的 MYSQL 版本 Image,從 Docker Hub 抓下來
上述關於
docker pull [Image Name] -a
docker pull [Image Name]
將會把所有的 Image 都載下來,會非常耗費時間與空間,請開發者確定要下載的 Image 後再單獨抓會比較好,當然若是有特殊需求需要全抓,那這兩句語法可以滿足你需要~
:::
### Image 刪除
```
docker rmi [Repository or Image ID]
Kai 的操作範例
docker rmi hello-world
```

:::success
可以用此指令刪除 Images,但要注意的是,若當 Image 正被 Container 使用的話,系統是不會給你刪除的,就算 Container 是 Stop 狀態也是一樣,可以使用 force 的方式刪除,但完全不建議這樣,會導致 Container 可寫層物件的毀損。
:::
## 結語
:::danger
關於 Docker Image 的部分,其實還有很多部分沒有提到,但對於一般開發者來說,只要會上述基本款的就夠用了,其他透過官方文件的學習即可,就不放上來占版面了~
下篇將會分享 **Build DockerFile** 的學習心得
[六角鼠年鐵人賽 Week 5 - Build a suitale Image by DockerFile](/FriZ-QVpQd6FC7OrzMsZzw)
:::
首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA)
###### tags: `Docker`,`w3HexSchool`