1. 获取镜像

官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。

可以使用docker [image] pull命令直接从Docker Hub镜像源来下载镜像。
该命令的格式为docker [image] pull NAME[:TAG]

  • NAME:镜像仓库名称
  • TAG:镜像标签

通常情况下,描述一个镜像需要包括“名称 + 标签”。

对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签。镜像中latest标签意味着该镜像内容会跟踪最新版本的变更而变化,内容是不稳定。因此,为了稳定性最好不要使用默认标签。

案例:获取一个Ubuntu 18.04系统的基础镜像:

  1. ubuntu@VM-0-5-ubuntu:~$ docker pull ubuntu:18.04
  1. 上述代码输出:
  2. 18.04: Pulling from library/ubuntu
  3. 6e0aa5e7af40: Pull complete
  4. d47239a868b3: Pull complete
  5. 49cbb10cca85: Pull complete
  6. Digest: sha256:122f506735a26c0a1aff2363335412cfc4f84de38326356d31ee00c2cbe52171
  7. Status: Downloaded newer image for ubuntu:18.04
  8. docker.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应用

  1. ubuntu@VM-0-5-ubuntu:~$ docker run -it ubuntu:18.04 bash
  2. root@b3cb46bca125:/# echo "Hello World"
  3. Hello World
  4. root@b3cb46bca125:/# exit
  5. exit
  6. ubuntu@VM-0-5-ubuntu:~$

2. 查看镜像

主要介绍Docker镜像的lstaginspect子命令。

2.1 使用images命令列出镜像

使用docker imagesdocker image ls命令可以列出本地主机上已有镜像的基本信息。

  1. ubuntu@VM-0-5-ubuntu:~$ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  4. hello-world latest d1165f221234 6 weeks ago 13.3kB
  5. ubuntu@VM-0-5-ubuntu:~$ docker images
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  8. hello-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命令为本地镜像任意添加新的标签。

  1. ubuntu@VM-0-5-ubuntu:~$ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  4. hello-world latest d1165f221234 6 weeks ago 13.3kB
  5. ubuntu@VM-0-5-ubuntu:~$ docker tag ubuntu:18.04 myubuntu:latest
  6. ubuntu@VM-0-5-ubuntu:~$ docker image ls
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  9. myubuntu latest 3339fde08fc3 3 weeks ago 63.3MB
  10. hello-world latest d1165f221234 6 weeks ago 13.3kB
  11. ubuntu@VM-0-5-ubuntu:~$

可以看到,ubuntu和myubuntu的IMAGE ID是一样的,指向同一个镜像文件,只是别名不同而已。

