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

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

任何人都可以请一些光?

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

一个容器是一个活动的(或不活跃,如果退出)图像的有状态实例化。

图像被冻结不变的快速容器快照。 容器正在运行(或停止)某个图像的实例。

从名为“ubuntu”的基础图像开始。 让我们在ubuntu镜像中交互地运行bash并创build一个文件。 我们将使用-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 ... 

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

 $ docker commit 48cff2e9be75 ubuntu-foo d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2 

现在,我们有一个新的形象与我们真正重要的文件:

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

尝试命令docker images 。 你应该看到你的新映像ubuntu-foo与我们开始的ubuntu标准映像一起列出。

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

一个对象在被实例化时只被创build一次。 同样,一个容器可以运行或停止。 容器是从图像中创build的,尽pipe这可能并不总是如此。 以下示例创build一个Apache服务器映像,运行映像,列出映像,然后列出这些容器:

  1. 使用以下内容创build一个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. 列出最新创build的容器

     docker ps -l 

图像基本上是一个创build容器的不可变模板。 通过考虑将图像转化为容器所发生的情况,理解图像和容器之间的差异会更容易。

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

图像[像vm]

  • 只读模板用于创build容器
  • Buuilt由您或其他Docker用户
  • 存储在Docker Hub或本地registry中

容器[如跑步机]

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

图像链接显示什么是容器

这很直。

(为了更深的理解,请阅读。 )

图像

用于创build容器的我们的应用程序的文件系统和configuration。

集装箱

运行Docker镜像的实例 – 容器运行实际的应用程序。 一个容器包含一个应用程序及其所有依赖项。 它与其他容器共享内核,并在主机操作系统的用户空间中作为隔离进程运行。

Docker守护进程

运行在主机上的后台服务,用于pipe理构build,运行和分发Docker容器。

Docker客户端

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

Docker商店

除其他外,Store是Docker映像的registry。 您可以将registry视为所有可用Docker镜像的目录。

这个stream程将帮助你更好地理解它。 在这里输入图像说明

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

使用docker images查看已安装的图像和docker ps以查看正在运行的图像。 当你inputdocker run它将拍摄图像,并使其成为具有运行过程的活动容器。 我倾向于使用:

docker运行-ti <image>:<tag> bash

最后,图像有自己的一套ID和容器有自己的一套ID – 他们不重叠。

容器是基于图像的。 需要将图像传递给docker run命令。 例如: – busybox图像

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

这里我们指定一个名为busybox的图像。 docker工人并没有本地的这个形象,并从公共registry中拉出来。 registry是docker客户端可以与之通信并下载图片的docker图片的目录。 一旦图像被拉动,docker工人启动一个容器并执行echo hello world命令。