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

有些事情要注意:

  • 图像ID是图像真实标识符的前12个字符。 您可以创建给定图像的多个标签,但它们的ID将全部相同(如上所示)。
  • VIRTUAL SIZE是虚拟的,因为它将所有不同底层的大小相加。 这意味着该列中所有值的总和可能远大于所有这些映像使用的磁盘空间。
  • REPOSITORY列中的值来自docker build命令的-t标志,或来自docker tag现有图像。 您可以自由地使用对您有意义的术语来标记图像,但知道码头工人将使用该标签作为docker pushdocker 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
  • TAG列仅仅是完整标签的[:TAG]部分。 这是不幸的术语。
  • latest标签并不神奇,它只是您未指定标签时的默认标签。
  • 您可以使用未标记的图像只能通过其图像ID进行识别。 这些将获得<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版本,这样我就有了一个私密的地方来存储我的图像。 再次,有些事情要注意:

  • 像IMAGE ID一样,CONTAINER ID是容器的真实标识符。 它具有相同的形式,但它确定了一种不同类型的对象。
  • 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