使用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官方仓库(需要登录)。