在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服务器映像,运行映像,列出映像,然后列出这些容器:
-
使用以下内容创build一个Dockerfile:
FROM httpd:2.4
-
安装Apache服务器
sudo docker build -t my-apache2 .
-
运行图像
sudo docker run -it --rm --name my-running-app my-apache2
-
列出Docker镜像
sudo docker images
-
列出正在运行的Docker容器
docker ps
-
列出所有容器
docker ps -a
-
列出最新创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命令。