Docker 镜像详解

镜像是Docker三大核心概念中最为重要的。Docker运行容器前需要本地存在对应的镜像,如果镜像不

存在,Docker会从Docker Hub中下载,当然用户也可以配置自定义的镜像仓库

关键问题

  • 使用pull命令从Docker Hub中下载镜像到本地
  • 查看本地已有的镜像信息、管理镜像标签
  • 使用search命令在远端仓库进行搜索和过滤
  • 删除镜像标签和镜像文件
  • 创建用户定制的镜像并保存为外部文件
  • 向Docker Hub仓库中推送自己的镜像s

一、获取镜像

docker [image] pull NAME[:TAG]      #直接从Docker Hub镜像源来下载镜像

其中 [] 中的内容为可选项,NAME为镜像仓库名称(用来区分镜像),TAG为镜像的标签,一般用来

表示版本信息,描述一个镜像需要“名称+标签”;如果不显式地指定TAG,则默认会选择latest标签,会下

载仓库中的最新镜像。不过,镜像的仓库名称中还应该添加仓库地址(即注册服务器)作为前缀,默认情

况下使用官方的Docker Hub服务(前缀可以忽略的),如果从非官方的仓库下载,则必须指定完整的仓库

地址

从下载镜像的过程中,可以看到镜像文件一般是由若干层组成的,Docker下载中会获取并输出镜像

的各层信息,每一层都有一个简写的唯一id。当不同的镜像包括相同的层时,本地仅存储了层的一份内

容,这样可以减少存储空间

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete 
c63719cdbe7a: Pull complete 
19a861ea6baf: Pull complete 
651c9d2d6c4f: Pull complete 
Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

由于Docker Hub是位于国外的网站,在未科学上网的情况下载速度较慢,所以可以使用镜像代理服务

来加速Docker镜像的获取过程。目前阿里云是为个人提供免费的容器镜像服务,按照命令配置即可

1UDPcF.png

二、查看镜像信息

1.dockers image ls

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

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2073e0bcb60e        23 hours ago        127MB
mysql               latest              791b6e40940c        37 hours ago        465MB
ubuntu              latest              ccc6e87d482b        2 weeks ago         64.2MB
#常用的可选参数为
-a : 列出所有镜像文件
-q : 仅输出ID信息
--no--trunc=true|false : 对输出结果中太长的部分截断
-f : 过滤列出的镜像

在列出的信息中分别是仓库名称、镜像标签、镜像ID、创建时间和镜像大小。其中镜像的id十分重要

,它唯一标识了镜像,在使用镜像的过程中,一般可用该id的前若干个字符组成的可区分串来替代完整的

ID;镜像大小实际上只是逻辑体积大小,由于相同的镜像层本地只会存储一份,物理上占用的存储空间会

小于逻辑体积之和

2.tag更改标签

docker tag命令可以为本地镜像任意地添加新的标签,就像建立了一个快捷方式

[root@CSUYZZ-Docker /]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              791b6e40940c        37 hours ago        465MB
tomcat              latest              d191f894a2c7        11 days ago         507MB
[root@CSUYZZ-Docker /]# docker tag mysql:latest mysql:5.7
[root@CSUYZZ-Docker /]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 791b6e40940c        37 hours ago        465MB
mysql               latest              791b6e40940c        37 hours ago        465MB
tomcat              latest              d191f894a2c7        11 days ago         507MB

可以看到mysql:5.7 和 mysql:latest 的镜像ID是相同的,之后便可以使用mysql:5.7替代原来的镜像了

3.使用inspect命令查看详细信息

docker inspect NAME 命令可以获取镜像的详细信息,返回信息是一个JSON格式的数据,其中包括

制作者、适应架构等。当只需要其中某项信息时,通过 -f 来指定过滤的条件

docker inspect -f {{".Architecture"}} mysql:latest
amd64

4.history 命令查看镜像创建信息

docker history NAME命令将列出各层的创建信息

三、搜索镜像

docker search [option] keyword 可以搜索Dokcer Hub官方仓库中的镜像

示例: 搜索官方提供的带有mysql关键字的镜像,返回信息包括镜像名称、描述、收藏数等

docker search --filter=is-official=true mysql
NAME                DESCRIPTION                                  STARS              OFFICIAL   
mysql               MySQL is a widely used, open-source relation…   9081                [OK]
mariadb             MariaDB is a community-developed fork of MyS…   3212                [OK]
#常用可选参数
-f : 过滤输出内容
--format string : 格式化输出内容
--limit int:限制输出个数,默认为25个

四、删除和清理镜像

dokcer rmi IMAGE命令用来删除镜像,其中IMAGE可以为标签或者ID

# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 791b6e40940c        38 hours ago        465MB
mysql               latest              791b6e40940c        38 hours ago        465MB
tomcat              latest              d191f894a2c7        11 days ago         507MB
# docker rmi mysql:5.7
Untagged: mysql:5.7
# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              791b6e40940c        38 hours ago        465MB
tomcat              latest              d191f894a2c7        11 days ago         507MB
#常用命令参数
-f : 强制删除镜像,即使有容器依赖它,不推荐使用,应该先删除依赖镜像的容器再来删除镜像
-no-prune: 不要清理未带标签的父镜像

