使用Docker鏡像
獲取鏡像
鏡像是獲取容器的前提,官網的Docker Hub網站已經提供了數十萬個鏡像供大家開放下載。最好使用國內的鏡像加速網站,本人使用的是以下網易的鏡像加速:
#網易
http://hub-mirror.c.163.com
修改/etc/docker/daemon.json文件,此文件ubuntu下需自己創建並寫下:
{
"registry-mirrors":"http://hub-mirror.c.163.com"
}
然後執行
1、systemctl daemon-reload
2、systemctl restart docker
命令:docker [image] pull
實際使用:docker [image] pull NAME[:TAG]
參數解釋:
- NAME:鏡像倉庫名稱(用以區分鏡像);
- TAG:鏡像的標籤(往往用來表示版本信息);
例:獲取一個Ubuntu 18.04系統的基礎鏡像可以使用如下命令:
$docker pull ubuntu:18.04
同時,如果從非官方的倉庫下載,則需要在倉庫名稱前指定完整的倉庫地址。例如從網易蜂巢的鏡像源下載ubuntu18.04鏡像,可以使用如下命令,此時下載的鏡像名稱爲hub:
docker pull hub.c.163.com/public/ubuntu18.04
pull子命令支持的選項主要包括:
- -a,-all-tags=true | false:是否獲取倉庫中的所有鏡像,默認爲否;
- --disable-content-trust:取消鏡像的內容校驗,默認爲真;
這個時候,可以使用指令進行操作:
查看鏡像信息
主要介紹Docker鏡像的ls、tag和inspect子命令
1、使用image命令列出鏡像
命令:docker images 或 docker image ls
【解析】
- 來自於哪個倉庫,比如ubuntu表示ubuntu系列的基礎鏡像;
- 鏡像的標籤信息,比如18.04、latest表示不同的版本信息;
- 鏡像的ID(唯一標識鏡像),如果兩個鏡像的ID相同,說明它們實際上指向了同一個鏡像;
- 創建時間,說明鏡像的最後更新時間;
- 鏡像大小,優秀的鏡像往往體積都較小;
images子命令主要支持如下選項:
- -a,--all=true | false:列出所有(包括臨時文件)鏡像文件,默認爲否;
- --digests=true | false:列出鏡像的數字摘要值,默認爲否;
- -f,--filter=[ ]:過濾列出的鏡像,如dangling=true只顯示沒有被使用的鏡像,也可指定帶有特定標註的鏡像等;
- --format=“TEMPLATE”:控制輸出格式,如.ID代表ID信息,.Repository代表倉庫信息等;
- --no-trunc=true | false:對輸出結果中太長的部分是否進行截斷,如鏡像的ID信息,默認爲是;
- -q,--quiet=true | false:僅輸出ID信息,默認爲否;
2、使用tag命令添加鏡像標籤
爲了方便在後續工作中使用特定鏡像,還可以使用docker tag命令來爲本地鏡像任意添加新的標籤。
命令:docker tag
例:添加一個新的myubuntu:latest鏡像標籤:
docker tag ubuntu:latest myubuntu:latest
3、使用inspect命令查看詳細信息
命令:docker [image] inspect
例子:docker [image] inspect ubuntu:18.04
返回:一串Json格式的數據
【注】如果只要其中一項內容時,可以使用-f來指定,例如,獲取鏡像的Architecture:
docker [image] inspect -f {{".Architecture"}} ubuntu:18.04
4、使用history命令查看鏡像歷史
既然鏡像文件由多個層組成,那麼怎麼知道每個層的內容具體是什麼呢?
命令:history子命令,列出各層的創建信息
例:查看ubuntu18.04鏡像的創建過程,可以使用如下命令:
docker history ubuntu:18.04
搜尋鏡像
主要介紹Docker鏡像的search子命令
命令:docker search [option] keyword
【參數解析】
- -f,--filter filter:過濾輸出內容;
- --format string:格式化輸出內容;
- --limit int:限制輸出結果個數,默認爲25個;
- --no-trunc:不截斷輸出結果;
例1:搜索官方提供的帶nginx關鍵字的鏡像
例2:搜索所有收藏數超過4的關鍵字包括tensorflow的鏡像
刪除和清理鏡像
主要介紹Docker鏡像的rm和prune子命令
1、使用標籤刪除鏡像
命令:docker rmi 或 docker image rm
格式:docker rmi IMAGE [IMAGE...]
【參數解析】
- IMAGE可爲標籤或ID;
- -f,-force:強制刪除鏡像,即使有容器依賴它;
- -no-prune:不要清理未帶標籤的父鏡像;
例:要刪掉myubuntu:latest鏡像,可以使用如下命令
【注】
- 當指定了標籤進行刪除操作時,刪除的僅僅的標籤對應的鏡像,其餘的不作改變;
- 當鏡像只剩下一個標籤時,此時使用刪除命令會徹底刪除鏡像;
2、使用鏡像ID來刪除鏡像
【注】當有該鏡像的容器存在時,鏡像文件默認是無法被刪除的,如果想要強制刪除,必須使用-f參數。
通常不推薦使用強制參數來刪除一個存在容器依賴的鏡像。正確的做法是:先刪除依賴該鏡像的所有容器,再來刪除鏡像。
3、清理鏡像
使用Docker一段時間後,系統中可能會遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,可以通過docker image prune命令來清理。
命令:docker image prune
【參數解析】
- -a,-all:刪除所有無用鏡像,不光是臨時鏡像;
- -filter filter:只清理符合給定過濾器的鏡像;
- -f,-force:強制刪除鏡像,而不進行提示確認;
例:如下命令會自動清理臨時的遺留鏡像文件層,最後會提示釋放的存儲空間
創建鏡像
創建鏡像的方法主要有三種:
- 基於已有鏡像的容器創建;
- 基於本地模板導入;
- 基於Dockerfile創建;
主要介紹Docker的commit、import和build子命令
1、基於已有容器創建
主要使用docker [container] commit子命令
命令:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY [:TAG] ]
【參數解析】
- -a,--author=“”:作者信息;
- -c,--change=[ ]:提交的時候執行Dockerfile指令,包括CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR等;
- -m,--message=“”:提交信息;
- -p,--pause=true:提交時暫停容器運行;
下面演示如何使用該命令創建一個新鏡像:
首先,啓動一個鏡像,並在其中進行修改操作。例如,創建一個test文件,之後退出:
【注】記住容器的ID爲197fd52cbe8a。
此時該容器與原鏡像相比,已經發生了改變,可以使用docker [container] commit命令來提交成爲一個新的鏡像
【注】Docker技術入門與實戰一書中,在上圖箭頭處會多一個[ container ],作修改如圖。
順利的話,會返回新創建鏡像的ID信息,如上圖。
2、基於本地模板導入
用戶可以直接從一個操作系統模板文件導入一個鏡像,主要使用docker [container] import命令。
命令:docker [image] import [OPTIONS] file | URL | -[REPOSITORY [:TAG] ]
3、基於Dockerfile創建
Dockerfile是一個文本文件,利用給定的指令描述基於某個父鏡像創建新鏡像的過程。
使用docker build,用戶可以創建一個連續執行多個命令行指令的自動化構建的鏡像。
Docker鏡像是分層結構,由只讀層組成,每個只讀層表示Dockerfile指令。這些層被堆疊起來,每一層都是前一層變化的增量。例如:
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
上面沒條指令的含義:
- FROM :創建一個基礎鏡像層(基於ubuntu:18.04),之後的指令都是基於該層的。因此一個 Dockerfile 中 FROM 是必備的指令,並且必須是第一條指令。
- COPY :將docker客戶端當前目錄中的文件全部 copy 到容器中的/app目錄中。
- RUN :使用make構建應用程序,RUN 指令是用來執行命令行命令的。
- CMD :指定在容器中運行什麼命令。
當您運行一個鏡像像並生成一個容器時,將在底層層上添加一個新的可寫層(“容器層”)。對正在運行的容器所做的所有更改,如寫入新文件、修改現有文件和刪除文件,都被寫入這個可寫的容器層。
存儲和載入鏡像
主要介紹Docker鏡像的save和load子命令。
命令:docker [image] save 或 docker [image] load
1、存入鏡像
命令:docker [image] save
【參數支持】
- -o、-output string參數,導出鏡像到指定的文件中
例:導出本地的ubuntu18.04鏡像爲文件ubuntu_18.04.tar.gz
之後,即可通過分享tar.gz包將該鏡像分享給他人。
2、載入鏡像
可以使用docker [image] load將導出的tar文件再導入到本地鏡像庫。
【參數支持】
- -i、-input string選項,從指定文件中讀入鏡像內容
例:從文件ubuntu_18.04.tar.gz導入鏡像到本地鏡像列表
上傳鏡像
主要介紹Docker鏡像的push子命令
命令:docker [image] push NAME[:TAG] | [REGISTRY_HOST [:REGISTRY_PORT] / ] NAME [:TAG]
使用docker [image] push上傳鏡像到倉庫,默認上傳到Docker Hub官方倉庫(需要登錄)。