一千萬個為什麽

搜索

如何將生產Linux服務器轉換為docker Image或容器?



我有一個包含大量軟件和依賴項的生產Ubuntu,我想將VPS“克隆”到Docker鏡像中,以便能夠復制相同的環境並將它們分發到不同的服務器中。

這有可能沒有任何黑客攻擊嗎? 如果是的話,可以采取哪些重要措施?

轉載註明原文: 如何將生產Linux服務器轉換為docker Image或容器?

一共有 3 個回答:

Docker的全部原因是不需要整個操作系統。如果您需要整個操作系統,只需獲取VM並克隆並分發即可。

這可能沒有任何黑客攻擊嗎?

對的,這是可能的。雖然Docker經常用於面向微服務的圖像(即每個圖像只有一個服務),但是沒有什麽能阻止你通過構建一個大圖像並在內部運行任意多個進程來將單片舊應用程序轉換為Docker。

雖然Docker鏡像確實不是獨立的VM,但它仍然包含等效VM包含的所有 - 不包括內核。即,所有OS庫(libc,其他所有......)都在那裏。

如果是,可以采取哪些重要措施?

Dockerfile只是普通舊shell腳本的一個時髦版本,您通常可以使用它來為您的軟件配置其所有依賴項。也就是說,你鏈接了許多在構建過程中執行的命令,最後文件系統中的任何內容都被打包成一個圖像。

所以一般的路線是:

  • 選擇基本圖像。根據您的需求和安全要求,您可以從Dockerhub中選擇您喜歡的發行版。首先,您可以選擇任何Debian,Ubuntu或您喜歡和習慣的任何發行版。有關進一步的考慮,請參閱下文。
  • 那些基本圖像通常非常小。因此,您的下一步是使用 RUN apt install ... (或您的基本映像使用的任何包管理器)來添加您喜歡的任何標準包。
  • 最後,你必須以某種方式安裝自己的軟件。如果你按照通常的方法,你可以在Dockerfile旁邊的主機端目錄中準備你需要的任何二進制文件和其他文件,然後 ADD
  • 最後一步是(可選)創建 ENTRYPOINT ,即在啟動圖像時運行的命令,以及 EXPOSE 路由信息,以非root USER 運行或設置 ENV 熨燙變量。

這些是大線。如果你只是天真地做,你將得到一個巨大的圖像(千兆字節),並在每次重建時創建一個新的巨大圖像,這可能會造成嚴重的問題。接下來的步驟是:

  • 將基本圖像切換為較小的圖像。 alpine 很好。
  • 對於每個 RUN 調用,請確保之後沒有剩余的臨時/不需要的文件。例如, apt install 會在/var 中留下大量緩存垃圾(對於其他包管理器也是如此)。由於Docker使用洋蔥式分層文件系統的方式,你必須在相同的 RUN 命令中擺脫垃圾,你不能在一秒鐘內清理<�代碼> RUN </代碼>。如果你谷歌,你會發現很多例子。
  • 您可能已經使用軟件包管理器提取了太多軟件包,請修復此問題。
  • 要安裝自己的軟件,同樣適用。避免使用您不再需要的臨時 .tar 檔案。

這些步驟應該會顯著減少您的圖像大小。根據您的實際情況,500'的MB是避免在此階段過度優化的良好目標。

最後一步是優化一切:

  • 通過適當地排序Dockerfile中的行,確保每次都不必重建每個中間圖像。如果在前幾個圖像層中發生“大”,如果這些圖像層很少變化,並且可以被許多最終圖像重復使用,則可以使用大圖像。
  • 對於要重復使用的中間圖像,它必須與另一個圖像按位相同。因此,請務必盡可能地修復所有可變信息(如版本號等)。
  • 顯然,如果你掌握了所有這些,並讓你的復雜的,多部分的應用程序在一個Docker鏡像中運行,那麽就該把它拆分成多個圖像(沖洗,重復)。通過TCP/IP進行通信的任何內容都應該是一個很容易的選擇。

我認為@AnoE答案是正確的,只要回答OP提出的問題並提供一些好的提示。

我也覺得@Tensibai留下的評論也非常重要。

您不應該因為容器不是輕量級VM而不是   應該只在一個內部運行多個軟件。 -Tensibai

^雖然並非總是如此。

我對OP的建議是花時間將不同的應用程序和依賴項分解為單獨的docker容器。這將是“適當”的方式。從長遠來看,這將為您提供更靈活的東西。