Docker镜像和容器有什么区别?
在使用docker时,我们从基础图像开始。 我们启动它,创建更改并将这些更改保存在形成另一个映像的图层中。
因此,最终我为我的Postgres和我的Web应用程序提供了一个映像,并对其进行了更改,以便持续保存。
所以问题是:什么是容器?
图像的一个实例称为容器。 你有一个图像,这是你描述的一组图层。 如果你开始这个图像,你有一个运行这个图像的容器。 您可以拥有许多相同图像的正在运行的容器。
您可以使用docker images
查看所有图像,而您可以使用docker ps
查看正在运行的容器(并且可以使用docker ps -a
查看所有容器)。
所以一个图像的运行实例就是一个容器。
从我的关于自动化Docker部署的文章:
Docker映像与容器
在Dockerland,有图像和容器 。 这两者密切相关,但截然不同。 对我而言,抓住这种二分法极大地澄清了Docker。
什么是图像?
图像是一个惰性的,不可变的文件,基本上是一个容器的快照。 图像是使用build命令创建的,并且在运行启动时会生成一个容器。 图像存储在Docker注册表中,如registry.hub.docker.com。 因为它们可能会变得非常大,所以图像被设计为由其他图像层组成,从而在通过网络传输图像时允许发送数量极小的数据。
本地图像可以通过运行docker images
来列出:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
有些事情要注意:
docker build
命令的-t
标志,或来自docker tag
现有图像。 您可以自由地使用对您有意义的术语来标记图像,但知道码头工人将使用该标签作为docker push
或docker pull
的注册表位置。 [REGISTRYHOST/][USERNAME/]NAME[:TAG]
。 对于上面的ubuntu
,REGISTRYHOST被推断为registry.hub.docker.com
。 因此,如果您打算将名为my-application
图像存储在docker.example.com
的注册表中,则应该为该图像docker.example.com/my-application
标签docker.example.com/my-application
。 latest
标签并不神奇,它只是您未指定标签时的默认标签。 <none>
标签和储存库。 很容易忘记它们。 有关图像的更多信息可从Docker文档和词汇表中获取。
什么是容器?
要使用编程隐喻,如果图像是一个类,那么容器就是一个类的实例 - 一个运行时对象。 容器希望你为什么使用Docker; 它们是运行应用程序的环境的轻量级和便携式封装。
使用docker ps
查看本地运行的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
在这里,我运行码头注册表的dockerized版本,这样我就有了一个私密的地方来存储我的图像。 再次,有些事情要注意:
docker ps
只输出正在运行的容器。 您可以使用docker ps -a
查看所有容器(正在运行或已停止)。 --name
标志使用NAMES标识启动的容器。 如何避免图像和容器堆积?
我对Docker的一个早期挫折是看似不断加载未标记的图像并停止了容器 。 在一些场合,这种堆积导致硬盘驱动器放慢了我的笔记本电脑的速度,或者停止了我的自动化构建流水线。 谈论“无处不在的容器”!
通过将docker rmi
与最近的dangling=true
查询结合起来,我们可以删除所有未标记的图像:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker将无法移除现有容器背后的图像,因此您可能必须先使用docker rm
移除已停用的容器:
docker rm `docker ps --no-trunc -aq`
这些都是Docker已知的难点,并且可能会在将来的版本中解决。 但是,通过对图像和容器的清晰了解,可以通过一些实践来避免这些情况:
docker rm [CONTAINER_ID]
删除无用的停止容器。 docker rmi [IMAGE_ID]
删除无用的已停止容器后面的图像。 尽管将容器想象为正在运行的图像是最简单的,但这并不准确。
图像实际上是一个可以变成容器的模板。 要将图像转换为容器,Docker引擎将获取该映像,并在顶部添加一个读写文件系统,并初始化各种设置,包括网络端口,容器名称,ID和资源限制。 正在运行的容器有一个当前正在执行的进程,但容器也可以停止(或以Docker的术语退出)。 退出的容器与图像不同,因为它可以重新启动并保留其设置和任何文件系统更改。
链接地址: http://www.djcxy.com/p/5105.html上一篇: What is the difference between a Docker image and a container?
下一篇: Using vagrant to run virtual machines with desktop environment