当一个镜像拥有多个标签时,docker rmi 命令只是删除了该镜像中的标签中的指定标签而已,并不影

响镜像文件,当镜像只剩下一个标签时便会删除这个镜像所有的文件层

当使用镜像ID删除命令时,会先删除所有指向镜像的标签再删除镜像文件本身;当有该镜像创建的容

器存在时,镜像文件默认是无法被删除的

此外,在使用Docker一段时间之后,系统可能会残留有临时的镜像文件和一些没有使用过的镜像,可

以通过docker image prune命令来进行清理

五、创建镜像

创建镜像的方法主要有三种,基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建,三

种创建方法也对应着三种待学习的命令commit、import、build

1.基于已有容器创建

docker [container] commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]] 为基于已有容器创建对

象的命令格式

[root@CSUYZZ-Docker /]# docker run -it ubuntu:18.04 /bin/bash   #创建容器并启动
root@69edc769ef68:/# ls                                     #root@后为容器的ID
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@69edc769ef68:/# touch test                        #创建一个文件并保存
root@69edc769ef68:/# ls                                
bin   dev  home  lib64  mnt  proc  run   srv  test  usr
boot  etc  lib   media  opt  root  sbin  sys  tmp   var
root@69edc769ef68:/# exit                              #退出容器
exit
#提交为一个新的镜像,使用ID指定容器
[root@CSUYZZ-Docker /]# docker commit -m "Add a new File" -a "CSUYZZ" 69edc769ef68 test:0.1    sha256:acb35d7730e7f88a494c6f5c6fcb5c62992702011e8c11247305b244d45b99db  #返回创建容器的ID信息
[root@CSUYZZ-Docker /]# docker image ls    #重新查看镜像,该镜像已经存在
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test                0.1                 acb35d7730e7        About a minute ago   64.2MB
mysql               latest              791b6e40940c        41 hours ago         465MB
tomcat              latest              d191f894a2c7        11 days ago          507MB
ubuntu              18.04               ccc6e87d482b        2 weeks ago          64.2MB
#常用的命令参数为
-a : 作者信息
-m : 提交消息
-p : 提交时暂停容器运行
-c : 提交的时候执行Dockerfile命令,关于Dockerfile后面会有详细介绍

2.基于本地模板导入

用户也可直接从一个操作系统模板文件导入一个镜像,使用docker import命令

3.基于Dockerfile创建

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

新镜像的过程。使用的命令为docker [image] build,关于Dockerfile后面的文章会有详细的介绍

六、保存和加载镜像

docker save命令可以将镜像保存为 .tar格式的文件存放在本地,之后用户可以复制.tar文件并分享给他人;

docker load 命令可以将.tar格式的文件重新加载成原来的镜像

#在一台上进行保存为.tar文件     
[root@CSUYZZ-Docker /]# docker save -o ubuntu_18.04.tar ubuntu:18.04
[root@CSUYZZ-Docker /]# ls
bin   dev  home  lib64  mnt  opt   root  sbin  sys  ubuntu_18.04.tar  var
boot  etc  lib   media  my   proc  run   srv   tmp  usr
#使用参数: -o 即-output string参数,保存镜像到指定文件中

#在另外一台主机上进行加载
root@Ubuntu:/home# ls
csuyzz  ubuntu_18.04.tar
root@Ubuntu:/home# docker load -i ubuntu_18.04.tar
#使用参数:-i 即-input string参数,从指定文件中加载镜像
43c67172d1d1: Loading layer [==================================================>]  65.57MB/65.57MB
21ec61b65b20: Loading layer [==================================================>]  991.2kB/991.2kB
1d0dfb259f6a: Loading layer [==================================================>]  15.87kB/15.87kB
f55aa0bd26b8: Loading layer [==================================================>]  3.072kB/3.072kB
Loaded image: ubuntu:18.04
root@Ubuntu:/home# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               ccc6e87d482b        2 weeks ago         64.2MB

七、上传镜像

docker push命令可将镜像上传到仓库,默认上传到官方仓库

[root@CSUYZZ-Docker home]# docker login    #首次上传需要输入用户名和密码进行登录
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: csuyzz    
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@CSUYZZ-Docker home]# docker push csuyzz/ubuntu:18.04
The push refers to repository [docker.io/csuyzz/ubuntu]
f55aa0bd26b8: Mounted from library/ubuntu
1d0dfb259f6a: Mounted from library/ubuntu
21ec61b65b20: Mounted from library/ubuntu
43c67172d1d1: Mounted from library/ubuntu
18.04: digest: sha256:bc025862c3e8ec4a8754ea4756e33da6c41cba38330d7e324abd25c8e0b93300 size: 1152

上传成功后从Docker Hub的界面即可看到我们上传的仓库

10aLWV.png