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

Gol*_*den 299 terminology docker

Docker中的容器和图像有什么区别?在入门Docker教程中,这些术语都被使用,但我不明白其中的区别.

任何人都可以解释一下吗?

cba*_*are 321

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

从名为'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
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ 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        
...
Run Code Online (Sandbox Code Playgroud)

让我们从容器ID 48cff2e9be75创建一个图像,我们在其中创建了我们的文件:

$ docker commit 48cff2e9be75 ubuntu-foo
d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2
Run Code Online (Sandbox Code Playgroud)

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

$ docker run ubuntu-foo /bin/cat foo
This is a really important file!!!!
Run Code Online (Sandbox Code Playgroud)

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

  • 到目前为止,这种解释是最清晰和最好的 - 提供真实的例子,与解释术语的"玩词"相比 (38认同)
  • 同意.这是一个精彩的小迷你教程.在我注意到它是由我的一个朋友写的之前我想过.嗨@cbare! (4认同)
  • 顺便说一句,`docker exec -t -i 48cff2e9be75/bin/bash`回到容器 (3认同)

joh*_*sta 159

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

容器是图像的活动(或退出时不活动)状态实例化.

  • 词汇表描述是有道理的,但我绝不能将[docker tutorial](https://docs.docker.com/mac/step_two/)中的以下定义与以下内容联系起来:*容器是剥离的 - Linux操作系统的基础版本.图像是您加载到容器中的软件.* (7认同)
  • docker概念很混乱,shell中的参数也是如此 (5认同)
  • @orad因为这是教程中非常糟糕的描述.我会ping Docker ...... (4认同)

Sta*_*ser 65

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

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

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

    FROM httpd:2.4
    
    Run Code Online (Sandbox Code Playgroud)
  2. 安装Apache服务器

    sudo docker build -t my-apache2 .
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行图像

    sudo docker run -it --rm --name my-running-app my-apache2
    
    Run Code Online (Sandbox Code Playgroud)
  4. 列出Docker镜像

    sudo docker images
    
    Run Code Online (Sandbox Code Playgroud)
  5. 列出正在运行的Docker容器

    docker ps
    
    Run Code Online (Sandbox Code Playgroud)
  6. 列出所有容器

    docker ps -a
    
    Run Code Online (Sandbox Code Playgroud)
  7. 列出最新创建的容器

    docker ps -l
    
    Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的比喻.如果您了解Java有帮助.我打算说一个图像就像一个AWS AMI,而一个容器是一个EC2实例(运行或停止) - 但你必须知道亚马逊网络服务才能理解这个类比. (5认同)
  • 我认为这个类比是有缺陷的.Java中的类更多地是关于如何创建对象的描述.如果你想将它与docker中的任何东西进行比较,我相信最好的匹配将是Dockerfile.另一方面,Docker镜像存储FS的状态,更像是Java中的序列化对象,然后从图像创建容器就像在Java中反序列化存储的对象.总的来说,我认为概念太过不同,无法比较它们. (2认同)

Imr*_*ran 47

用简单的话说.

图片 -

用于创建容器的文件系统和配置(只读)应用程序. 更多细节.

容器 -

这些是Docker镜像的运行实例.容器运行实际的应用程序.容器包括应用程序及其所有依赖项.它与其他容器共享内核,并作为主机操作系统上用户空间中的独立进程运行. 更多细节.


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


Docker守护程序 -

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

Docker客户端 -

命令行工具,允许用户与Docker守护程序进行交互.

Docker商店 -

除其他外,Store是Docker镜像的注册表.您可以将注册表视为所有可用Docker镜像的目录.

一张图片胜过千言万语.

在此输入图像描述

(为了更深入的了解,请阅读此内容.)

摘要:

  • 图像从泊坞毂从或建立一个Dockerfile =>给出一个泊坞图像(不可编辑).
  • 运行图像(docker run image_name:tag_name)=>给出一个正在运行的图像即容器(可编辑)

  • 不给予信任,不要复制和粘贴其他原创作品 (4认同)
  • 我添加了与你的答案类似的docker flow,没有复制粘贴.无论如何,现在已经删除了.你现在一定感到满意. (3认同)
  • 一张图片胜过千言万语. (2认同)

Adr*_*uat 15

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

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


Div*_*hta 10

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

DockerFile是您或开发人员编写的用于执行某些操作的代码(安装前)

Docker Image是您在构建docker文件时得到的。

运行Docker映像后即可获得 Docker Container

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


小智 6

图像[像vm]

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

容器[像跑步机]

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

图像链接以显示什么是容器