1. 获取镜像
官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
可以使用docker [image] pull命令直接从Docker Hub镜像源来下载镜像。
该命令的格式为docker [image] pull NAME[:TAG]。
- NAME:镜像仓库名称
- TAG:镜像标签
通常情况下,描述一个镜像需要包括“名称 + 标签”。
对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签。镜像中latest标签意味着该镜像内容会跟踪最新版本的变更而变化,内容是不稳定。因此,为了稳定性最好不要使用默认标签。
案例:获取一个Ubuntu 18.04系统的基础镜像:
ubuntu@VM-0-5-ubuntu:~$ docker pull ubuntu:18.04
上述代码输出:18.04: Pulling from library/ubuntu6e0aa5e7af40: Pull completed47239a868b3: Pull complete49cbb10cca85: Pull completeDigest: sha256:122f506735a26c0a1aff2363335412cfc4f84de38326356d31ee00c2cbe52171Status: Downloaded newer image for ubuntu:18.04docker.io/library/ubuntu:18.04
分析下载过程:
镜像文件是由若干层(layer)组成的。
其中,6e0aa5e7af40这样的串是层的唯一id(完整的id是64个十六进制字符组成)。
严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,只是默认使用的是官方Docker Hub服务,该前缀可以忽略。
例如,docker pull ubuntu:18.04命令相当于docker pullregistry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器DockerHub Registry中的ubuntu仓库来下载标记为18.04的镜像。
pull子命令支持的选项主要包括:
- -a, —all-tags=true|false:是否获取仓库中的所有镜像,默认为否;
- —disable-content-trust:取消镜像的内容校验,默认为真。
利用该镜像创建一个容器,在其中运行bash应用
ubuntu@VM-0-5-ubuntu:~$ docker run -it ubuntu:18.04 bashroot@b3cb46bca125:/# echo "Hello World"Hello Worldroot@b3cb46bca125:/# exitexitubuntu@VM-0-5-ubuntu:~$
2. 查看镜像
主要介绍Docker镜像的ls、tag和inspect子命令。
2.1 使用images命令列出镜像
使用docker images或docker image ls命令可以列出本地主机上已有镜像的基本信息。
ubuntu@VM-0-5-ubuntu:~$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kB
- REPOSITORY:来自于哪个仓库
- TAG:镜像的标签信息
- IMAGE ID:唯一标识镜像
- CREATE:创建时间
- SIZE:镜像大小
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信息,默认为否。
其中,还支持对输出结果进行控制的选项,如-f. —filter=[]、—no-trunc=true|false、-q、—quiet=true|false等。更多子命令选项还可以通过man docker-images来查看。
2.2 使用tag命令添加镜像标签
为了方便后续工作使用特定镜像,可以使用docker tag命令为本地镜像任意添加新的标签。
ubuntu@VM-0-5-ubuntu:~$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~$ docker tag ubuntu:18.04 myubuntu:latestubuntu@VM-0-5-ubuntu:~$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBmyubuntu latest 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~$
可以看到,ubuntu和myubuntu的IMAGE ID是一样的,指向同一个镜像文件,只是别名不同而已。
2.3 使用inspect命令查看详细信息
使用docker image inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
ubuntu@VM-0-5-ubuntu:~$ docker image inspect ubuntu:18.04[{"Id": "sha256:3339fde08fc3ae453e891ba0211cccec19e1f278f5a4599549740c1fd32572ed","RepoTags": ["myubuntu:latest","ubuntu:18.04"],"RepoDigests": ["ubuntu@sha256:122f506735a26c0a1aff2363335412cfc4f84de38326356d31ee00c2cbe52171"],"Parent": "","Comment": "","Created": "2021-03-25T22:33:02.159055896Z","Container": "8b1f5768b55369dfa007ed2fae739363035229116f0ccec68517c46af65488d4","ContainerConfig": {"Hostname": "8b1f5768b553","Domainname": "","User": "",
上述命令返回一个JSON格式消息。
如果只需要其中一项内容,可以使用-f来指定。
例如,获取镜像的Architecture:
ubuntu@VM-0-5-ubuntu:~$ docker image inspect -f {{".Architecture"}} ubuntu:18.04amd64
2.4 使用history命令查看镜像历史
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
例如,查看ubuntu:18.04镜像的创建过程,可以使用如下命令:
buntu@VM-0-5-ubuntu:~$ docker history ubuntu:18.04IMAGE CREATED CREATED BY SIZE COMMENT3339fde08fc3 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B<missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B<missing> 3 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B<missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:e80ae8d359b484dac… 63.3MB
注意,过长的命令被自动截断了,可以使用前面提到的—no-trunc选项来输出完整命令。
3. 搜寻镜像
介绍使用docker search命令可以搜索Docker Hub官方仓库中的镜像。
docker search [option] keyword
支持的命令选项主要包括:
- -f, —filter filter:过滤输出内容;
- —format string:格式化输出内容;
- —limit int:限制输出结果个数,默认为25个;
- —no-trunc:不截断输出结果。
搜索官方提供的带nginx关键字的镜像:
ubuntu@VM-0-5-ubuntu:~$ docker search --filter is-official=true nginxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDnginx Official build of Nginx. 14736 [OK]
搜索收藏数超过4的TensorFlow镜像:
ubuntu@VM-0-5-ubuntu:~$ docker search -f=stars=4 tensorflowNAME DESCRIPTION STARS OFFICIAL AUTOMATEDtensorflow/tensorflow Official Docker images for the machine learn… 1886jupyter/tensorflow-notebook Jupyter Notebook Scientific Python Stack w/ … 264tensorflow/serving Official images for TensorFlow Serving (http… 107rocm/tensorflow Tensorflow with ROCm backend support 62xblaster/tensorflow-jupyter Dockerized Jupyter with tensorflow 56 [OK]floydhub/tensorflow tensorflow 28 [OK]bitnami/tensorflow-serving Bitnami Docker Image for TensorFlow Serving 14 [OK]opensciencegrid/tensorflow-gpu TensorFlow GPU set up for OSG 12emacski/tensorflow-serving Project images from https://github.com/emacs… 9ibmcom/tensorflow-ppc64le Community supported ppc64le docker images fo… 5tokunagaken/tensorflow-keras-jupyter-py3 TensorFlow-gpu 1.13.1 Keras 2.2.4 python 3.5… 5tensorflow/tf_grpc_test_server Testing server for GRPC-based distributed ru… 4
4. 删除和清理镜像
4.1 使用标签输出镜像
使用docker rmi或docker image rm命令可以删除镜像,命令格式为docker rmiIMAGE [IMAGE...],其中IMAGE可以为标签或ID。
支持选项包括:
- -f, -force:强制删除镜像,即使有容器依赖它;
- -no-prune:不要清理未带标签的父镜像。
例,删除myubuntu:latest镜像,使用如下命令:
ubuntu@VM-0-5-ubuntu:~$ docker rmi myubuntu:latestUntagged: myubuntu:latest
本地的ubuntu:latest镜像是否会受到此命令的影响。无须担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像0458a4468cbc的一个标签副本而已。
但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。
例如通过执行docker rmi命令来删除只有一个标签的镜像,可以看出会删除这个镜像文件的所有文件层。
4.2 使用镜像ID来删除镜像
当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
- 使用
docker ps -a命令可以看到本机上存在的所有容器 docker rm容器ID,删除容器
4.3 清理镜像
使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune命令来进行清理。
支持选项包括:
- -a, -all:删除所有无用镜像,不光是临时镜像;
- -filter filter:只清理符合给定过滤器的镜像;
- -f, -force:强制删除镜像,而不进行提示确认。
5. 创建镜像
创建镜像的三种方法:
- 基于已有镜像的容器创建
- 基于本地模板导入
- 基于Dockerfile创建
本节主要介绍Docker的commit、import和build子命令。
5.1 基于已有容器创建
docker [container] commit命令。
命令格式为docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:
- -a,—author=””:作者信息;
- -c, —change=[]:提交的时候执行Dockfile指令,包括CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR 等;
- -m, —message=””:提交消息;
- -p, —pause=true:提交时暂停容器运行。
演示如何创建一个新镜像
- 启动一个镜像Ubuntu:18.04,创建一个test文件,然后退出 ```shell ubuntu@VM-0-5-ubuntu:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ubuntu@VM-0-5-ubuntu:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB hello-world latest d1165f221234 6 weeks ago 13.3kB ubuntu@VM-0-5-ubuntu:~$ docker run -it ubuntu:18.04 /bin/bash root@50bc41da0fad:/# torch test bash: torch: command not found root@50bc41da0fad:/# touch test root@50bc41da0fad:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var root@50bc41da0fad:/# exit exit
容器ID:50bc41da0fad2. 使用`docker [container] commit`命令来提交一个新的镜像。提交时可以使用ID或名称来指定容器```shellubuntu@VM-0-5-ubuntu:~$ docker container commit -m "Add a new file" -a "Docker Newbee" 50bc41da0fadsha256:d350491520dcaba29a2bb09e2caeb6ec73b9988f337a6b6d86a913fc65ef1a5eubuntu@VM-0-5-ubuntu:~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE<none> <none> d350491520dc 7 seconds ago 63.3MBubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~$
可以看到新创建的镜像已经存在。
5.2 基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker[container] import命令。命令格式为docker [image] import [OPTIONS]file|URL|-[REPOSITORY [:TAG]]
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为http://openvz.org/Download/templates/precreated。
5.3 基于Dockerfile创建
基于Dockerfile创建是最常见的方式。Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
示例:基于debian:stretch-slim镜像安装python3环境,构成一个新的python:3镜像:
ubuntu@VM-0-5-ubuntu:~/Dockerfile$ vim Dockerfileubuntu@VM-0-5-ubuntu:~/Dockerfile$ cat DockerfileFROM debian:stretch-slimLABEL 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/lists/*
创建镜像的过程可以使用docker image build命令,编译成功后本地将多出一个python:3镜像:
ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker image build -t python:3 .ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEpython 3 69c47fbba5e1 44 seconds ago 95.2MB<none> <none> d350491520dc 16 minutes ago 63.3MBdebian stretch-slim 2b41160badb6 9 days ago 55.3MBubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~/Dockerfile$
6. 存储和载入镜像
Docker镜像的save和load子命令。
用户可以使用docker image save和docker image load命令来存储和载入镜像。
6.1 存储镜像
如果要导出镜像到本地文件,可以使用docker image save命令。该命令支持-o、-output string参数,导出镜像到指定的文件中。
例:导出本地的Ubuntu:18.04镜像为文件ubuntu:18.04.tar:
ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpython 3 69c47fbba5e1 5 minutes ago 95.2MB<none> <none> d350491520dc 21 minutes ago 63.3MBdebian stretch-slim 2b41160badb6 9 days ago 55.3MBubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MBhello-world latest d1165f221234 6 weeks ago 13.3kBubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker save -o ubuntu_18.04.tar ubuntu:18.04ubuntu@VM-0-5-ubuntu:~/Dockerfile$ lsDockerfile ubuntu_18.04.tarubuntu@VM-0-5-ubuntu:~/Dockerfile$
6.2 载入镜像
可以使用docker image load将导出的tar文件再导入到本地镜像库。支持-i、-input string选项,从指定文件中读入镜像内容。
ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker load -i ubuntu_18.04.tarLoaded image: ubuntu:18.04
7. 上传镜像
本节主要介绍Docker镜像的push子命令。
可以使用docker [image] push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。命令格式为docker image push NAME[:TAG] |[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]。
用户在Docker Hub网站注册后可以上传自制的镜像。

