一、镜像仓库
将Docker镜像和Git进行对比,镜像仓库类似GitHub、GitLab等托管平台,Docker的镜像仓库托管的不是代码项目,而是镜像。
Docker镜像仓库最大的作用是实现了Docker镜像的分发。借助镜像仓库,得到了一个镜像的中转站,可以将开发环境上所使用的镜像推送至镜像仓库,并在测试或生产环境上拉取到它们,而这个过程仅需要几个命令,甚至自动化完成。
Docker另一项重要的功能是将镜像管理纳入到了功能之中,实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了移植过程中的繁琐操作。利用Docker的镜像管理功能,可以很方便的通过网络传输和分享镜像,并保障镜像内容的一致性。
A、获取镜像
可以通过很多方式将镜像引入Docker之中,但最常用的获取镜像的方式是直接从镜像仓库中拉取,因为这种方式简单、快速、有保障。
可以使用docker pull命令拉取镜像,命令的参数就是镜像仓库名。
# 拉取镜像
docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6cf436f81810: Pull complete
987088a85b96: Pull complete
b4624b3efe06: Pull complete
d42beb8ded59: Pull complete
Digest: sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5b35a24b41a86077c650210
Status: Downloaded newer image for ubuntu:latest
# 查看本地镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 47b19964fb50 12 days ago 88.1MB
运行命令后,Docker就会开始从镜像仓库中拉取指定的镜像,在控制台中,可以看到镜像拉取的进度。下载进度会分为几行,每行代表一个镜像层。Docker首先会拉取镜像所基于的所有镜像层,之后再单独拉取每一个镜像层并组合成这个镜像。如果在本地已经存在相同的镜像层(共享于其他的镜像),Docker就直接略过这个镜像层的拉取而直接采用本地的内容。
当没有提供镜像标签时,Docker会默认使用latest这个标签,也能够使用完整的镜像命名来拉取镜像。
二、Docker Hub
Docker Hub是Docker官方建立的中央镜像仓库,除了普通镜像仓库的功能外,它内部还有更加细致的权限管理,支持构建钩子和自动构建,以及优雅的web操作页面。
Docker Hub的定位是Docker的中央镜像仓库系统,同时也是Docker Engine的默认镜像仓库,所以使用Docker Hub是开发者共享镜像的首选,常用服务软件的镜像都能在Docker Hub中找到,甚至能找到针对它们不同用法的不同镜像。
同时,Docker Hub也允许用户上传镜像,与Docker用户共享成果。
A、搜索镜像
由于Docker Hub提供了一套完整的web操作界面,搜索其中的镜像会非常方便。
除了直接通过Docker Hub网站搜索镜像这种方式外,还可以用docker CLI中docker search这个命令搜索Docker Hub中的镜像。
docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 9198 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 270 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 201 [OK]
使用docker search命令,可以得到一个类似于Docker Hub网页版搜索的镜像列表结果,其中的信息与网页版也是类似的。通过这种方式可以在不方便访问web的环境下搜索镜像。
三、管理镜像
docker images可以列出本地 Docker 中的所有镜像,如果要获得镜像更详细的信息,可以通过docker inspect命令。
A、参数识别
不论通过镜像名还是镜像ID传递到docker inspect或者其他类似的命令(需要指定Docker对象的命令)里,Docker都会根据传入的内容去寻找与之匹配的内容,只要所给出的内容能够找出唯一的镜像,那么Docker就会对这个镜像执行给定的操作。反之,如果找不到唯一的镜像,那么操作不会进行,Docker也会显示错误。
例如:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 7-fpm f214b5c48a25 11 days ago 368MB
ubuntu latest cd6d8154f1e1 13 days ago 84.1MB
redis 3.2 2fef532eadb3 13 days ago 76MB
redis 4.0 e1a73233e3be 13 days ago 83.4MB
openresty/openresty 1.13.6.2-alpine 08d5c926e4b6 3 months ago 49.3MB
cogset/cron latest c01d5ac6fc8a 16 months ago 125MB
镜像ID前缀为2的只有redis:3.2,可以使用2来指代这个镜像。
docker inspect 2
而前缀为c的镜像有两个,这时候如果直接使用c来指代镜像的话,Docker会提示未能匹配到镜像。
B、删除镜像
虽然Docker镜像占用的空间比较小,但日渐冗杂的镜像和凌乱的镜像版本会让管理越来越困难,所以有时候需要清理一些无用的镜像,将它们从本地的Docker Engine中移除。
# 删除本地镜像
docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5b35a24b41a86077c650210
Deleted: sha256:47b19964fb500f3158ae57f20d16d8784cc4af37c52c49d3b4f5bc5eede49541
Deleted: sha256:d4c69838355b876cd3eb0d92b4ef27b1839f5b094a4eb1ad2a1d747dd5d6088f
Deleted: sha256:1c29a32189d8f2738d0d99378dc0912c9f9d289b52fb698bdd6c1c8cd7a33727
Deleted: sha256:d801a12f6af7beff367268f99607376584d8b2da656dcd8656973b7ad9779ab4
Deleted: sha256:bebe7ce6215aee349bee5d67222abeb5c5a834bbeaa2f2f5d05363d9fd68db41
删除镜像的过程实际是删除镜像内的镜像层,在命令打印的结果里,可以看到被删除的镜像层以及它们的ID。如果存在两个镜像共用一个镜像层的情况,也不需要担心Docker会删除被共享的那部分镜像层,只有当镜像层只被当前被删除的镜像所引用时,Docker才会将它们从硬盘空间中移除。
docker rmi命令也支持同时删除多个镜像,只需要通过空格传递多个镜像ID或镜像名即可。
参考:
http://blog.poetries.top/2018/11/20/docker-base/