使用 Dockerfile 構建生產環境映象

2023-07-22 06:00:34

傳統部署的坑:

1202 年了,如果你連 Docker 都不知道是什麼,我建議買一本書看看——或者谷歌一下,部落格已經寫爛了。

為什麼有這篇文章,是因為我在真正做容器化改造的時候,發現公司生產環境存在大量的坑:

  • 傳統虛擬機器器部署,基本依賴克隆或者手工編譯。由於人力原因,SRE 歷來單傳,編譯出來的 PHP、擴充套件等二進位制版本不一致;
  • 專案開發人員痛苦不堪——他沒辦法模擬出接近於線上一致的環境(碰不到摸不著,各種擴充套件版本都要自己去編譯);
  • 新人入職都會靈魂拷問你一句——我怎麼把線上的程式碼跑起來?
  • ……

用什麼 Linux 發行版?

Ubuntu 應該是全球使用者量最多的發行版了,嗯我說的是桌面這一塊,折騰過的人都知道,出問題的時候開機會有 「檢測到系統錯誤」 的提示,另外,網上提供的設定或者各種疑難雜症,改了不一定能生效,而且你還不確定改了會不會影響到別的,反正我是不敢用的哈哈(Manjaro 真香)。

CentOS 應該是大家最熟悉的,也是我見過最多應用在生產環境中的。它給我的感覺就是非常穩定,並且網上的資料是一搜尋就展現在你面前,而你對著資料改設定,過載就生效,不會搞出什麼問題。

公司的生產環境清一色 CentOS 6,但 CentOS 6 已經被官方棄用,不再提供 yum 映象源,這也意味著很多包你都安裝不了,所以你只能升級到 CentOS 7。

問題來了,我能升級嗎?

這不得不說到之前線上出現過一個故障:

公司有一臺釋出構建機器,用來做程式碼部署,機器上安裝了 NodeJS、Go 編譯器等,有一天前端的同事說向 SRE 同學提了一個需求:

升級 NodeJS 到 v10 版本,因為以前的 v6 版本太舊了,SRE 同學也沒多想,發現 CentOS 6 機器要升級 glibc 才行,於是運維的同事就升級 glibc 之後,升級了 NodeJS;

過了段時間有人部署某服務,該服務使用了 結巴分詞 ,部署完發現線上掛了……

嗯,線上環境的 glibc 版本比較低,編譯機的 glibc 版本高,部署過去不相容直接就是啟動不了,還好當時回滾的夠快