1. 程式人生 > >學習Docker(2017-10-4)

學習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'

關於 ssh
關於 pv

刪除本地映象

格式: 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 和 摘要

  1. 我們都知道映象的唯一標示是 ID 和 摘要 ,而一個映象可以有更多個標籤,因此當我們指定標籤刪除映象,如果還有其他標籤的對應這個映象,就不會發生delete 行為,而 untaggged 使我們取消了所有的標籤,當所有標籤取消後就可以出發 delete 行為
  2. 映象之間的依賴,映象是多層結構,刪除的時候也是從上層向基礎層方向依次進行判斷刪除,如果其他映象依賴於待刪除的某一層,也不會觸發 delete 效果
  3. 容器對映象的依賴,如果有用這個映象啟動的容器存在,那麼就不能刪除映象。容器是以映象為基礎新增一層容器儲存器,組成的多層儲存結構去執行。因此該映象如果被這個容器所依賴的,就需要先刪除容器,在刪除映象

用 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)