觀點 | 容器內應該運行什么?

jopen 9年前發布 | 5K 次閱讀 容器

本文通過從目前人們如何使用容器的角度出發,分析探討了人們到底應該在容器中運行什么。

今晚,我的一個朋友問我對單VS多進程的容器怎么看。我很高興他這樣問。在容器界這是一個熱門的話題,但我沒有過多的回答過。直到上個月,我不知道對此事發展的意見是否有了充分的理解。

有關多進程最好的文章是 http://phusion.github.io/baseimage-docker/。解釋一下,當你在容器內運行單進程的軟件其實它是運行在分裂的上下文上。

你剛剛建立了一個容器,它包含了最小的操作系統,而且只能運行你的應用程序。但容器內的操作系統配置不正確。一個合適的Unix系統應該運行各種重要的系統服務。你的這個容器沒有運行它們而僅僅運行你的應用程序。
當 我讀到這,我最初的直覺反應是消極的。究其原因是哲學。我的容器不應該包含一個操作系統。我用容器來隔離一個服務與系統的其他進程服務,并確保它們不會白 白地創建混亂。我的想法是,我的系統中已經有一個init進程、SSHD和syslogd在運行。我想:“如果我需要的cron運行在我的容器,那我已經 完全被打亂了。”用一個容器來代替虛擬機的整個要點是不用專門地運行整個操作系統。我是按自己的使用情況來閱讀這篇文章的。

但后來我完成了這篇文章,復查之后,我不得不重新審視自己。我意識到這個是錯誤的原因。事實上復雜得多。

以下是一些有關人們會在容器中運行哪些軟件的調查:

  • 需要這些服務
  • 純粹的開箱即用(OOTB),從未考慮為容器而設計(需要這些服務)
  • 定制容器
  • 可定制,但沒有為容器而設計
  • 專門為了使用容器而編寫
  • 沒有這些依賴而設計的
  • </ul>
    這些是人們在容器內運行軟件的整個范圍。這樣做并沒有對與錯,也并不是非黑即白。重要的是該軟件是如何工作的,只要都能夠支持它、了解其效率的權衡以及了解你創建的系統中故障模式(譯注:重要的是知道如何debug)。

    有了這點想法后我的整個態度改變了。那篇文章是偉大的,因為它向人們講解了常見的Unix系統組件。也許有些人會感到沮喪,但大多數人并不了解這些工具以及它們是如何結合在一起的。他們的基本鏡像做的相當不錯。我用了幾次,但我的使用情況需要我避免使用容量大的鏡像。

    如果您想了解我是如何使用Docker……

    《Docker in Action》中,我試著用一些諸如Busybox的工具,因為我不希望人們不得不要等待著下載一整天。

    在生產環境中,我構建并使用明確、穩固以及簡約的容器。我開始使用短小的鏡像并清理掉我不需要的東西。我終止了SUID二進制。清楚我的服務(非 root)應該運行在哪個UID/GID上。知道我的容器在運行時需要什么樣的能力并盡可能地限制他們。我使用volumes來代替stdout /stderr。有時我為了提交配置使用鏡像與volumes。我選擇資源限制。我使用init進程。我用的其他的容器服務做健康監測、服務登記以及日志 轉發。我一次性提交容器到負載均衡群集節點并調整連接volume的網絡堆棧。我創建廉價的部署與DNS搜索域連接起來。

    如果我需要使用shell,我會CSSH到集群節點中運行的目標容器內。我會拉取toolbox鏡像來創造一個新的附有合適的volumes和網絡接口的容器。有任何提升的權限時,我只運行短暫的容器。

    如果你想在容器內運行一個完整的Linux操作系統,基本上你可以使用Docker來做到這一點。你也可以運行單個NASM程序并創建最小鏡像。請記住,這些都是運行在已正確配置的系統上。在適當的時候使用該系統。

    與其擔心別人讓你應該這樣做,還不如專注于你需要拿它做什么。做好這一點。如果你需要迭代并添加一些功能也是可以的。

    Docker帶來了希望以及簡化了一些Linux最難理解的工作。在你嘗試相當多的 docker run my/image命令的同時,如果你花時間研究這些選項,你可以收獲更多。這樣做,你會更深入的理解操作系統以及幫助您如何具體地使用它。

    我提起這些因為在你以不同方式使用單一VS多進程的容器會有某些特性。例如,如果你充分利用Linux的功能授權,想要給你的wirelog錄 NET_RAW能力,你不會想讓它作為面向公眾的Web應用程序來運行在同一個容器中。另一個例子是,如果你使用的AppArmor,你不會想在Web應 用程序和數據庫中都使用相同的配置文件。但如果是在同一容器中,那么在該容器的配置文件也會應用該容器內的兩個應用程序。更糟的是如果你使用 SELinux,你很難使這兩個應用程序具有相同標簽。

    我是個現實主義者。我知道有些人只是想要一個基本能工作的鏡像至于其他的一概忘掉。老實說,我認為這很好。 phusion/baseimage-docker就不錯。只是有一點要記住一定要用非root用戶來運行容器。

    我已經在起草《Docker in Action》的第6章(譯注:目前在MEAP已有 電子版)。 如果你想了解如何使用Docker來隔離軟件,你應該閱讀這一章節。它涵蓋了用戶管理、內存共享、設備訪問、資源限制、Linux的功能授權而且還涉及到 如AppArmor和SELinux等其他工具。別讓主題嚇到你。我盡我所能來融會貫通這些復雜的主題并加以“你所需要知道的”和“如何使用 Docker”之類的方式呈現給您。

     觀點 | 容器內應該運行什么?

    原文鏈接:Opinion: What Should I Run in My Containers? (翻譯:田浩浩 審校:魏小紅)

    ===========================

    譯者介紹
    田浩浩,USYD研究生,專注Docker學習研究 - < htia6761@uni.sydney.edu.au>。

    來自:http://dockone.io/article/736

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!