學習Docker(2017-10-4)
本節目錄:
1. 其他生成映象的方法
- 從 rootfs 壓縮包匯入
- docker save 和 docker load
2. 刪除本地映象
- 用 ID、映象名、摘要刪除映象
- Untagged 和 Deleted
- 用 docker images 命令來配合
今天可能要出去,所以一大早上就要把今天要學習的內容學完ヾ(◍°∇°◍)ノ゙
其他生成映象的方法
除了使用 Dockerfile 生成映象的方法外,由於各種特殊需求和歷史原因,還提供了其他方法用以生成映象
從 rootfs 壓縮包匯入
格式: docker import [選項]<檔案>||-[<倉庫名>[:<標籤>]]
解釋: 壓縮包可以是本地檔案、遠端 Web 檔案、甚至是從標準輸入中得到。 壓縮包將會在映象/目錄展開,並直接作為映象的第一次提交
實踐:
比如我們想要建立一個 OpenVZ 的 Ubuntu 14.04 模板的映象:
docker import
http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
openvz/ubuntu:14.04
因為命令過長 上面一條命令 我把他分為三行,這條命令下載 .tar.gz 檔案,並作為根檔案系統展開匯入,並儲存為映象 openvz/ubuntu:14.04,匯入成功後,docker images
docker history openvz/ubuntu:14.04
檢視歷史
docker save 和 docker load
Docker 還提供 docker save 和 docker load 命令用於將映象儲存為一個 tar 檔案,然後傳輸到另一個位置上,再載入進來
這是在沒有 Docker Registry 時的做法,現在已經不推薦,映象遷移應該直接使用 Docker Registry ,無論是直接使用 Docker Hub 還是使用內網私有 Registry 都可以。
儲存映象
使用 docker save 將映象儲存為歸檔檔案。
實踐:
儲存映象命令
docker save apline | gzip > apline-latest.tar.gz
問題: windows 不識別 gzip 命令
解決: 下載 gzip for windows 版本
將 alpine-latest.tar.gz 複製到另一個機器上,然後使用下面命令載入映象
docker load -i alpine-latest.tar.gz
如果我們結合這兩個命令以及 ssh 甚至 pv 的話,利用 Linux 強大的管道,我
們可以寫一個命令完成從一個機器將映象遷移到另一個機器,並且帶進度條的功
能:
docker save <映象名> | bzip2 | pv | ssh <使用者名稱>@<主機名> 'cat | do
cker load'
刪除本地映象
格式: docker rmi [選項]<映象1>[<映象2>…]
用 ID、映象名、摘要刪除映象
實踐:
比如我們要刪除,apline 映象,可以執行;
- docker iamges 檢視映象資訊
- docker rmi 映象ID 如果刪除不了 加 -f 強制刪除
或者 docker ps -a
檢視所有 container id ,然後先 停止所有 container ID 然後在刪除
- 使用 映象名,刪除
docker rmi 倉庫名:標籤
- 更準確的使用 映象摘要刪除映象
docker images --digests
Untagged 和 Deleted
如果仔細發現,刪除行為 有兩類
1. Deleted
2. Untagged
前面介紹過,映象的唯一標識是其 ID 和 摘要
- 我們都知道映象的唯一標示是 ID 和 摘要 ,而一個映象可以有更多個標籤,因此當我們指定標籤刪除映象,如果還有其他標籤的對應這個映象,就不會發生delete 行為,而 untaggged 使我們取消了所有的標籤,當所有標籤取消後就可以出發 delete 行為
- 映象之間的依賴,映象是多層結構,刪除的時候也是從上層向基礎層方向依次進行判斷刪除,如果其他映象依賴於待刪除的某一層,也不會觸發 delete 效果
- 容器對映象的依賴,如果有用這個映象啟動的容器存在,那麼就不能刪除映象。容器是以映象為基礎新增一層容器儲存器,組成的多層儲存結構去執行。因此該映象如果被這個容器所依賴的,就需要先刪除容器,在刪除映象
用 docker images 命令來配合
例項:
$ docker rmi $(docker images -q -f dangling=true)
刪除所有倉庫名為 redis 的映象:
$ docker rmi $(docker images -q redis)
刪除所有 mongo:3.2 之前的版本
$ docker rmi $(docker images -q -f before=mongo:3.2)