获取镜像
可以使用 docker [image] pull 命令直接从 Docker Hub 镜像源来下载镜像。 该 命 令的格式为 docker [image] pull NAME [:TAG] 。
其中,NAME是镜像仓库名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括"名称+标签"信息。
一例
获取Ubuntu18.04系统的基础镜像
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04`
对于Docker镜像来说,如果不显示指定TAG,则默认选择latest标签
Digest为一个唯一的id,256个比特,64个十六进制字符组成。
镜像的仓库中应该有添加仓库的地址作为前缀,只是使用默认的DockerHub服务可以忽略前缀。
如例如docker pull ubuntu:18.04命令相当千docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器DocekrHub Registry中的 ubuntu 仓库来下载标记为18.04的镜像。
如果从非官方的仓库下载,需要指定全完整的厂库地址。如从网易蜂巢下载镜像
docker pull hub.c.163.com/public/ubuntu:18.04
pull子命令支持的选项主要包括
- -a,-all-tag=true|false:是否获取远程仓库中的所有镜像,默认为否
- --disable-content-trust:取消镜像的内容校验,more为真
另外,我们可以使用镜像代理服务来加速Docker镜像获取过程,可以在Docker服务启动配置中增加 registy-mirror=proxy_url
来指定镜像代理服务
镜像下载到本地之后,即可以使用该镜像了,例如创建一个容器并运行bash应用,执行打印Hello World的命令:
# hukai @ hukaideMacBook-Pro in ~ [22:12:02]
$ docker run -it ubuntu:18.04 bash
root@c8aa5f15bb6b:/# echo 'Hello World!'
Hello World!
root@c8aa5f15bb6b:/# exit
exit
查看镜像信息
使用images命令列出镜像
docker images / docker images ls
命令可以列出本地主机上已有的镜像的基本信息。
例如
hukai @ hukaideMacBook-Pro in ~ [22:31:53]
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 72300a873c2c 4 days ago 64.2MB
mysql 5.7 d5cea958d330 5 days ago 440MB
nginx latest 2073e0bcb60e 3 weeks ago 127MB
openresty/openresty latest 3c9e8cc37fa4 4 weeks ago 84.8MB
- REPOSITORY 来自于哪个仓库
- TAG 表示镜像的版本
- IMAGE ID 唯一镜像标识 如果两个镜像相同,说明他实际上指向了同一个镜像,只是标签名称略有不同
- CREATED 镜像最后的修改时间
- SIZE 镜像的大小
images子命令主要支出以下选项
- -a,--all=true|false:列出所有(包括临时文件)镜像文件,默认为否
- --digests=true|false:列出镜像的数字摘要,默认为否
- -f, --filter=[]:过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
- --formate="TEMPLATE":控制输出格式,如ID代表ID信息,Repository代表仓库信息等
- --no-trunc=true|false:对输出结果中太长的部分是否进行截断,如镜像信息
- -q --quite=true|false:仅输出ID信息,默认为否
其中, 还支持对输出结果进行控制的选项,如 -f,--filter=[]、--no-trunc=true |false、-q、--quiet=true|false等。
更多子命令选项还可以通过mandocker-images来查看。
使用tag命令添加镜像标签
为了方便在后续的工作中使用特定的镜像,还可以使用docker tag命令为本地镜像添加新的标签,如给ubuntu添加
docker tag ubuntu:18.04 myubuntu:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu latest 72300a873c2c 4 days ago 64.2MB
ubuntu 18.04 72300a873c2c 4 days ago 64.2MB
mysql 5.7 d5cea958d330 5 days ago 440MB
nginx latest 2073e0bcb60e 3 weeks ago 127MB
openresty/openresty latest 3c9e8cc37fa4 4 weeks ago 84.8MB
可见增加了一个镜像标签,IMAGEID还是一致的,所以docker tag起到了类似链接的作用
使用inspect命令来查询详细信息
使用 docker inspect [image] ubuntu:18.04
当只要使用其中的一项的时候
docker inspect -f {{".Architecture"}} ubuntu:18.04
使用history命令来查看历史镜像
镜像文件由很多成构成,如何知道各个层的内容具体是什么呢?这个时候可以使用history子命令
如docker history ubuntu:18.04
搜寻镜像
使用docker search可以搜索Docker Hub官方仓库中的镜像。语法为docker search [option] keyword
。支持的命令有
- -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 rmi
或者docker image rm
命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...]
其中IMAGE可以为标签或者ID
支持的选项包括
- -f,-force:强制删除镜像,即使有容器依赖它;
- -no-prune:不要清理未带父标签的镜像。
如,要删除myubuntu:latest 镜像可以使用如下命令
docker rmi myubuntu:latest
此时只删除掉了一个TAG副本,原来的ubuntu:18.04镜像还在。当然,如果删掉一个没有副本的image,整个镜像将会被全部删除。
使用镜像ID来删除镜像
当使用docker rmi
命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会尝试先删除所有指向该镜像的标签,然后删除镜像本身
注意,当该进行创建的容器存在的时候,镜像文件默认是无法被删除的。如先使用ubuntu:18.04镜像创建一个简单的容器并输出一段话:
docker run ubuntu:18.04 echo 'hello docker!'
使用docker ps -a
可以看到本机存在的所有容器
可以看到,后台存在一个退出状态的容器,是基于ubuntu镜像创建的,如果试图删除该镜像,Docker会提示有容器正在运行,无法删除。如果需要删除的话需要加上-f
参数。但是通常不建议使用该方式。正确的做法是,先删除依赖该镜像的所有容器,然后再来删除镜像。
首先删除容器docker rm [CONTAINER ID]
,删除完之后使用docker rmi IMAGEID
删除镜像。
清理镜像
使用Docker一段时间之后,系统会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以使用docker image prune命令来处理
支持选项包括:
- -a,-all:删除所有无用的镜像,不光是临时镜像
- -filter filter:只清理符合给定过滤器的镜像;
- -f,-force:强制删除镜像,而不进行提示确认。
例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放空间:
docker image prune -f
创建镜像
创建镜像主要有3种方式:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建
基于已有容器创建
该方法主要是使用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文件,之后推出。
# hukai @ hukaideMacBook-Pro in ~ [10:21:35]
$ docker run -it ubuntu:latest /bin/bash
root@15b1129203d6:/# touch test
root@15b1129203d6:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
root@15b1129203d6:/# exit
exit
如下创建一个新的镜像
# hukai @ hukaideMacBook-Pro in ~ [10:22:31]
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15b1129203d6 ubuntu:latest "/bin/bash" About a minute ago Exited (0) 46 seconds ago hungry_brattain
c4a53b2a7970 nginx "nginx -g 'daemon of…" 5 days ago Exited (0) 5 days ago webserver
# hukai @ hukaideMacBook-Pro in ~ [10:23:17]
$ docker commit -m 'Add a new file' -a 'hukai' 15b11 ubuntubash:0.1
sha256:925cf7380c958dc5b9d709f37d3b290d455da7818562fb98af9e348888370e51
# hukai @ hukaideMacBook-Pro in ~ [10:26:46]
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntubash 0.1 925cf7380c95 8 seconds ago 64.2MB
ubuntu latest 72300a873c2c 5 days ago 64.2MB
mysql 5.7 d5cea958d330 5 days ago 440MB
nginx latest 2073e0bcb60e 3 weeks ago 127MB
# hukai @ hukaideMacBook-Pro in ~ [10:26:54]
基于Dockerfile创建
基于Dockerfile创建是最常见的方式,Dockefile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面给出一个Dockerfile的简单示例,基于debian:stretch-slim镜像安装Python3环境的镜像
FROM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@github>"
RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/list/*
使用docker build -f xxxx来创建
存出和载入镜像
存出镜像
如果需要将镜像导出到本地的话可以使用docker [image] save
命令。该命令支持-o、-output string参数,导出镜像到指定的文件中
如导出nginx镜像到本地
# hukai @ hukaideMacBook-Pro in ~ [11:03:23]
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 72300a873c2c 5 days ago 64.2MB
mysql 5.7 d5cea958d330 6 days ago 440MB
nginx latest 2073e0bcb60e 3 weeks ago 127MB
# hukai @ hukaideMacBook-Pro in ~ [11:03:32]
$ docker save -o nginx_back.tar nginx:latest
载入镜像
使用docker [image] load
将导出的文件再导入到本地镜像库中,支持-i、-input string选项,从指定文件中读入镜像内容
# hukai @ hukaideMacBook-Pro in ~ [11:06:28]
$ docker load -i nginx_back.tar
Loaded image: nginx:latest
上传镜像
用户可以使用docker push
命令上传到镜像库中,默认上传到Docker Hub官方仓库中
一例
# hukai @ hukaideMacBook-Pro in ~ [11:22:20] C:1
$ docker tag nginx:latest iceco1a/mytest:v0.1
# hukai @ hukaideMacBook-Pro in ~ [11:22:44]
$ docker push iceco1a/mytest:v0.1
The push refers to repository [docker.io/iceco1a/mytest]
22439467ad99: Pushed
b4a29beac87c: Pushed
488dfecc21b1: Pushed
v0.1: digest: sha256:62f787b94e5faddb79f96c84ac0877aaf28fb325bfc3601b9c0934d4c107ba94 size: 948