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

谁能给我点灯?


当前回答

容器是基于图像的。需要将图像传递给Dockers run命令。

例子:

BusyBox映像

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

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

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

其他回答

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

The Docker engine takes the image and adds a read-write filesystem on top, then initialises various settings. These settings include network options (IP, port, etc.), name, ID, and any resource limits (CPU, memory). If the Docker engine has been asked to run the container it will also initialise a process inside it. A container can be stopped and restarted, in which case it will retain all settings and filesystem changes (but will lose anything in memory and all processes will be restarted). For this reason a stopped or exited container is not the same as an image.

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

从名为“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映像。你应该会看到你的新映像ubuntu-foo与我们开始时的ubuntu标准映像一起列出。

图片是用你的手机拍的照片。 容器就是电话。

映像是根文件系统更改和容器运行时中使用的相应执行参数的有序集合。映像是只读的。

https://docs.docker.com/glossary/?term=image

容器是映像的活动(退出时为非活动)状态实例化。

https://docs.docker.com/glossary/?term=container

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

DockerFile是你或开发人员编写代码来做某事的文件(安装前)

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

Docker容器是你运行Docker镜像时得到的

我们可以通过拖动Docker hub来获取Docker Image,然后运行它来获取container。