Docker image/镜像相关命令
镜像相关命令
获取镜像
从官方仓库获取镜像
$ 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