Docker 镜像(1)
Docker镜像----简介
如果读者之前曾经是VM管理员,则可以把Docker镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器;如果读者是一名研发人员,可以将镜像理解为类(class)。
读者需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是Docker Hub,但是也存在其他镜像库仓库服务。拉取操作会将镜像下载到本地Docker主机,读者可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
Docker镜像---详解
前面多次提到镜像就像停止运行的容器(类)。实际上,读者可以停止容器的运行,并从中创建新的镜像。在该前提下,镜像可以理解为一种构建(build—time)结构,而容器可以理解一种运行时(run—time)结构,如下图
镜像和容器
一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的镜像,会导致下面的错误。
镜像通常比较小
容器目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用、服务运行所必需的操作系统和和应用文件。但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。
例如,Docker镜像通常不会包含6个不同的shell让读者选择---通常Docker镜像中只会有精简的shell,甚至没有shell。镜像中还不包含内核----容器都是共享所在Docker主机的内核。
拉取镜像
Linux Docker主机本地镜像仓库通常位于/var/lib/docker/<storage-driver>,window Docker 主机则在C:\ProgramData\docker\windowfilter.
将镜像取到Docker主机本地的操作是拉取。所以,如果读者想在Docker主机使用最新的Ubuntu镜像,需要拉取它。
从 Docker Hub 的 ubuntu 仓库中拉取标签为 latest 的镜像
docker image pull ubuntu:latest
镜像仓库服务
Docker镜像存储在镜像仓库服务(Image Registry)当中。Docker客服端镜像的仓库服务是可配置的,默认使用Docker Hub。
镜像仓库服务包包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。
官方和非官方镜像仓库
Docker Hub也分为官方仓库(Official Repository)和非官方仓库(Unofficial Repository)。
顾名思义,官方仓库中的镜像是由Docker公司审查的。这意味着其中的镜像会及时更新,由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践
非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库也有一些很优秀的镜像。读者需要做的是信任非官方仓库镜像代码之前保持谨慎。
大部分流行操作系统和应用在Docker Hub的官方仓库中都有其对应镜像。这些镜像很容易找到,基本都在Docker Hub命名空间的顶层。
镜像命名和标签
只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用’:‘分割)。从官方仓库拉取镜像时,docker image pull命令格式如下
docker image pull <repository>:<tag>
在之前Linux实例中,通过下面的两条命令完成Alpine和ubuntu镜像的拉取
docker image pull alpine:latest
docker image pull ubuntu:latest
这两条命令从alpine和ubuntu仓库拉取有"latest"标签的镜像。
下面的实例显示如何从官方仓库拉取不同的镜像
$ docker image pull mongo:3.3.1
//该命令会从官方Mongo库拉取标签为3.3.11的镜像
$ docker image pull redis:latest
//该命令会从redis拉取标签为latest的镜像
$ docker image pull alpine:
//该命令会从官方alpine库拉取标签为latest的镜像
关于上述命令,需要注意以下几点。
- 首先,如果没有在仓库名称后指定具体的镜像标签,则Docker会假设用户希望拉取标签为latest的镜像
- 其次,标签为latest的镜像没有什么特殊魔力!标又latest标签的镜像不保证这是仓库中最新的镜像!例如Alpine仓库中最新的镜像通常标签是edge。
从非官方仓库拉取镜像也是类似的,读者只需要在仓库面前加上Docker Hub的用户名或者组织名称。下面的示例展示了如何从tu-demo仓库中拉取v2这个镜像,其中镜像的拥有者是Docker Hub账户nigelpoulton
$ docker image pull nigelpoulton/tu-demo:v2
//该命令会从以我自己的Docker Hub账号为命名空间的tu-demo库中下载标签为v2的镜像
为镜像打多个标签
关于镜像有一点不得不提,一个镜像可以根据用户需要设置多个标签。这是因为标签是存放在镜像元数据中任意数字或字符串。一起来看下面的示例。
在docker image pull命令中指定-a参数来拉取仓库中全部镜像。接下来可以通过运行docker image ls查看已经拉取的镜像。
$ docker image pull -a nigelpoulton/tu-demo
latest: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Pull complete
a3ed95caeb02: Pull complete
<Snip>
Digest: sha256:42e34e546cee61adb1...3a0c5b53f324a9e1c1aae451e9
v1: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Already exists
a3ed95caeb02: Already exists
<Snip>
Digest: sha256:9ccc0c67e5c5eaae4b...624c1d5c80f2c9623cbcc9b59a
v2: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Already exists
a3ed95caeb02: Already exists
<Snip>
Digest: sha256:d3c0d8c9d5719d31b7...9fef58a7e038cf0ef2ba5eb74c
Status: Downloaded newer image for nigelpoulton/tu-demo
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nigelpoulton/tu-demo v2 6ac21e..bead 1 yr ago 211.6 MB
nigelpoulton/tu-demo latest 9b915a..1e29 1 yr ago 211.6 MB
nigelpoulton/tu-demo v1 9b915a..1e29 1 yr ago 211.6 MB
- 该命令从nigelpoulton/tu-demo仓库拉取了3个镜像:latest、v1以及v2.
- 输入docker image ls命令发现IMAGE ID这一列。读者会发现只有两个不同的Image ID。这是因为实际只下载了两个镜像,其中有两个标签指向了相同的镜像。换句话,其中一个镜像有两个镜像。
这个示例也完美证明了前文中关于latest标签使用的警告。在本例中,latest标签指向了v1标签。这意味着latest实际指向了两个镜像中较早的那个版本,而不是最新的版本! latest是一个非强制标签,不保证指向仓库中最新的镜像。
- 删除docker私有仓库中的镜像
- docker镜像的管理
- 如何建立你自己的Docker镜像
- 关于CentOS7下docker-ce无法删除镜像的问题
- docker镜像创建与基本使用
- 关于从Linux虚拟机上从docker下载rabbitmq:3-management镜像所遇见的困难
- 制作ssh互信的docker镜像
- Docker 镜像
- docker 通过commit方法创建镜像(Tomcat+Java+Scala)
- 生成springboot docker镜像 并上传到阿里云镜像厂库
- 制作docker镜像
- 解决docker镜像无法下载的问题
- Docker实战:镜像与容器基础命令
- docker~Dockerfile方式建立镜像HelloWorld
- Docker容器虚拟化(一)—安装与镜像管理
- (一)centos7.3安装docker,配置镜像源
- Docker镜像和容器常用操作
- Docker安装指定版本TAG的镜像
- docker 保存本地容器 推送镜像
- 在以 CentOS7.6 为基础镜像的 Docker 容器中通过 NFS 将内存挂载成高速硬盘使用