Docker學習之鏡像操作
使用Docker鏡像
以下都是Docker鏡像的一系列重要名操作,包括獲取、查看、搜索、刪除、創建、存出或載入、上傳等。可使用docker image help命令查看幫助。
1.獲取鏡像(pull)
使用pull子命令下載鏡像
格式為: docker [image] pull NAME[:TAG],其中,NAME是鏡像倉庫名稱,用以區分鏡像,
TAG是鏡像的標簽,往往用來表示版本信息,如果不顯示指定TAG,則默認為latest標簽,這會下載倉庫中最新版本的鏡像。例如獲取一個centos系統的基礎鏡像可以使用如下的命令:
$ docker pull centos sudo docker pull centos Using default tag: latest latest: Pulling from library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer image for centos:latest
鏡像文件一般由若幹層(layer)組成,每一層都對應一個唯一的id(完整的id包括256比特,64個十六進制字符組成)
docker默認是從官方倉庫下載鏡像,官方的鏡像註冊服務器可省略。 docker pull ubuntu:18.04命令相當於: docker pull registry.hub.docker.com/ubuntu:18.04
如果從其他地址下載,需要填寫鏡像註冊服務器地址,例如從網易蜂巢的鏡像源來下載ubuntu18.04鏡像:
text docker pull hub.c.163.com/public/ubuntu:18.04
pull子命令支持的選項主要包括:
text -a, --all-tags=true|false: 是否獲取鏡像中的所有鏡像,默認為否; --disable-content-trust: 取消鏡像的內容校驗,默認為真 --registry-mirror=proxy_url:指定鏡像代理服務地址(如:https://registry.docker-cn.com)
使用centos鏡像創建一個容器,並在其中運行bash應用:
$ docker run -it centos [root@5797962d59c1 /]# echo "Hello World" Hello World [root@5797962d59c1 /]#
2. 查看鏡像(images & tag & inspect & history)
使用Docker鏡像的images、tag、inspect和history子命令。
使用images命令列出鏡像
使用docker images或docker image ls命令,可以列出本地主機上已有鏡像的基本信息。$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 3 months ago 202MB
各字段詳細描述如下:
REPOSITORY:來源於哪個倉庫,比如ubuntu表示ubuntu系列的基礎鏡像
TAG:鏡像的標簽信息,比如18.04、latest表示不同的版本信息
IMAGE ID:鏡像ID(唯一標識鏡像),如果兩個鏡像的ID相同,則它們指向同一個鏡像,只是具有不同標簽名。
CREATE:創建時間,說明鏡像最後的最新時間
SIZE:鏡像大小使用tag命令添加鏡像標簽
$ sudo docker tag centos:latest mycentos:latest $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 3 months ago 202MB mycentos latest 1e1148e4cc2c 3 months ago 202MB
使用inspect命令查看詳細信息
使用docker [image] inspect 命令可以獲取該鏡像的詳細信息,包括作者、適應架構、各層的數字摘要等。$ sudo docker inspect centos [ { "Id": "sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb", "RepoTags": [ "centos:latest" ], "RepoDigests": [ "centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426" ], "Parent": "", "Comment": "", "Created": "2018-12-06T00:21:07.135655444Z", "Container": "1fdbb0fcc184eb795364f7aa5fdc00299d0a2b90d8e26b4696217c22da7f983f", "ContainerConfig": { ... }, "DockerVersion": "17.06.2-ce", "Author": "", "Config": { ... }, "Architecture": "amd64", "Os": "linux", "Size": 201779604, "VirtualSize": 201779604, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/merged", "UpperDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/diff", "WorkDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
docker [image] inspect centos返回的是一個JSON格式的消息,如果只需要其中一項內容時,可以使用-f子命令指定,
例如,獲取鏡像的Architecture:$ docker [image] inspect -f {{.Architecture}} centos amd64
使用history命令查看鏡像歷史
history子命令,可以查看鏡像各層的創建信息$ docker history centos IMAGE CREATED CREATED BY SIZE COMMENT e1148e4cc2c 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <\missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <\missing> 3 months ago /bin/sh -c #(nop) ADD file:6f877549795f4798a… 202MB
可使用history子命令--no-trunc查看被截短的命令
3. 搜尋鏡像(search)
使用search子命令搜索鏡像
語法為:docker search [option] keyword。支持的命令選項可以通過docker search "-" + "TAB"提示補充。$ docker search [option] keyword
4. 刪除和清理鏡像(rmi & rm)
使用標簽刪除鏡像
使用docker rmi或docker image rm命令可以刪除鏡像,命令格式為docker rmi IMAGE [IMAGE...],其中IMAGE可以為標簽或ID$ docker rmi IMAGE [IMAGE...] $ docker image rm label IMAGE [IMAGE...] 支持的選項有: -f, -force: 強制刪除鏡像,即使有容器依賴它 -no-prune: 不要清理未帶標簽的父鏡像
當同一個鏡像擁有多個標簽的時候,docker rmi命令只是刪除了該鏡像多個標簽中的指定標簽而已,並不影響鏡像文件。
當鏡像只剩下一個標簽的時候,docker rmi命令會刪除這個鏡像文件的所有文件層使用鏡像ID來刪除鏡像
先使用docker rm id刪除容器,然後再使用docker rmi id刪除鏡像。$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 210a3d3375d4 ubuntu:18.04 "/bin/bash" 7 seconds ago Exited (0) 3 seconds ago brave_bardeen $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 47b19964fb50 4 weeks ago 88.1MB $ docker rm 210a3d3375d4 210a3d3375d4 $ docker rmi 47b19964fb50 Untagged: ubuntu:18.04 Untagged: ubuntu@sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5b35a24b41a86077c650210 Deleted: sha256:47b19964fb500f3158ae57f20d16d8784cc4af37c52c49d3b4f5bc5eede49541 Deleted: sha256:d4c69838355b876cd3eb0d92b4ef27b1839f5b094a4eb1ad2a1d747dd5d6088f Deleted: sha256:1c29a32189d8f2738d0d99378dc0912c9f9d289b52fb698bdd6c1c8cd7a33727 Deleted: sha256:d801a12f6af7beff367268f99607376584d8b2da656dcd8656973b7ad9779ab4 Deleted: sha256:bebe7ce6215aee349bee5d67222abeb5c5a834bbeaa2f2f5d05363d9fd68db41
當有容器運行時,使用docker -rmi id刪除容器是無法成功的,如果想強制刪除使用-f參數。一般推薦使用以上方法,
先刪除鏡像對應的所有容器,然後再刪除鏡像。清除鏡像
使用Docker一段時間後,系統中可異能遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,可以通過命令清理:docker image prune 支持的選項有: -a, -all:刪除所有無用鏡像,不光是臨時鏡像; -filter filter:只清理復合給定過濾器的鏡像; -f, -force:強制刪除鏡像,而不進行提示確認;
5. 創建鏡像(commit & import & Dockerfile)
創建鏡像的方法有三種:基於已有的容器創建、基於本地模板導入、基於Dockerfile創建
基於已有容器創建(commit子命令)
該方法主要是使用docker commit命令
命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 支持選項: -a, --author="": 作者信息; -c, --change=[]: 提交的時候執行Dokerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等 -m, --message="": 提交消息; -p, --pause=true: 提交時暫停容器運行 實例如下: $ docker run -it ubuntu:18.04 /bin/bash root@25b742d78f24:/# touch test root@25b742d78f24:/# exit
當前容器相比於原ubuntu:18.04鏡像,已經發生了改變,可以使用docker commit命令來提交為一個新的鏡像。
$ docker [container] commit -m "Added a new file" -a "[email protected]" 25b742d78f24:1.0.0 sha256:59fc18f43457af8ba1084094f1c7b33edb7a0d263409fb0912ba280fdd1a30ca $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 1.0.0 59fc18f43457 17 seconds ago 88.1MB ubuntu 18.04 47b19964fb50 4 weeks ago 88.1MB ubuntu latest 47b19964fb50 4 weeks ago 88.1MB
基於本地模板導入(import子命令)
可以直接從一個操作系統模板文件導入一個鏡像,使用docker import命令,命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
要直接導人一個鏡像,可以使用 OpenVZ 提供的模板來創建,或者用其他已導出的鏡像模板來創建 。
OPENVZ 模板的下載地址為 http://openvz.org/Download/templates/precreated。例如,下載了 ubuntu-18.04 的模板壓縮包,之後使用以下命令導人即可:
$ cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
然後查看新導入的鏡像,已經在本地存在了:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 47b19964fb50 4 weeks ago 88.1MB
基於Dockerfile創建
基於Dockerfile創建是常見的方式。Dockerfile是一個文本文件,利用給定的指令描述基於某個父鏡像創建新鏡像的過程。
見其他章節詳解。
6. 存出和載入鏡像(save & load)
Docker鏡像的save和load命令。
存出鏡像
如果要導出鏡像到本地文件,可以使用docker [image] save命令,支持 -o、-output string參數,導出鏡像到指定的文件中。導出本地的ubuntu:18.04鏡像到文件ubuntu_18.04.tar:
```text
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1.0.0 59fc18f43457 3 hours ago 88.1MB
ubuntu 18.04 47b19964fb50 4 weeks ago 88.1MB
ubuntu latest 47b19964fb50 4 weeks ago 88.1MB$ docker save -o ubuntu_18.04.tar ubuntu:18.04
```至此,可以將ubuntu_18.04.tar分享給別人。
載入鏡像
可以使用docker [image] load將導出的tar文件再導入到本地鏡像庫。支持-i、-input string選項,從指定文件中讀入鏡像內容。例如,從文件ubuntu_18.04.tar導入鏡像到本地鏡像列表,如下所示:
$ docker load -i ubuntu_18.04.tar 或者 $ docker load < ubuntu_18.04.tar
這將導入鏡像及其相關的元數據信息(包括標簽等)。導入成功後,可以使用docker images命令進行查看,與原鏡像一致。
7. 上傳鏡像(push)
上傳鏡像
可以使用docker [image] push 命令上傳鏡像到倉庫,默認上傳到Docker Hub官方倉庫(需要登錄)。命令格式:docker [image] push NAME[:TAG],或者上傳到非官方倉庫 docker [image] push [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] 例如:用戶user上傳本地的test:latest鏡像,可以先添加新的標簽user/test:latest,然後用docker [image] push命令上傳鏡像: $ docker tag test:latest user/test:latest $ docker push user/test:latest
第一次上傳時,會提示輸入登錄信息或進行註冊,之後登錄信息會記錄到本地~/.docker目錄下
Docker學習之鏡像操作