鏡像相關命令
獲取鏡像
從官方倉庫獲取鏡像
$ docker[image] pull NAME[:tag]
# 等同於
$ docker[image] pull registry.hub.docker.com/NAME[:tage]
- 不加 tag,默認下載的 latest 版本
eg:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
f46992f278c2: Pull complete
Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
使用非官方倉庫下載鏡像
$ docker[image] pull url/NAME[:tage]
# eg
$ docker pull hub.c.163.com/public/ubuntu:18.04
使用 images 命令列出鏡像
使用 docker images 或 docker image ls 命令可以列出本地已有的鏡像的基本信息
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 7266638574fb 29 hours ago 56.6MB
rabbitmq management e06e2cb8dff0 8 months ago 178MB
openjdk 11.0.10-jdk e39d5911ffc8 8 months ago 637MB
halohub/halo latest 95d3f180227d 8 months ago 316MB
im-server 0.1 81e97a086368 8 months ago 325MB
mongo 4.4.3 095aea9826c2 8 months ago 469MB
postgres 12.5 72f9cd99893c 9 months ago 300MB
redis alpine 2bae1be2a13c 10 months ago 31.7MB
alpine latest afeebe901d6b 10 months ago 5.32MB
redis latest e26416b7c483 10 months ago 98.5MB
ubuntu latest 1c28a1589115 10 months ago 65.7MB
ubuntu <none> 84282c80cdda 10 months ago 56.7MB
arm64v8/elasticsearch 7.8.0 9522ad0a773f 16 months ago 1.33GB
houwm/jdk8 latest bbfbacf7c6b0 22 months ago 251MB
python 3.4-alpine 99a53e6ad17e 2 years ago 80.6MB
-
REPOSITORY:鏡像來源的倉庫
-
TAG:鏡像的標簽/版本
-
IMAGE ID:鏡像的ID(唯一標識),如果兩個鏡像的ID相同,說明它們實際指向同一個鏡像,只是具有不同的標簽名稱而已
-
CREATED:鏡像最后的更新時間
-
SIZE:鏡像大小
images 支持以下子命令
- -a,-all=true|false:列出所有(包括臨時文件)鏡像文件,默認為否
- --digests=ture|false:列出鏡像的數字摘要,默認為否
- -f,-filter=[]:過濾列出鏡像,如 dangling=true 是現實被使用的鏡像
- --format="TEMPLATE":控制輸出格式,如ID代表ID信息,Repository代表倉庫信息等
- --no-trunc=true|false:對輸出結果中太長的部分是否截斷,如鏡像的ID信息,默認為是
- -q,--quiet=true|false:僅輸出ID信息
使用 tag 命令添加鏡像標簽
為了方便在后續工作中使用特定鏡像,可以使用 docker tag 命令為本地鏡像添加新的名稱和標簽
$ docker tag ubuntu:18.04 myubuntu:1.0
再次使用 docker images 可以看到多出了myubuntu:1.0 鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 7266638574fb 30 hours ago 56.6MB
myubuntu 1.0 7266638574fb 30 hours ago 56.6MB
使用 inspect 查看鏡像的詳細信息
$ docker[image] inspect NAME:TAG
例如查看鏡像 ubuntu:18.04 的詳細信息
$ docker inspect ubuntu:18.04
可以得到如下結果
[
{
"Id": "sha256:7266638574fb52620df20fea4dbcc00e2e508f497033dd80fc0a7a02e024a118",
"RepoTags": [
"myubuntu:1.0",
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6"
],
"Parent": "",
"Comment": "",
"Created": "2021-10-16T01:47:38.799627788Z",
"Container": "6f3fdaf3fd520e2fbc9582c3e4a7420e45a0a5bb1358b7d49cba43e635c6ff6e",
"ContainerConfig": {
"Hostname": "6f3fdaf3fd52",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"bash\"]"
],
"Image": "sha256:3ef4f79929dfb2c09550123b7bb6923b23cccff8e00c8a2a37ed758f3b9898ab",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"bash"
],
"Image": "sha256:3ef4f79929dfb2c09550123b7bb6923b23cccff8e00c8a2a37ed758f3b9898ab",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "arm64",
"Variant": "v8",
"Os": "linux",
"Size": 56629564,
"VirtualSize": 56629564,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/a23bfae2444e5d12231573215580fdadfc066be57ad65b355be4c91d27d549a0/merged",
"UpperDir": "/var/lib/docker/overlay2/a23bfae2444e5d12231573215580fdadfc066be57ad65b355be4c91d27d549a0/diff",
"WorkDir": "/var/lib/docker/overlay2/a23bfae2444e5d12231573215580fdadfc066be57ad65b355be4c91d27d549a0/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:0588f50388e8c774dceb269b18ef6448aad63daa67b14244656f79c1a29ec54a"
]
},
"Metadata": {
"LastTagTime": "2021-10-17T07:25:36.478608383Z"
}
}
]
使用 hsitory 查看鏡像歷史
鏡像文件是由多個層組成,可以使用 history 命令查看鏡像的每個層的信息,例如查看 ubuntu:18.04 的歷史
$ docker history ubuntu:18.04
IMAGE CREATED CREATED BY SIZE COMMENT
7266638574fb 30 hours ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 30 hours ago /bin/sh -c #(nop) ADD file:35e2504756850fc1a… 56.6MB
注意,如果命令太長被截斷了,可以使用 --no-trunc 來輸出完成命令
$ docker history --no-trunc ubuntu:18.04
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:7266638574fb52620df20fea4dbcc00e2e508f497033dd80fc0a7a02e024a118 30 hours ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 30 hours ago /bin/sh -c #(nop) ADD file:35e2504756850fc1add00516fa89b0499b59c348457a96708eedb61313e7b25e in / 56.6MB
搜索鏡像
搜索官方倉庫 Docker Hub 的鏡像
$ docker search [option] keyword
支持的 option 主要包括
- -f:過濾輸出內容
- --format:格式化輸出內容
- --limit:限制輸出個數,默認 255
- --no-trunc:不截斷輸出結果
例如,搜索官方提供的 nginx
$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15642 [OK]
例如,搜索收藏數大於 200 的 nginx 鏡像
$ docker search --filter=stars=200 nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15642 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2077 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 818 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 256
刪除鏡像
使用標簽刪除鏡像
$ docker rmi NAME:TAG
$ docker image rm NAME:TAG
支持選項包括
- -f:強制刪除鏡像,即使有容器依賴該鏡像
- -no-prune:不要清理未帶標簽的父鏡像
例如,刪除 myubuntu:1.0
$ docker rmi myubuntu:1.0
Untagged: myubuntu:1.0
使用鏡像ID刪除鏡像
可以使用 docker rmi 后面來跟上鏡像ID來刪除鏡像
刪除有容器依賴的鏡像
$ docker rmi ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container 9656574ad170 is using its referenced image 7266638574fb
無法刪除,有容器依賴的鏡像,可以添加 -f 選項,強制刪除(不推薦),應該先刪除容器,再刪除鏡像
# 刪除容器
$ docker rm 9656574ad170
# 刪除鏡像
$ docker rmi ubuntu:18.04
清理鏡像
使用 Docker 一段時間后,系統可能會遺留一些,臨時鏡像,使用docker image prune命令來進行清理
支持的選項包括
- -a:刪除沒用到的鏡像(沒創建r容器),不光是臨時鏡像
- --filter:只清理符合條件的鏡像
- -f:強制刪除鏡像,不進行提示
創建鏡像
創建鏡像主要有三種方式,非別是
- 基於容器創建
- 基於本地模板導入
- 基於Dockerfile創建
下面介紹主要第一種方式,第二種方式用的不多,基於Dockerfile創建是一個重點,會單獨寫一個文檔介紹
基於已有容器創建
$ docker commit [option] container-id NAME:TAG
例如,先使用 ubuntu:18.04 創建一個容器,在進入容器,創建一個文件,此時容器內容已經以原有鏡像不同了,再使用命令基於當前容器創建一個自己的鏡像
$ docker run -it ubuntu:18.04 bash
root@e4a1ee5a2941:/# touch test.txt
root@e4a1ee5a2941:/# echo hello > test.txt
root@e4a1ee5a2941:/# exit
exit
$ docker commit -m "Add a new file" -a="linck" e4a1ee5a2941 test:0.1
sha256:2360c72e2c2c393d7f654a882cfba163518d802f65b477a5bdadb336dedbf320
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 2360c72e2c2c 5 seconds ago 56.6MB
ubuntu 18.04 7266638574fb 37 hours ago 56.6MB
$ docker history test:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
2360c72e2c2c 16 seconds ago bash 49B Add a new file
7266638574fb 37 hours ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 37 hours ago /bin/sh -c #(nop) ADD file:35e2504756850fc1a… 56.6MB
可選的 option 主要包括
- -a,--author="":作者信息
- -m,--message="":提交信息
- -p,--pause=true:提交時,暫停容器的運行
- -c,--change=[],提交時,執行Dockerfile命令
基於模板導入
$ docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
例如下載了ubuntu-18.04 的模板壓縮包,之后使用命令導入
$ docker import ubuntu-18.04-x86_64-minimal.tar.gz ubuntu:18.04
導出和載入鏡像
使用 save 和 load 命令來導出和導入 docker 鏡像
# 導出 test:0.1 鏡像到 test:0.1.tar 文件
$ docker save -o test:0.1.tar test:0.1
$ ls -l
-rw------- 1 linchangkun staff 58894336 10 17 23:28 test:0.1.tar
# 刪除 test:0.1 鏡像
$ docker rmi test:0.1
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 7266638574fb 38 hours ago 56.6MB
rabbitmq management e06e2cb8dff0 8 months ago 178MB
openjdk 11.0.10-jdk e39d5911ffc8 8 months ago 637MB
mongo 4.4.3 095aea9826c2 8 months ago 469MB
postgres 12.5 72f9cd99893c 9 months ago 300MB
ubuntu <none> 84282c80cdda 10 months ago 56.7MB
arm64v8/elasticsearch 7.8.0 9522ad0a773f 16 months ago 1.33GB
houwm/jdk8 latest bbfbacf7c6b0 22 months ago 251MB
python 3.4-alpine 99a53e6ad17e 2 years ago 80.6MB
# 從文件載入 test:0.1 鏡像
$ docker load -i test:0.1.tar
6839163c14a9: Loading layer 3.584kB/3.584kB
Loaded image: test:0.1
# 查看 test:0.1 鏡像已經有了
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 2360c72e2c2c 22 minutes ago 56.6MB
ubuntu 18.04 7266638574fb 38 hours ago 56.6MB
rabbitmq management e06e2cb8dff0 8 months ago 178MB
openjdk 11.0.10-jdk e39d5911ffc8 8 months ago 637MB
mongo 4.4.3 095aea9826c2 8 months ago 469MB
postgres 12.5 72f9cd99893c 9 months ago 300MB
ubuntu <none> 84282c80cdda 10 months ago 56.7MB
arm64v8/elasticsearch 7.8.0 9522ad0a773f 16 months ago 1.33GB
houwm/jdk8 latest bbfbacf7c6b0 22 months ago 251MB
python 3.4-alpine 99a53e6ad17e 2 years ago 80.6MB
運行鏡像
運行鏡像會利用該鏡像啟動一個容器,例如使用剛剛下載的 ubuntu:18.04 鏡像創建一個容器,並在其中使用 bash,執行打印 Hello World!
$ docker run -it ubuntu:18.04 bash
root@9656574ad170:/# echo "Hello World!"
Hello World!
root@9656574ad170:/# exit
exit
