Docker 镜像详解
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镜像的获取过程。目前阿里云是为个人提供免费的容器镜像服务,按照命令配置即可

二、查看镜像信息
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的界面即可看到我们上传的仓库
