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

Docker图像和容器之间有什么区别?,docker,docker-container,docker-image,Docker,Docker Container,Docker Image,当使用Docker时,我们从一个基本图像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中 因此,最终我有了一个用于PostgreSQL实例的映像和一个用于web应用程序的映像,对它们的更改会一直保持不变 什么是容器?图像的实例称为容器。您有一个图像,它是您描述的一组层。如果启动此映像,则此映像的容器正在运行。可以有许多相同映像的运行容器 您可以使用docker images查看所有图像,而您可以使用docker ps查看正在运行的容器(并且您可以使用docker ps-a查看所有容

当使用Docker时,我们从一个基本图像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中

因此,最终我有了一个用于PostgreSQL实例的映像和一个用于web应用程序的映像,对它们的更改会一直保持不变


什么是容器?

图像的实例称为容器。您有一个图像,它是您描述的一组层。如果启动此映像,则此映像的容器正在运行。可以有许多相同映像的运行容器

您可以使用
docker images
查看所有图像,而您可以使用
docker ps
查看正在运行的容器(并且您可以使用
docker ps-a
查看所有容器)


因此,映像的运行实例是一个容器。

虽然将容器视为运行映像是最简单的,但这并不十分准确

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+
图像实际上是一个可以转换为容器的模板。要将映像转换为容器,Docker引擎将获取映像,在其顶部添加一个读写文件系统,并初始化各种设置,包括网络端口、容器名称、ID和资源限制。一个正在运行的容器有一个当前正在执行的进程,但是一个容器也可以被停止(或者用Docker的术语来说是退出)。退出的容器与映像不同,因为它可以重新启动,并将保留其设置和任何文件系统更改

来自我的文章:

Docker图像与容器 在Dockerland中,有图像容器。两者密切相关,但又截然不同。对我来说,掌握了这种二分法使Docker非常清楚

什么是图像? 映像是一个惰性的、不可变的文件,本质上是容器的快照。图像是使用命令创建的,当使用时,它们将生成一个容器。图像存储在Docker注册表中,例如。因为它们可能变得相当大,所以图像被设计为由其他图像的层组成,从而允许在网络上传输图像时发送最小数量的数据

通过运行
docker images
,可以列出本地图像:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB
在这里,我正在运行docker注册表的docker版本,这样我就有了一个私人空间来存储我的图像。同样,需要注意的是:

  • 与图像ID一样,容器ID是容器的真实标识符。它具有相同的形式,但它标识不同类型的对象
  • docker ps
    仅输出运行的容器。您可以使用
    docker ps-a
    查看所有容器(运行或停止)
  • 名称可用于通过
    --name
    标志标识已启动的容器
  • 如何避免图像和容器堆积 我早期对Docker的不满之一是,似乎不断累积未标记的图像和停止的容器。在少数情况下,这种累积导致硬盘驱动器耗尽,使我的笔记本电脑速度变慢,或使我的自动构建管道中断。谈论“到处都是集装箱”

    我们可以通过将
    docker rmi
    与最近的
    dangling=true
    查询相结合来删除所有未标记的图像:

    docker图像-q--过滤“悬挂=真”| xargs docker rmi

    Docker将无法删除位于现有容器后面的图像,因此您可能必须首先使用
    Docker rm
    删除已停止的容器:

    docker rm `docker ps --no-trunc -aq`
    
    这些都是Docker提供的,可能会在未来的版本中解决。但是,在清楚了解图像和容器的情况下,可以通过以下两种做法避免这些情况:

  • 始终使用
    docker rm[container\u ID]
    移除无用的、已停止的容器
  • 始终使用
    docker rmi[image\u ID]
    删除无用且已停止的容器后面的图像

  • Docker的核心概念是使创建“机器”变得容易,在这种情况下可以将其视为容器。容器有助于重用,允许您轻松创建和放置容器

    图像描述了容器在每个时间点的状态。因此,基本工作流程是:

  • 创建一个图像
  • 开箱
  • 对容器进行更改
  • 将容器另存为图像

  • 也许解释整个工作流程会有所帮助

    一切都从Dockerfile开始。Dockerfile是图像的源代码

    创建Dockerfile后,构建它以创建容器的图像。该图像只是Dockerfile“源代码”的“编译版本”

    获得容器的映像后,应使用注册表重新分发它。注册表就像一个Git存储库——您可以推拉图像


    接下来,您可以使用该图像运行容器。运行中的容器在许多方面与虚拟机非常相似(但没有)。Docker映像打包了应用程序运行所需的应用程序和环境,容器是映像的运行实例

    图像是Docker的打包部分,类似于“源代码”或“程序”。容器是Docker的执行部分,类似于“流程”


    在这个问题中,只提到“程序”部分,这就是图像。Docker的“运行”部分是容器。当容器运行并进行更改时,就好像进程更改了自己的源代码并将其保存为新映像。

    容器只是一个可执行的二进制文件,将由主机操作系统在使用应用程序(例如Docker)预设的一组限制下运行它知道如何告诉操作系统应用哪些限制

    典型的限制是进程隔离相关、安全相关(如使用保护)和sy
    +------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
    | Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
    +------------+                 +--------------+                   +-----------+                    +------+
                                     ^
                                     | docker pull
                                     |
                                   +--------------+
                                   |   Registry   |
                                   +--------------+
    
    docker image ls
    
    docker ps
    
    IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
    newDotNetApp.ChangeDescription("I am making changes on this instance");
    newDotNetApp.Run();
    
    +-----------------------------+-------+-----------+
    |             Domain          | Meta  | Concrete  |
    +-----------------------------+-------+-----------+
    | Docker                      | Image | Container |
    | Object oriented programming | Class | Object    |
    +-----------------------------+-------+-----------+