在Docker中,容器和图像之间有什么区别?

时间:2014-02-01 13:49:08

标签: docker terminology

Docker中的容器和图像有什么区别?在Get started with Docker tutorial这些术语都被使用,但我不明白其中的区别。

有人可以解释一下吗?

13 个答案:

答案 0 :(得分:287)

图像是活动容器的冻结不可变快照。容器正在运行(或停止)某些映像的实例。

从名为'ubuntu'的基本图像开始。让我们在ubuntu映像中以交互方式运行bash并创建一个文件。我们将使用-i-t标志为我们提供交互式bash shell。

$ docker run -i -t ubuntu  /bin/bash
root@48cff2e9be75:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@48cff2e9be75:/# cat > foo
This is a really important file!!!!
root@48cff2e9be75:/# exit

退出并重新启动图像时,不要指望该文件会留下来。您正在从之前开始的完全相同的状态重新启动,而不是从中断的位置重新启动。

$ docker run -i -t ubuntu  /bin/bash
root@abf181be4379:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@abf181be4379:/# exit

但是,现在不再运行的容器具有状态,可以保存(提交)到图像。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS                      NAMES
abf181be4379        ubuntu:14.04        /bin/bash              17 seconds ago       Exited (0) 12 seconds ago                                  elegant_ardinghelli    
48cff2e9be75        ubuntu:14.04        /bin/bash              About a minute ago   Exited (0) 50 seconds ago                                  determined_pare        
...

让我们从容器ID 48cff2e9be75创建一个我们创建文件的图像:

$ docker commit 48cff2e9be75 ubuntu-foo
d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2

现在,我们有了一个包含我们非常重要文件的新图像:

$ docker run ubuntu-foo /bin/cat foo
This is a really important file!!!!

尝试命令docker images。您应该会看到新图片ubuntu-foo以及我们开始使用的ubuntu标准图片。

答案 1 :(得分:157)

图像是根文件系统更改的有序集合以及在容器运行时内使用的相应执行参数。图像是只读的。

容器是图像的活动(或退出时无效)有状态实例化。

答案 2 :(得分:61)

使用面向对象的编程类比,Docker镜像和Docker容器之间的区别与类和对象之间的差异相同。对象是类的运行时实例。同样,容器是图像的运行时实例。

对象在实例化时仅创建一次。同样,容器可以运行或停止。容器是从图像中创建的,但情况可能并非总是如此。以下示例创建Apache服务器映像,运行映像,列出映像,然后列出容器:

  1. 使用以下内容创建Dockerfile:

    FROM httpd:2.4
    
  2. 安装Apache服务器

    sudo docker build -t my-apache2 .
    
  3. 运行图像

    sudo docker run -it --rm --name my-running-app my-apache2
    
  4. 列出Docker镜像

    sudo docker images
    
  5. 列出正在运行的Docker容器

    docker ps
    
  6. 列出所有容器

    docker ps -a
    
  7. 列出最新创建的容器

    docker ps -l
    

答案 3 :(得分:42)

简单易懂。

图片 -

  

用于的文件系统和配置(只读)应用程序   创建容器。 More detail

容器 -

  

这些是Docker镜像的运行实例。容器运行实际   应用。容器包括应用程序及其所有应用程序   依赖。它与其他容器共享内核并运行为   主机操作系统上用户空间中的隔离进程。 More detail

需要注意的其他重要条款:

Docker守护程序 -

  

在管理建筑物的主机上运行的后台服务,   运行和分发Docker容器。

Docker客户端 -

  

允许用户与Docker交互的命令行工具   守护进程。

Docker商店 -

  

Store是Docker镜像的注册表。您可以   将注册表视为所有可用Docker镜像的目录。

一张图片胜过千言万语。

Enter image description here

(如需更深入的了解,请阅读this。)

要点:

  • 从Docker hub中拉图像或从Dockerfile中构建=>提供Docker镜像(不可编辑)。
  • 运行图片(docker run image_name:tag_name)=>提供正在运行的图像即容器(可编辑)

答案 4 :(得分:14)

图像基本上是用于创建容器的不可变模板。通过考虑将图像转换为容器的情况,可以更容易地理解图像和容器之间的区别。

Docker引擎获取图像并在顶部添加读写文件系统,然后初始化各种设置。这些设置包括网络选项(IP,端口等),名称,ID和任何资源限制(CPU,内存)。如果已经要求Docker引擎运行容器,它还将初始化其中的进程。可以停止并重新启动容器,在这种情况下,它将保留所有设置和文件系统更改(但会丢失内存中的所有内容,并且将重新启动所有进程)。因此,停止或退出的容器与图像相同。

答案 5 :(得分:6)

图片[如vm]

  • 只读模板用于创建容器
  • 由您或其他Docker用户推荐
  • 存储在Docker Hub或您当地的注册表中

