Docker入门3 - 镜像 - 基本命令操作

131 阅读7分钟

Docker命令之镜像操作
Tips
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。

Pull 拉取镜像

docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
40dd5be53814: Pull complete 
Digest: sha256:d21b6ba9e19feffa328cb3864316e6918e30acfd55e285b5d3df1d8ca3c7fd3f Status: Downloaded newer image for ubuntu:18.04 docker.io/library/ubuntu:18.04

下载过程中可以看出,镜像文件一般由若干层(layer)组成,6c953ac5d795这样的串是层的唯一id(实际上完整的id包括256比特,64个十六进制字符组成)

如果是非官方
则要加上完整的前缀
docker pull hub.c.163.com/public/ubuntu:18.04

其他参数
-a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否;
--disable-content-trust:取消镜像的内容校验,默认为真。

Run 使用镜像

[root@yz117 ~]# docker run -it ubuntu:18.04
root@8497256e2213:/# echo "Hello Docker" 
Hello Docker

Images 查看镜像
来自于哪个仓库,比如ubuntu表示ubuntu系列的基础镜像;
镜像的标签信息,比如18.04、latest表示不同的版本信息。标签只是标记,并不能标识镜像内容;
镜像的ID(唯一标识镜像),如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;
创建时间,说明镜像最后的更新时间;
镜像大小,优秀的镜像往往体积都较小。

[root@yz117 ~]# docker 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信息,默认为否。

image.png

Tag 添加镜像标签
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。例如,添加一个新的myubuntu:latest镜像标签:

[root@yz117 ~]# docker tag ubuntu:18.04 myubuntu:18.04

image.png

Inspect 查看镜像详细信息
使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:

[root@yz117 ~]# docker inspect ubuntu:18.04

History 查看镜像历史信息
使用history子命令,该命令将列出各层的创建信息

[root@yz117 ~]# docker history ubuntu:18.04
[ { "Id": "sha256:c6ad7e71ba7d4969784c76f57c4cc9083aa96bb969d802f2ea38f4aaed90ff93", "RepoTags": [ "myubuntu:18.04", "ubuntu:18.04" ], "RepoDigests": [ "ubuntu@sha256:d21b6ba9e19feffa328cb3864316e6918e30acfd55e285b5d3df1d8ca3c7fd3f" ], "Parent": "", "Comment": "", "Created": "2022-04-29T23:20:51.577192429Z", "Container": "aba51cecb22eaf97d12c2a085f4c1e435ca9e812839de16b8466179f1fa75adb", "ContainerConfig": { "Hostname": "aba51cecb22e", "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:371db501ae9914c82bd9d1fb21d7a9f7d9a45e5c3a6d0d17750fb28f9de85893", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.12", "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:371db501ae9914c82bd9d1fb21d7a9f7d9a45e5c3a6d0d17750fb28f9de85893", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 63153704, "VirtualSize": 63153704, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/f630c3df7919202dd0254363594daefecd375d2cff9bb4ac660a2737512af0bc/merged", "UpperDir": "/var/lib/docker/overlay2/f630c3df7919202dd0254363594daefecd375d2cff9bb4ac660a2737512af0bc/diff", "WorkDir": "/var/lib/docker/overlay2/f630c3df7919202dd0254363594daefecd375d2cff9bb4ac660a2737512af0bc/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:3e549931e0240b9aac25dc79ed6a6259863879a5c9bd20755f77cac27c1ab8c8" ] }, "Metadata": { "LastTagTime": "2022-05-10T19:41:48.073903966+08:00" } } ]

image.png

Search 搜寻镜像


 -f, --filter filter:过滤输出内容;
 --format string:格式化输出内容;
 --limit int:限制输出结果个数,默认为25个;
 --no-trunc:不截断输出结果。
 
 搜寻官方带nginx关键字的镜像
 [root@yz117 ~]# docker search -f=is-official=true nginx 
 NAME DESCRIPTION STARS OFFICIAL AUTOMATED 
 nginx Official build of Nginx. 16753 [OK] 
 
 搜于stars等于4的trensorflow镜像
 [root@yz117 ~]# docker search -f=stars=4 trensorflow 

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序

image.png

Rm Prune 删除和清理镜像
1.使用标签删除镜像
使用docker rmi或docker image rm命令可以删除镜像,命令格式为docker rmiIMAGE [IMAGE...],其中IMAGE可以为标签或ID。

[root@yz117 ~]# docker rmi myubuntu:18.04 Untagged: myubuntu:18.04

2.使用镜像ID来删除镜像
当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

Tips
当有该镜像创建的容器存在时,镜像文件默认是无法被删除的

[root@yz117 ~]# docker ps -a #查看所有运行的容器

image.png

我们可以看到ubuntu容器正在运行,此时我们删除不了该镜像,我们可以使用-f参数强制删除,但是不推荐。

image.png

正确的步骤是先删除容器,再删除镜像:

image.png

3.清理镜像

[root@yz117 ~]# docker image prune -f 
Total reclaimed space: 0B

支持参数
-a, -all:删除所有无用镜像,不光是临时镜像;
-filter filter:只清理符合给定过滤器的镜像;
-f, -force:强制删除镜像,而不进行提示确认。

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:提交时暂停容器运行。

[root@yz117 ~]# docker commit -m "Add a new file" -a "Docker Newbee" 2da5ea8fb995 test:1 
sha256:cc7965383bc025c238704bea3841f6d1118407d1447605fd853e1c946c6e4b6e

Import 创建镜像
docker[image] import [OPTIONS] file|URL|-[REPOSITORY [:TAG]]
模板下载链接
openvz.org/Download/te…

image.png

DockerFile 创建镜像
File example

[root@yz117 ~]# cat dockercentos 
FROM centos 
ENV MYPATH /usr/local 
WORKDIR $MYPATH 
RUN yum -y install vim 
EXPOSE 80 
CMD echo $MYPATH 
CMD echo "success--------------ok" 
CMD /bin/bash

build
docker build -f dockercentos -t terry:myos .

Save Load 存出和载入镜像
如果要导出镜像到本地文件,可以使用docker [image] save命令。
该命令支持-o、-output string参数,导出镜像到指定的文件中。
例如,导出本地的ubuntu:18.04镜像为文件ubuntu_18.04.tar,如下所示:

[root@yz117 ~]# docker save -o ubuntu_18.04.tar ubuntu:18.04

可以使用docker [image] load将导出的tar文件再导入到本地镜像库。
支持-i、-input string选项,从指定文件中读入镜像内容。
例如,从文件ubuntu_18.04.tar导入镜像到本地镜像列表,如下所示:

[root@yz117 ~]# docker load -i ubuntu_18.04.tar
Loaded image: ubuntu:18.04

Push 上传镜像 可以使用docker[image] push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。
命令格式为docker [image] pushNAME[:TAG] |[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]。

push之前需要先进行登录 docker login -u xxx -p xxx
[root@yz117 ~]# docker push user/image:tag The push refers to repository 

image.png