使用Docker镜像(第三章)
- 关键词:如何使用Docker镜像
使用Docker镜像
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
获取镜像
- 1.获取镜像:
docker [image] pull NAME[:TAG] => docker pull ubuntu:18.04
NAME是镜像仓库名称(区分镜像),TAG是镜像的标签(表示版本信息)。
如果不显示指定TAG,则默认会选择latest版本。注意,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。为了稳定性,不要在生产环境中忽略镜像的标签信息。
下载的镜像文件一般由若干层(layer)组成,每层都有唯一的ID。使用docker pull命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小内存空间。
是否会出现不同的镜像仓库服务器可能会出现镜像重名的情况?
严格地讲,镜像的仓库名称中还应该添加仓库地址(即Registry,仓库服务器)。
示例:docker pull registory.hub.docker.com/ubuntu:18.04
pull子命令 | 说明 |
---|---|
-a, –all-ags=true|false | 是否获取仓库中的所有镜像,默认为否 |
–disable-content-trust | 取消镜像的内容校验,默认为真 |
使用镜像代理服务器加速docker镜像获取过程,可以在docker服务启动配置中增加–registry-mirror=proxy_URL来指定镜像代理服务地址。
- 2.下载镜像到本地后,利用镜像创建一个容器,在其中运行bash应用,执行打印“hello world”命令:
docker run -it ubuntu:18.04 bash + echo “Hello World” + exit
- 查看镜像信息(使用images命令列出镜像):
docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息(仓库、标签信息、ID、创建时间、镜像大小)
images子命令 | 说明 |
---|---|
-a, –all-ags=true|false | 列出所有(包括临时文件)镜像文件,默认为否 |
–digests=true|false | 列出镜像的数字摘要值,默认为否 |
-f, –filter=[] | 过滤列出的镜像, 如dangling 式rue 只显示没有被使用的镜像;也可指定带有特定标注的镜像等 |
–format=”TEMPLATE” | 控制输出格式,如. ID代表ID信息,.Repository代表仓库信息等 |
–no-trunc=true|false | 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是 |
-q, –quiet=true|false | 仅输出ID信息, 默认为否 |
其中, 还支持对输出结果进行控制的选项,如-f. –filter=[]、–no-trunc=true|false、 -q、 –quiet==true|false等。
更多子命令选项还可以通过man docker-images来查看。
- 3.使用tag命令添加镜像标签:
添加一个新的myubuntu: latest镜像标签:docker tag ubuntu:latest myubuntu:latest
实际上指向了同一个镜像文件,只是别名不同而巳。docker tag命令添加的标签实际上起到了类似链接的作用。
- 使用inspect命令查看详细信息:
使用docker [image] inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等
docker [image] inspect ubuntu:18.04
上面代码返回的是一个JSON格式的消息, 如果我们只要其中一项内容时, 可以使用-f来指定:
获取镜像的Architecture:docker [image] inspect -f .Architecture ubuntu:18.04
- 4.使用history命令查看镜像历史:
docker history ubuntu: 18.04
搜寻镜像
使用docker search命令可以搜索Docker Hub官方仓库中的镜像。语法为 docker search [option] keyword。
search子命令 | 说明 |
---|---|
-f, –filter filter | 过滤输出内容 |
–format string | 格式化输出内容 |
–limit int | 限制输出结果个数,默认为25个 |
–no-trunc | 不截断输出结果 |
搜索官方提供的带nginx关键字的镜像:docker search –filter=is-official=true nginx
搜索所有收藏数超过4的关键词包括tensorflow的镜像:docker search –filter=stars=4 tensorflow
删除和清理镜像
Docker镜像的rm和prune子命令。
- 1.使用标签删除镜像:
使用docker rmi或 docker image rm命令可以删除镜像,命令格式为docker rmi IMAGE [OPTIONS] [IMAGE…],其中IMAGE可以为标签或ID。
rmi子命令 | 说明 |
---|---|
-f, -force | 强制删除镜像,即使有容器依赖它 |
-no-prune | 不要清理未带标签的父镜像 |
要删除掉myubuntu:latest镜像:docker rmi myubuntu:latest
当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而巳,并不影响镜像文件。但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。
- 2.使用镜像ID来删除镜像:
当使用docker rmi命令,并且后面跟上镜像的ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
先利用ubuntu:18.04镜像创建一个简单的容器来输出一段话:docker run ubuntu: 18. 04 echo ‘hello! I am here!’
使用docker ps -a命令可以看到本机上存在的所有容器:docker ps -a
试图删除该新建镜像,Docker会提示有容器正在运行,无法删除:docker rmi ubuntu:18.04
如果要想强行删除镜像,可以使用-f参数:docker rmi -f ubuntu:18.04
注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
首先删除容器a:docker rm a
然后使用ID来删除镜像:docker rmi b
- 3.清理镜像:
使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune命令来进行清理。
prune子命令 | 说明 |
---|---|
-a, -all | 删除所有无用镜像,不光是临时镜像 |
-filter filter | 只清理符合给定过滤器的镜像 |
-f, -force | 强制删除镜像,而不进行提示确认 |
自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:docker image prune -f
创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、 基于Dockerfile创建。
- 1.基于已有容器创建:
该方法主要是使用 docker [container] commit命令。
命令格式为:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
首先,启动一个镜像,并在其中进行修改操作。例如:创建一个test文件,之后退出。docker run -it ubuntu:18.04 /bin/bash + touch test + exit
可以使用 docker [container] commit 命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器,docker [container] commit “Added a new file” -a “Docker Newbee” a925cb40b3f0 test:0.1
此时查看本地镜像列表,docker images
- 2.基于本地模板导入:
用户也可以直接从一个操作系统模板文件导入一个镜像。
docker [image] import [OPTIONS] file URL -[REPOSITORY[:TAG]]
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者使用其他已导出的镜像模板来创建。
cat ubuntu-18.04-x86_64-minimal.tar.gz docker import - ubuntu:18.04
- 3.基于Dockerfile创建:
Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
创建镜像的过程可以使用 docker [image] build命令,编译成功后本地将多出一个python:3镜像。
存出和载入镜像
用户可以使用docker [image] save和docker [image] load命令来存出和载入镜像。
- 1.存出镜像
如果要导出镜像到本地文件,可以使用docker [image] save命令。该命令支持-o,-output string参数。
- 2.载入镜像
用户可以使用docker [image] load将导出的tar文件再导入到本地镜像库。支持-i,-input string选项,从指定文件中读入镜像内容。
docker load -i ubuntu_18.04.tar 或者 docker load < ubuntu_18.04.tar
上传镜像
可以使用docker [image] push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登陆)。
命令格式:docker [image] push MAME[:TAG] [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目录下。