2.3 使用inspect命令查看详细信息

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

  1. ubuntu@VM-0-5-ubuntu:~$ docker image inspect ubuntu:18.04
  2. [
  3. {
  4. "Id": "sha256:3339fde08fc3ae453e891ba0211cccec19e1f278f5a4599549740c1fd32572ed",
  5. "RepoTags": [
  6. "myubuntu:latest",
  7. "ubuntu:18.04"
  8. ],
  9. "RepoDigests": [
  10. "ubuntu@sha256:122f506735a26c0a1aff2363335412cfc4f84de38326356d31ee00c2cbe52171"
  11. ],
  12. "Parent": "",
  13. "Comment": "",
  14. "Created": "2021-03-25T22:33:02.159055896Z",
  15. "Container": "8b1f5768b55369dfa007ed2fae739363035229116f0ccec68517c46af65488d4",
  16. "ContainerConfig": {
  17. "Hostname": "8b1f5768b553",
  18. "Domainname": "",
  19. "User": "",

上述命令返回一个JSON格式消息。
如果只需要其中一项内容,可以使用-f来指定。
例如,获取镜像的Architecture:

  1. ubuntu@VM-0-5-ubuntu:~$ docker image inspect -f {{".Architecture"}} ubuntu:18.04
  2. amd64

2.4 使用history命令查看镜像历史

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。

例如,查看ubuntu:18.04镜像的创建过程,可以使用如下命令:

  1. buntu@VM-0-5-ubuntu:~$ docker history ubuntu:18.04
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. 3339fde08fc3 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  4. <missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
  5. <missing> 3 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
  6. <missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
  7. <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:e80ae8d359b484dac… 63.3MB

注意,过长的命令被自动截断了,可以使用前面提到的—no-trunc选项来输出完整命令。

3. 搜寻镜像

介绍使用docker search命令可以搜索Docker Hub官方仓库中的镜像。

  1. docker search [option] keyword

支持的命令选项主要包括:

  • -f, —filter filter:过滤输出内容;
  • —format string:格式化输出内容;
  • —limit int:限制输出结果个数,默认为25个;
  • —no-trunc:不截断输出结果。

搜索官方提供的带nginx关键字的镜像:

  1. ubuntu@VM-0-5-ubuntu:~$ docker search --filter is-official=true nginx
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. nginx Official build of Nginx. 14736 [OK]

搜索收藏数超过4的TensorFlow镜像:

  1. ubuntu@VM-0-5-ubuntu:~$ docker search -f=stars=4 tensorflow
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. tensorflow/tensorflow Official Docker images for the machine learn 1886
  4. jupyter/tensorflow-notebook Jupyter Notebook Scientific Python Stack w/ 264
  5. tensorflow/serving Official images for TensorFlow Serving (http 107
  6. rocm/tensorflow Tensorflow with ROCm backend support 62
  7. xblaster/tensorflow-jupyter Dockerized Jupyter with tensorflow 56 [OK]
  8. floydhub/tensorflow tensorflow 28 [OK]
  9. bitnami/tensorflow-serving Bitnami Docker Image for TensorFlow Serving 14 [OK]
  10. opensciencegrid/tensorflow-gpu TensorFlow GPU set up for OSG 12
  11. emacski/tensorflow-serving Project images from https://github.com/emacs… 9
  12. ibmcom/tensorflow-ppc64le Community supported ppc64le docker images fo 5
  13. tokunagaken/tensorflow-keras-jupyter-py3 TensorFlow-gpu 1.13.1 Keras 2.2.4 python 3.5 5
  14. tensorflow/tf_grpc_test_server Testing server for GRPC-based distributed ru 4

4. 删除和清理镜像

介绍Docker镜像的rmprune子命令。

4.1 使用标签输出镜像

使用docker rmi或docker image rm命令可以删除镜像,命令格式为docker rmiIMAGE [IMAGE...],其中IMAGE可以为标签或ID。
支持选项包括:

  • -f, -force:强制删除镜像,即使有容器依赖它;
  • -no-prune:不要清理未带标签的父镜像。

例,删除myubuntu:latest镜像,使用如下命令:

  1. ubuntu@VM-0-5-ubuntu:~$ docker rmi myubuntu:latest
  2. Untagged: 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的commitimportbuild子命令。

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

演示如何创建一个新镜像

  1. 启动一个镜像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
  1. 容器ID50bc41da0fad
  2. 2. 使用`docker [container] commit`命令来提交一个新的镜像。提交时可以使用ID或名称来指定容器
  3. ```shell
  4. ubuntu@VM-0-5-ubuntu:~$ docker container commit -m "Add a new file" -a "Docker Newbee" 50bc41da0fad
  5. sha256:d350491520dcaba29a2bb09e2caeb6ec73b9988f337a6b6d86a913fc65ef1a5e
  6. ubuntu@VM-0-5-ubuntu:~$ docker images
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. <none> <none> d350491520dc 7 seconds ago 63.3MB
  9. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  10. hello-world latest d1165f221234 6 weeks ago 13.3kB
  11. ubuntu@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
image.png

5.3 基于Dockerfile创建

基于Dockerfile创建是最常见的方式。Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

示例:基于debian:stretch-slim镜像安装python3环境,构成一个新的python:3镜像:

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ vim Dockerfile
  2. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ cat Dockerfile
  3. FROM debian:stretch-slim
  4. LABEL version="1.0" maintainer="docker user <docker_user@github>"
  5. RUN apt-get update && \
  6. apt-get install -y python3 && \
  7. apt-get clean && \
  8. rm -rf /var/lib/apt/lists/*

创建镜像的过程可以使用docker image build命令,编译成功后本地将多出一个python:3镜像:

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker image build -t python:3 .
  2. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker image ls
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. python 3 69c47fbba5e1 44 seconds ago 95.2MB
  5. <none> <none> d350491520dc 16 minutes ago 63.3MB
  6. debian stretch-slim 2b41160badb6 9 days ago 55.3MB
  7. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  8. hello-world latest d1165f221234 6 weeks ago 13.3kB
  9. ubuntu@VM-0-5-ubuntu:~/Dockerfile$

6. 存储和载入镜像

Docker镜像的save和load子命令。
用户可以使用docker image savedocker image load命令来存储和载入镜像。

6.1 存储镜像

如果要导出镜像到本地文件,可以使用docker image save命令。该命令支持-o、-output string参数,导出镜像到指定的文件中。

例:导出本地的Ubuntu:18.04镜像为文件ubuntu:18.04.tar:

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. python 3 69c47fbba5e1 5 minutes ago 95.2MB
  4. <none> <none> d350491520dc 21 minutes ago 63.3MB
  5. debian stretch-slim 2b41160badb6 9 days ago 55.3MB
  6. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  7. hello-world latest d1165f221234 6 weeks ago 13.3kB
  8. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker save -o ubuntu_18.04.tar ubuntu:18.04
  9. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ ls
  10. Dockerfile ubuntu_18.04.tar
  11. ubuntu@VM-0-5-ubuntu:~/Dockerfile$

6.2 载入镜像

可以使用docker image load将导出的tar文件再导入到本地镜像库。支持-i、-input string选项,从指定文件中读入镜像内容。

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker load -i ubuntu_18.04.tar
  2. Loaded 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网站注册后可以上传自制的镜像。

image.png