Docker学习之镜像

Docker运行容器需要本地存在相应的镜像,如果镜像不存在,则Docker默认会从公共注册服务器Docker Hub中的仓库去下载相应的镜像,用户可以通过修改配置,使用自定义的镜像仓库。

1.获取镜像

使用docker pull 命令从网络上下载镜像,命令格式为:docker pull NAME[:TAG],对于Docker镜像,如果不显示指定TAG,则默认会选择latest标签下载仓库中最新版本的镜像。

如图片所示,镜像文件一般由若干层组成,冒号前面的字符串代表了每一层的ID。下载过程之中会获取并输出各个层的信息。层(Layer)其实是AUFS(Advanted Union File System)联合文件系统,是实现增量保存和更新的基础。
如果要下载某个版本的镜像,则:docker pull ubuntu:14.04
默认是从公共注册服务器的仓库中去下载指定tag的镜像,这个命令的完整命令:
docker pull registry.hub.docker.com/ubuntu:latest
用户也可以指定从其他的注册服务器仓库中去下载:
docker pull dl.dockerpool.com:5000/ubuntu:latest
镜像下载完成之后,即可以使用
docker run -i -t ubuntu /bin/bash
如上命令即利用镜像ubuntu创建了一个容器,并在其中运行bash应用。

2.查看镜像信息

使用docker images 命令列出当前主机上所有的镜像

列表中的字段含义

- REPOSITORY:来自于哪个仓库
- TAG:镜像版本
- IMAGE ID:镜像ID(镜像ID唯一标识了镜像,TAG标记了镜像在同一个仓库的不同版本)
- CREATED:创建时间
- VIRTUAL SIZE:镜像大小

docker tag命令为本地镜像添加一个tag

可以看到本地的镜像列表中多了一个刚刚打的tag为tag_test的镜像,但是它与latest的IMAGE ID是完全一致的,也就是说他们其实都指向的同一个镜像文件,只是别名不同而已。
使用docker inspect命令可以获取镜像的详细信息
如:docker inspect c917d6497f55

在指定镜像ID的时候,还可以使用镜像ID字符串的前几个可区分镜像的字符串来代替,而不需要将整个完整大镜像ID放在这里。

3.搜寻镜像

使用docker search命令来查询远端注册服务器的镜像,如:docker search mysql

docker search默认从官方仓库中去搜索镜像,如上图所示为执行docker search mysql命令,搜寻到的详细信息。从字段看出,搜索结果中包含了镜像的名称、描述、星级、是否官方创建、是否自动创建等信息,默认输出结果按照星级评价进行排序。

官方镜像说明是官方项目创建和维护的,automated资源则允许用户验证镜像的来源和内容。

4.删除镜像

docker rmi IMAGE [IMAGE…],其中IMAGE可以为镜像标签或者镜像ID,
如果一个镜像有过个TAG, 那么通过 docker rmi imagename:tagname的方式进行删除时,只是删除了该镜像的一个标签而已,而实际的镜像文件并没有被删除,但是如果使用docker rmi imageid的方式,则直接就删除了镜像文件,因为不同的标签指向的镜像ID是相同且唯一的。原因:容器是基于镜像在镜像上加的一层可读写层

删除镜像时,docker将会删除这个镜像文件的所有AUFS层。
注意:使用镜像ID进行镜像删除时,如果基于该镜像的容器还存在时,镜像文件是无法删除的。


使用docker rmi -f 镜像ID的方式可以强行删除镜像,但是这种方式会造成一些遗留问题,因此不推荐。
正确的删除步骤是,应该先将该镜像的所有的容器全部删除之后,再删除镜像。

docker rm 命令删除容器时,后跟多个容器ID可一同删除,删除镜像文件时,从上图可以看到镜像的AUFS层也被全部删除。

5.创建镜像

A.基于已有镜像的容器创建

使用docker commit 提交一个修改后的容器到仓库:

1. 使用docker run -it ubuntu:latest /bin/bash 基于ubuntu镜像在本地启动一个容器
2. 进入容器后,执行touch test 生成一个新的文件test
3. 此时容器即已经被修改, exit退出容器
4. docker commit --help查看用法:

-a:参数指定作者
 -m:指定消息内容
-p:提交时,是否暂停容器运行,默认是的

执行如下的commit命令,提交动作执行之后,生成一个新的ID为新镜像ID


提交时,如果不指定tag,则默认为latest

B.基于本地模版导入

可以从http://download.openvz.org/template/precreated网站上去下载一些docker模版
wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
这里下载速度比较慢,因此使用了本地已经存放的一个模版文件


C.基于Dockerfile创建

6.存出和载入镜像

分别使用docker save 和 docker load 命令在存出和载入镜像

A.存出镜像:


使用docker save –help命令查看docker save 的用法。执行导出后,可以看到在当前目录之下生成的导出模版文件:tomcat.tar.gz

B.载入镜像:

a.先删除本地镜像中的tomcat

b.导入刚刚存出的tomcat.tar.gz文件到本地的镜像列表之中

c.载入镜像之后,可以看到镜像列表中没有对应的仓库和标签名称,即没有所谓的镜像元数据信息(还可以使用docker load < tomcat.tar.gz来完成载入)

d.上传镜像(这里测试上传到docker hub官网),需要在该网站上注册用户,并创建仓库

e.然后 docker push 上传镜像


也可以自己在内网搭建一个私有的docker注册服务器,来存放私有仓库。

文章目录
  1. 1. 1.获取镜像
  2. 2. 2.查看镜像信息
  3. 3. 3.搜寻镜像
  4. 4. 4.删除镜像
  5. 5. 5.创建镜像
    1. 5.1. A.基于已有镜像的容器创建
    2. 5.2. B.基于本地模版导入
    3. 5.3. C.基于Dockerfile创建
  6. 6. 6.存出和载入镜像
    1. 6.1. A.存出镜像:
    2. 6.2. B.载入镜像:
      1. 6.2.1. a.先删除本地镜像中的tomcat
      2. 6.2.2. b.导入刚刚存出的tomcat.tar.gz文件到本地的镜像列表之中
      3. 6.2.3. c.载入镜像之后,可以看到镜像列表中没有对应的仓库和标签名称,即没有所谓的镜像元数据信息(还可以使用docker load < tomcat.tar.gz来完成载入)
      4. 6.2.4. d.上传镜像(这里测试上传到docker hub官网),需要在该网站上注册用户,并创建仓库
      5. 6.2.5. e.然后 docker push 上传镜像
,