容器[如跑步机]

  • 独立应用程序平台
  • 包含运行应用程序所需的一切
  • 基于图像

images link to show what is a container

答案 6 :(得分:4)

DockerFile - (构建) - > DockerImage - (运行) - > DockerContainer

DockerFile 是您或开发人员编写代码来执行某些操作(例如安装)

构建docker文件时会得到

Docker Image

运行Docker镜像时会得到

Docker容器

我们可以通过拉动从Docker hub获取Docker Image,然后运行它来获取容器。

答案 7 :(得分:2)

容器基于图像。需要将图像传递给Dockers运行命令。

示例:

BusyBox图片

http://i.stack.imgur.com/eK9dC.png

这里我们指定一个名为busybox的图像。 Docker在本地没有这个图像,并从公共注册表中提取它。

注册表是Docker客户端可以与之通信并从中下载映像的Docker映像目录。拉出图像后,Docker启动一个容器并执行echo hello world命令。

答案 8 :(得分:2)

在Docker中,一切都以图像开头。图像是构成足够操作系统的每个文件,以执行您需要执行的操作。传统上,您可以为每个应用程序安装一个完整的操作系统。使用Docker,你可以将它配对,这样你就可以拥有一个只有足够操作系统的小容器来完成你需要做的事情,你可以在计算机上有效地使用它们。

使用docker images查看已安装的图片,使用docker ps查看正在运行的图片。 当您键入docker run时,它会获取图像,并使其成为具有正在运行的进程的活动容器。我倾向于使用:

  

docker run -ti <image>:<tag> bash

最后,图片有自己的一组ID,容器有自己的一组ID - 它们不重叠。

答案 9 :(得分:1)

图像:运行容器所需的文件系统和元数据。可以将它们视为一种应用程序打包格式,其中包括运行该应用程序的所有依赖项以及执行该应用程序的默认设置。元数据包括要运行的命令的默认值,环境变量,标签和运行状况检查命令。

容器:独立应用程序的实例。容器需要映像定义其初始状态,并使用映像中的只读文件系统以及特定于容器的读写文件系统。运行中的容器是运行中进程的包装,为该进程提供文件系统,网络和PID之类的名称空间。

执行docker run命令时,您会在命令行上提供映像以及所有配置,然后docker根据您提供的映像定义和配置返回一个容器。


参考:对于docker引擎,图像只是图像ID。这是唯一的不可变哈希。更改图像会导致创建新的图像ID。但是,您可以有一个或多个指向图像ID的引用,这与符号链接不同。并且这些引用可以更新以指向新的图像ID。请注意,当您创建容器时,docker将在创建容器时解析该引用,因此您无法更新正在运行的容器的映像。而是创建一个新图像,并基于该新图像创建一个新容器。

:深入研究,您将拥有文件系统层。 Docker将图像与分层文件系统组装在一起。每一层都是对文件系统所做的只读更改集,并且该层由唯一的哈希表示。使用这些只读层,多个图像可能会扩展另一个图像,并且仅需要通过网络存储或传输这些图像之间的差异。当Docker容器运行时,它会收到该容器特有的特定于容器的读写文件系统层,并且所有图像层都使用并集文件系统进行组装。读取将遍历每一层,直到找到文件,找到删除或在底层找不到文件为止。写入执行从图像只读层到特定于容器的读写层的写时复制。并且删除被记录为对容器特定读写层的更改。构建映像的常见步骤是,根据先前的映像文件系统状态在临时容器中运行命令,并将所得的特定于容器的层保存为新映像中的层。

答案 10 :(得分:0)

Docker图片: 它包含一系列命令和有关如何构建和运行容器的说明。所以基本上图像包含启动容器所需的所有数据和元数据(也称为蓝图)。我们不能在没有指定图像的情况下午餐。

2017-11-23T08:44Z

列出所有可用的centos版本。

Docker容器: 容器是Images的午餐,所以我们可以说容器是图像的运行实例。 Container是一个运行时构造,与构建时构造的Images不同。

答案 11 :(得分:0)

官方区别是容器是可写的最后一层,而下面的层仅可读,它们属于您的图像。直观的区别是docker实例是由docker守护程序虚拟化的实例,并且正在运行映像,它在内核的隔离区域内运行(此过程对您而言是隐藏的)。但是图像是静态的,它不会运行,只是一堆图层(静态文件)。如果将这种范例与面向对象的编程相关联,则图像是您的类定义,而docker实例是您的类生成的对象,该对象位于内存中。

我写了一个教程来增强您的docker知识直觉:

http://javagoogleappspot.blogspot.com/2018/07/docker-basics.html

答案 12 :(得分:-5)

图像是用手机拍的照片。
是电话。