不约儿童 發表於 2018-4-24 06:59:00

Docker 基础 : 镜像

<p><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>目录<br></strong></span></p>
<ul>
<li style="font-family: Microsoft YaHei; font-size: 15px">获取镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">查看镜像信息</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">搜索镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">删除镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">创建镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">导出和导入镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px">上传镜像</li>
<li style="font-family: Microsoft YaHei; font-size: 15px"><span style="font-family: Microsoft YaHei; font-size: 15px">总结</span></li>



</ul>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>镜像是 Docker 的三大核心概念之一。</strong>Docker 运行容器前需要本地存在对应的镜像,如果本地没有对应的镜像,Docker 会尝试从默认的镜像仓库下载。当然用户也可以通过配置,使用自定义的镜像仓库。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>本文将介绍镜像的具体操作</strong>,包括使用 pull 命令从 Docker Hub 的镜像仓库中拉取(下载)公共镜像;查看本地已有的镜像信息;使用 search 命令搜索镜像;删除镜像标签和镜像文件;创建用户自定义镜像并上传到 Docker Hub 镜像仓库。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px">与镜像相关的操作都被定义在 <strong>docker image</strong> 子命令中,虽然不带 image 的格式依然被兼容,但带上 image 后会让命令更容易理解,也会有更好的自动补全效果。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">获取镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">本地镜像是运行容器的前提,所以在运行容器前我们需要使用 docker image pull 命令从网络上的镜像仓库把镜像拉取到本地。该命令的格式为:</span><br><strong><span style="font-family: Microsoft YaHei; font-size: 15px">docker image pull NAME[:TAG|@DIGEST]</span></strong></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">如果只指定了镜像的名称,默认会选择拉取 latest 标签标记的镜像。比如我们要拉取最新的 ubuntu 镜像:</span></p>
<div class="cnblogs_code">
<pre>$ docker image pull ubuntu</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421152958729-1269563722.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">该命令实际拉取的是 ubuntu:latest 镜像,当前的最新版本为 16.04。从上图中可以看到,docker 的镜像其实被分成了很多的层,每层保存一些特定的文件。</span><span style="font-family: Microsoft YaHei; font-size: 15px">上面的命令实际相当于:</span></p>
<div class="cnblogs_code">
<pre>$ docker image pull registry.hub.docker.com/ubuntu:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">即从默认的数据仓库服务器 registry.hub.docker.com 中拉取 ubuntu 仓库中的最新镜像。如果我们感觉从 Docker Hub 上拉取镜像太慢,可选择从其它的数据仓库服务器上拉取,比如 Docker Hub 在国内部署的服务器:</span></p>
<div class="cnblogs_code">
<pre>$ docker image pull registry.docker-cn.com/library/ubuntu:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">镜像下载到本地后就可运行容器了,比如:</span></p>
<div class="cnblogs_code">
<pre>$ docker run --<span style="color: rgba(0, 0, 255, 1)">rm</span> ubuntu <span style="color: rgba(0, 0, 255, 1)">echo</span> hello docker</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421153059503-1464283559.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">查看镜像信息</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">使用 <strong>docker image ls</strong>(或 docker images) 命令可以列出本地存储的镜像:</span></p>
<div class="cnblogs_code">
<pre>$ docker image <span style="color: rgba(0, 0, 255, 1)">ls</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421153227642-294590689.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">输出的信息中包含的内容有:</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>REPOSITORY</strong>:说明镜像来自哪个仓库,比如 ubuntu 或 registry.docker-cn.com/library/ubuntu。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>TAG</strong>:镜像的标签信息,比如 14.04 或 latest。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>IMAGE ID</strong>:标识镜像的 ID 号。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>CREATED</strong>:创建镜像的时间。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px"><strong>SIZE</strong>:镜像大小。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px">其中镜像的 ID 信息十分重要,它唯一的标识了镜像。</span><br><span style="font-family: Microsoft YaHei; font-size: 15px">TAG 信息用来标记来自同一个仓库(比如 ubuntu)的不同镜像。例如 ubuntu 仓库中有多个镜像,可以通过 TAG 信息来区分它们,TAG 13.04、14.04 和 16.04 都代表了不同的发行版本。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">使用 <strong>docker image tag</strong> 命令为本地的镜像添加新的标签还可以方便我们的使用,比如为 ubuntu:14.04 镜像添加下面的标签:</span></p>
<div class="cnblogs_code">
<pre>$ docker image tag ubuntu:<span style="color: rgba(128, 0, 128, 1)">14.04</span> oldubuntu</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">然后就可以通过 oldubuntu 来引用 ubuntu:14.04 镜像了。其实从 docker image ls 的输出中我们可以看到,它们引用的是同一个镜像 ID:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421153409143-664844666.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">我们添加的新标签就像给镜像取了个别名一样。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">使用 <strong>docker image inspect</strong> 命令可以获取镜像的详细信息,比如查看 ubuntu:latest 镜像的信息:</span></p>
<div class="cnblogs_code">
<pre>$ docker image inspect ubuntu:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421153451871-1802524830.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">这个命令的输出很长,上图只是截取了一小部分的信息。它输出的是一个 JSON 格式的信息,一般情况下我们会有的放矢的通过 -f 选项取其中的某一部分。比如只获取镜像的 Architecture 信息:</span></p>
<div class="cnblogs_code">
<pre>$ docker image inspect -f {{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.Architecture</span><span style="color: rgba(128, 0, 0, 1)">"</span>}} ubuntu:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">搜索镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">除了直接在 Docker Hub 的官方网站上搜索镜像资源,还可以通 <strong>docker search</strong> 命令以命令行的方式进行搜索,比如搜索 mysql 镜像:</span></p>
<div class="cnblogs_code">
<pre>$ docker search mysql</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421153619553-1539233963.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">该图只截取了一部分结果。个人感觉这个命令的价值有限,因为我们在选择镜像时还是需要慎重的。往往要在 Docker Hub 的官方网站上查看镜像相关的详细信息,然后才会决定是否使用,而 docker search 命令提供的信息过于有限。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">删除镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">对于不再需要的镜像我们可以使用 <strong>docker image rm</strong> 命令进行删除,以释放镜像占用的磁盘空间。我们可以为 docker image rm 命令传递镜像的标签或 ID,这两种方式略微有些区别,下面我们将分别介绍。</span></p>
<p><strong><span style="font-family: Microsoft YaHei; font-size: 15px">使用进行的标签删除镜像</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">比如删除标签为 mysql:5.6 的镜像:</span></p>
<div class="cnblogs_code">
<pre>$ docker image <span style="color: rgba(0, 0, 255, 1)">rm</span> mysql:<span style="color: rgba(128, 0, 128, 1)">5.6</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154022088-173583009.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">镜像的所有内容一下就被删除了(很多镜像层被删除掉),再来删除 ubuntu:14.04 试试:</span></p>
<div class="cnblogs_code">
<pre>$ docker image <span style="color: rgba(0, 0, 255, 1)">rm</span> ubuntu:<span style="color: rgba(128, 0, 128, 1)">14.04</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154058595-1843745067.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">为什么这次只删除了一点点东西?再去看看进行列表,oldubuntu 还在,并且引用着 ID 为 3b853789146f 的镜像:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154139602-1101903714.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">原来,对于被多个标签引用的镜像 ID,删除标签时只是把那个标签删掉了,并会真正删除镜像文件。现在再删除一次 oldubuntu 试试:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154212424-337866708.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">由于 oldubuntu 是最后一个引用该镜像的标签,所以删除该标签会同时删除该镜像的所有文件。</span></p>
<p><strong><span style="font-family: Microsoft YaHei; font-size: 15px">使用镜像 ID 删除镜像</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">对于镜像 ID 为 c9d990395902 的镜像来说,也有两个标签引用着它,分别是 ubuntu:latest 和 newubuntu:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154324358-929672504.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">现在让我们尝试通过镜像 ID 删除它:</span></p>
<div class="cnblogs_code">
<pre>$ docker image <span style="color: rgba(0, 0, 255, 1)">rm</span> c9d990395902</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154358724-717452113.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">此时 docker 检测到该镜像 ID 被引用了多次就机智的报错了,并且终止了删除操作。同样如果由其它的镜像引用了该 ID 的镜像, docker 同样会报错并终止删除操作。所以,只有当一个镜像不被多个标签引用,也没其它镜像引用它时,才可以被通过镜像 ID 删除。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">创建镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">我们可以通过不同的方式创建镜像,比如基于已有容器进行创建和基于 Dockerfile 文件进行创建。笔者在《Docker 基础 : Dockerfile》一文中介绍过通过 docker build 命令利用 Dockerfile 文件创建镜像,所以这里只介绍如何通过 <strong>docker container commit</strong> 命令基于已有容器创建镜像。</span><span style="font-family: Microsoft YaHei; font-size: 15px">我们先启动一个以 ubuntu:latest 为镜像的容器,然后在当前目录下创建一个名为 nickfile 的文件:</span></p>
<div class="cnblogs_code">
<pre>$ docker run -it ubuntu:latest bash</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154727583-437868059.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">在文件创建后退出容器,但要记住该容器的 ID 为:7e26732e14e6。然后执行下面的命令创建镜像:</span></p>
<div class="cnblogs_code">
<pre>$ docker container commit -m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">add file nickfile.</span><span style="color: rgba(128, 0, 0, 1)">"</span> 7e26732e14e6 nickimage</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154755664-2056187958.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">镜像创建成功后,你可以在镜像列表中看到名称为 nickimage 的镜像:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154825963-2130527954.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">下面运行一个基于 nickimage 的容器,看看 nickfile 是否存在:</span></p>
<div class="cnblogs_code">
<pre>$ docker run --<span style="color: rgba(0, 0, 255, 1)">rm</span> nickimage <span style="color: rgba(0, 0, 255, 1)">ls</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421154856734-1328431057.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">验明正身!我们在容器中创建的文件 nickfile 已经被成功的添加到 nickimage 镜像中了。</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">导出和导入镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">当碰到没有网络的环境时,如何获取镜像呢?答案是在能够获得镜像的环境中把镜像导出为文件,然后通过 U 盘等设备拷贝到目标环境中,再进行导入。</span></p>
<p><strong><span style="font-family: Microsoft YaHei; font-size: 15px">导出镜像</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">通过 <strong>docker image save</strong> 命令可以把镜像导出为本地文件,比如导出 ubuntu:latest 镜像为 ubuntu1604.tar:</span></p>
<div class="cnblogs_code">
<pre>$ docker image save -o ubuntu1604.<span style="color: rgba(0, 0, 255, 1)">tar</span> ubuntu:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">一般我们还会再压缩一下,这样最终的文件会小不少:</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">tar</span> -czf ubuntu1604.<span style="color: rgba(0, 0, 255, 1)">tar</span>.gz ubuntu1604.<span style="color: rgba(0, 0, 255, 1)">tar</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421155020782-705320650.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">文件大小从 112M 压缩到了 41M,效果还是很明显的。</span></p>
<p><strong><span style="font-family: Microsoft YaHei; font-size: 15px">导入镜像</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">把 ubuntu1604.tar.gz 文件拷贝到目标系统上后先要解压出 ubuntu1604.tar 文件:</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">tar</span> -xf ubuntu1604.<span style="color: rgba(0, 0, 255, 1)">tar</span>.gz</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">然后通过 <strong>docker image load</strong> 命令执行镜像的导入操作:</span></p>
<div class="cnblogs_code">
<pre>$ docker image load -i ubuntu1604.<span style="color: rgba(0, 0, 255, 1)">tar</span></pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">这样就 OK 了,用 docker image ls 命令看看,是不是已经可以看到 ubuntu:latest 镜像了!</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">上传镜像</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">可以使用 <strong>docker image push</strong> 命令把镜像上传到镜像仓库服务器,默认是上传到 Docker Hub 的镜像仓库,此时事先需要注册用户并进行登录。上传镜像的命令格式为:</span><br><strong><span style="font-family: Microsoft YaHei; font-size: 15px">docker image push NAME[:TAG]</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">比如笔者在 Docker Hub 注册了账号 ljfpower,并通过 docker login 命令完成了登录操作(需要输入用户名和密码进行验证)。接下来就可把本地的镜像上传到镜像仓库服务器了。在上传前需要给镜像打上合法的标签(用户账号/仓库名称:TAG),比如:</span></p>
<div class="cnblogs_code">
<pre>$ docker image tag azcli:<span style="color: rgba(128, 0, 128, 1)">1.0</span> ljfpower/azcli:latest</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">最后上传这个标签就行了:</span></p>
<div class="cnblogs_code">
<pre>$ docker image push ljfpower/azcli:latest </pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">上传后你就可以在 Docker Hub 上看到这个镜像了:</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px"><img src="https://images2018.cnblogs.com/blog/952033/201804/952033-20180421155141950-1354295174.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18pt">总结</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 15px">镜像是使用 docker 的前提,所以本文比较详细的介绍了 docker 镜像相关的操作,包括获取、查看、搜索、创建、删除、导出、导入等。希望对大家了解、学习 docker 有所帮助。</span></p>
<p><strong><span style="font-family: Microsoft YaHei; font-size: 15px">参考:</span></strong><br><span style="font-family: Microsoft YaHei; font-size: 15px">《Docker 技术入门与实战》</span></p>

</div>
<div id="MySignature" role="contentinfo">
    <div>作者:sparkdev</div>
<div>出处:http://www.cnblogs.com/sparkdev/</div>
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。</div><br><br>
来源:https://www.cnblogs.com/sparkdev/p/8901728.html
頁: [1]
查看完整版本: Docker 基础 : 镜像