当前位置: 首页 > 知识库问答 >
问题:

为什么docker容器共享图像id?

伍昱
2023-03-14

我有一个docker-comuse文件,它创建了两个实例,一个用于webserver,另一个用于数据库

当我运行docker ps时,我会得到这样的输出:

7cb1fb603a98   apache          "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    0.0.0.0:8080->8080/tcp             compose_webserver_1
74f3bbe506eb   postgres:13     "docker-entrypoint.s…"   6 minutes ago   Up 16 minutes (healthy)   5432/tcp                           compose_postgres_1

如果我运行docker images

REPOSITORY        TAG               IMAGE ID       CREATED          SIZE
webserver        latest            17dc61fa0139   2 minutes ago    2.05GB
database         latest            17dc61fa0139   2 minutes ago    2.05GB

我看到两个服务共享image_id。在我的docker-compose.yml中,我设置了:

build:
      context: .
      dockerfile: Dockerfile-test

在创建前运行一些添加。然后,我在FROM语句中使用另一个图像作为基础来创建自己的图像。

一旦我有了主要内容的新图像,还有我添加的requirement.txt和其他东西,我就把它推送到ECR存储库。

然后,我不再使用前两个docker容器,而是使用ECR存储库中使用这些新映像创建的单个容器。

它在一个容器中拥有两个服务,尽管在我最初的docker compose-up--build中它提出了两个容器。为什么会这样?

这是正确的,还是我应该用命令语句强制从我创建的新拉动映像中创建两个容器实例?例如,总是有两个容器实例可以让我将postgres容器交换到一个mysql。


共有2个答案

段干跃
2023-03-14

为什么docker容器共享图像id?

因为它们可以。图像只是容器使用的“文件系统模板”。

关于图像复制。它不是复制,它是一个单独的图像17dc61fa0139,有两个名称webserver:latestdatabase:latest

叶茂
2023-03-14
匿名用户

在下面的回答中,我将使用“图像”和“容器”这两个术语,了解它们的区别很重要。图像是您构建的,并且存储在注册表中。容器是映像启动时正在运行的进程。

当图像具有相同的id时,它们是相同的,并且它们只占用注册表中图像的一个副本的空间。docker compose--build会创建两个映像,因为在compose文件中定义了两个服务,它会为每个服务创建一个映像。

至于设置,常见的方法是将每个服务放在自己的映像中,并将它们作为单独的容器运行。拥有一个可以根据你传递的命令做多种事情的图像没有什么错,只是图像比需要的大。另一方面,我看不出有什么优势,所以最好的方法是有一个数据库映像和一个Web服务器映像,只做它们需要的事情。

您可以在一个容器中运行多个进程,但这并不是您经常看到的情况。在使用数据库和Web服务器的情况下,您可能希望扩展Web服务器的数量,并且仍然拥有一个数据库。如果它们在同一个容器中,你就不能这么做。

 类似资料:
  • 我从Fedora通过Dockerfile制作了一个简单的图像(最初为320 MB)。 添加了Nano(这个1MB大小的微小编辑器),图像的大小上升到了530MB。我在上面添加了Git(大约30 MB),然后我的图像大小的sky-rockets达到了830 MB。 这不是疯了吗? 我已经尝试导出和导入容器来删除历史/中间图像。这一努力节省了25 MB,现在我的图像大小是804 MB。我也尝试在一个上

  • 问题内容: 嗨,我正在使用Docker部署一些服务,在这里我想在不同的Docker容器之间共享Docker卷。 假设我有一个Docker容器A在/ data挂载了一个卷。这是A的Dockerfile 据我了解,这会将一个卷附加到容器,但不会将主机目录装载到该容器。因此,该卷内的数据仍位于容器A内。 我有另一个提供ftp服务的容器B。它访问卷/ public下的数据。B的Dockerfile是 现在

  • 我正在使用Docker部署一些服务,我想在不同的容器之间共享Docker卷。 假设我有一个Docker容器a,它在/data处挂载了一个卷。下面是它的DockerFile: 根据我的理解,这会将卷附加到容器,但不会将主机目录挂载到容器。所以这个卷里面的数据仍然在容器A里面。

  • 问题内容: 我通过Fedora的Dockerfile创建了一个简单的映像(最初为320 MB)。 添加了Nano(这个1MB大小的微型编辑器),图像的大小已增加到530 MB。我在此基础上添加了Git(30-ish MB),然后将图像大小的火箭提高到830 MB。 那不是疯了吗? 我试图导出和导入容器以删除历史记录/中间图像。这项工作最多可节省25 MB,现在我的图像大小为804 MB。我也尝试过

  • 问题内容: 我有1个进程写入docker容器中共享内存的特定部分(即“ / falcon”)。 Docker映像:dockersharedmemory / shmclient 我有另一个进程,它最初在另一个Docker容器中每秒创建和读取共享内存的同一部分(即“ / falcon”)。 Docker映像:dockersharedmemory / shmserver 使用以下命令运行两个容器时,我可

  • 问题内容: 有谁知道如何使用centos基本映像在docker容器中安装nfs共享?我已经尝试过以下命令: 并得到下一个错误: 当我尝试将其与 -o nolock 选项一起使用时,错误是: 问题答案: 对于使用,您需要具有此功能,Docker在创建容器时会丢弃该功能。 有几种解决方案: 用标志启动容器。这将导致Docker保留该功能,从而使您可以从容器内挂载NFS共享。这可能是一个安全问题;不要在