草庐IT

memory - Docker容器和内存消耗

coder 2023-05-05 原文

假设我正在启动大量基于相同 docker 镜像的 docker 容器。这意味着每个 docker 容器都在运行相同的应用程序。可能是应用程序足够大并且需要大量硬盘内存。

docker 是如何处理的?

所有 docker 容器是否共享 docker 镜像中定义的静态部分?

如果没有,将应用程序复制到机器上用于运行 docker 容器并为每个 docker 容器挂载此应用程序目录的某个目录是否有意义?

最佳答案

Docker 在内核级别共享资源。这意味着应用程序逻辑在运行时永远不会被复制。如果您启动记事本 1000 次,它仍然只在硬盘上存储一次,对于 docker 实例也是如此。

如果您运行同一个 docker 镜像的 100 个实例,您真正要做的就是在 100 个不同的独立时间线中保持 RAM 中同一软件的状态。主机处理器将每个容器实例的内存状态转移到控制它的软件,因此您确实消耗了运行应用程序所需的 RAM 内存的 100 倍。 为软件物理存储完全相同的字节码 100 次是没有意义的,因为应用程序的这一部分始终是静态的并且永远不会改变。 (除非您编写了一些疯狂的 self 更改软件,或者您选择重建和重新部署容器的镜像)

这就是为什么容器不允许开箱即用的持久性,以及 docker 与使用虚拟硬盘的常规 VM 的不同之处。但是,这仅适用于容器内部的持久性。硬盘上的 docker 软件正在更改的文件使用 docker 卷“挂载”到容器中,因此实际上并不是 docker 环境的一部分,而只是挂载到其中。 (更多信息请访问:https://docs.docker.com/userguide/dockervolumes/)

当您考虑这一点时,您可能想问的另一个问题是 docker 如何存储它在运行时对其磁盘所做的更改。真正值得一看的是 docker 是如何让这个工作的。容器硬盘的原始状态是镜像赋予它的。它可以写入此图像。与 docker 镜像中的内容相比,容器内部状态的变化不是写入镜像,而是由容器内部状态的变化构成。 Docker 使用了一种名为“Union Filesystem”的技术,它在 docker 镜像的初始状态之上创建了一个差异层。

这个“差异”(在下图中被称为可写容器)存储在内存中,并在您删除容器时消失。 (除非您使用命令“docker commit”,但是:我不建议这样做。新 docker 镜像的状态不会在 dockerfile 中表示,并且不能轻易地从重建中重新生成)

关于memory - Docker容器和内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702233/

有关memory - Docker容器和内存消耗的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  5. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  6. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  7. ruby-on-rails - 内存中具有相同 ID 的更多对象? - 2

    在部署在heroku上的Rails应用程序(v:3.1)中,我在内存中获得了更多具有相同ID的对象。我的heroku控制台日志:>>Project.find_all_by_id(92).size=>2>>ActiveRecord::Base.connection.execute('select*fromprojectswhereid=92').to_a.size=>1这怎么可能?可能是什么问题? 最佳答案 解决方案根据您的SQL查询,您的数据库中显然没有重复条目。也许您的类项目中的size或length方法已被覆盖。我试过find_

  8. ruby - rails 3.0.7 内存泄漏 - 2

    我的两个不同的Rails应用程序的内存有一些奇怪的问题。这两个应用程序都使用rails3.0.7。每个Controller请求分配20-30-50MB的内存。在生产模式下,这个数量减少到5-10。但这是同样的事情。这是两个应用程序使用的gem列表:gem'pg'gem'haml'gem'sass'gem'devise'gem'simple_form'gem'state_machine'gem"globalize3","0.1.0.beta"gem"easy_globalize3_accessors"gem'paperclip'gem'andand'关闭所有这些gem不会给我任何结果。我

  9. ruby - 如何强制 Ruby 释放内存给操作系统 - 2

    正如标题,我有一个处理大量数据的ruby​​程序。该程序占用了所有内存,其中调用了系统命令hostname,并且发生错误无法分配内存-主机名我试过GC.start但它不起作用。那么如何强制ruby释放未使用的内存呢?OK,这是别人的测试代码,最后报错是big_var被回收了。但是内存仍然没有释放。require"weakref"defreportputs"#{param}:\t\tMemory"+`psax-opid,rss|grep-E"^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1].to_s+'KB'endbig_var=""#big

  10. ruby - 如何在 Ruby 中从内存中 HTTP 发布流数据? - 2

    我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class

随机推荐