使用Docker容器的十大误区
使用Docker容器的十大誤區(qū)
對于用戶來說,可能一開始在不了解的情況下會對容器報以拒絕的態(tài)度,但是在嘗到容器的甜頭、體驗到它的強大性能之后,相信大家最終是無法抵擋其魅力的。容器技術(shù)能夠解決IT業(yè)目前面臨的很多問題,而且優(yōu)勢也很明顯,比如說:
1、容器具有不可變的特性。
容器將操作系統(tǒng)、程序庫、配置文件、路徑和應(yīng)用程序打包在一起運行,也就是說,我們在做QA測試的時候整個鏡像是什么樣,投入到產(chǎn)品環(huán)境以后就是什么樣,其性能不會有任何差距。
2、容器都非常輕量。
單個容器的內(nèi)存占用很小,不像其他進程動輒占用上萬MB的內(nèi)存空間,容器只會給主進程分配內(nèi)存,可以有效降低系統(tǒng)開銷。
3、容器的速度更快。
虛擬機的啟動時間一般都在分鐘級,容器的啟動速度可以達到秒級,啟動容器就跟啟動linux進程一樣快。
雖然容器的好處這么多,但是有很多用戶還不了解,還認(rèn)為容器跟一般的虛擬機沒什么差別。實際上,容器是可銷毀的,這是容器跟虛擬機之間最大的差別。容器的存在周期很短,只要用戶使用完畢,就可以立即銷毀容器,所以用“朝生暮死”來形容也不算過分。
在對容器進行使用和維護時,我們應(yīng)該充分利用容器的這個特性,不要再把容器當(dāng)成一般的虛擬機來看待,不然就真的大材小用了。在實際使用過程中,為了最大限度地發(fā)揮容器的優(yōu)勢,有些錯誤還是少犯為妙。我總結(jié)出了下面幾個要點供大家參考,在跑容器的時候大家最好還是盡量遵照這幾條原則:
容器隨時都可以停止、銷毀或遷移,比方說,一個容器里運行的應(yīng)用版本是1.0,我們分分鐘就可以把這個應(yīng)用升級到1.1,同時還不會對數(shù)據(jù)造成任何影響。所以如果用戶想要存數(shù)據(jù)的話,最好是用數(shù)據(jù)卷來存儲。不過在用卷存數(shù)據(jù)的時候大家還是要注意一點,如果有兩個容器共用一個數(shù)據(jù)卷,都往里面寫數(shù)據(jù)的話,是有可能造成程序崩潰的。我們在設(shè)計應(yīng)用程序的時候應(yīng)該考慮到這一點,為保萬無一失,應(yīng)用程序應(yīng)該具備特定的機制,以確保在往共享數(shù)據(jù)存儲區(qū)寫入數(shù)據(jù)的時候不會出錯。
在部分用戶看來,容器跟虛擬機沒什么兩樣,所以有些人往往會把應(yīng)用程序部署到當(dāng)前運行的若干個容器中。這種做法在開發(fā)階段沒有太大的問題,因為做開發(fā)的時候我們會很頻繁地進行部署和調(diào)試,但是到了持續(xù)交付(CD)階段,下一步就是QA測試和正式投產(chǎn)了,這種做法就不太適合了。在這一階段,我們應(yīng)該充分考慮到容器的不可變特性,最好是將應(yīng)用程序打包到一個鏡像中交付。
鏡像越大,就越難發(fā)布。鏡像中只包含必要的文件和library就可以了,能讓應(yīng)用或者進程運行起來就行。千萬不要在鏡像中安裝些沒必要的東西,在構(gòu)建鏡像的時候要避免使用yum這種update命令,免得系統(tǒng)自動下載很多不相干的文件到新鏡像層中。
大家都知道,Docker的文件系統(tǒng)是分層的,在建鏡像的時候我們應(yīng)該這么建,將操作系統(tǒng)單獨建一層,作為基礎(chǔ)鏡像,然后用戶名定義文件、運行時安裝環(huán)境、配置文件都要分別建一層鏡像,最后才是應(yīng)用鏡像層。這么做的話,我們以后重建、管理以及發(fā)布鏡像的時候就要輕省得多了。
換句話說就是創(chuàng)建鏡像的時候不要用“docker commit”命令來創(chuàng)建。用這種辦法建鏡像是完全不可取的,因為這種辦法是不能重復(fù)的。我們在建鏡像的時候應(yīng)該從Dockerfile創(chuàng)建,或者用其他S2I(從源文件構(gòu)建鏡像)的方式來創(chuàng)建,這樣鏡像才具有可再生性,而且如果我們把鏡像存在git之類提供版本控制能的系統(tǒng)里的話,還可以對Dockerfile的改動進行跟蹤。
latest其實就相當(dāng)于Maven里頭的“快照”。因為容器的文件系統(tǒng)是分層的,我們最好是給鏡像多打幾個tag。如果只有l(wèi)atest的話,可能過段時間我們再來運行應(yīng)用程序的時候就發(fā)現(xiàn)程序運行不起來了,因為應(yīng)用的父層(就是Dockerfile里面的跟在FROM命令后面的那一層)被更新的版本覆蓋了,而新版本又不能向下兼容,還有可能就是從build cache里面取鏡像的時候取到了錯的“l(fā)atest”鏡像。在產(chǎn)品環(huán)境中部署容器的時候也要避免使用latest,不然容易造成無法跟蹤記錄鏡像版本的問題。
容器本來就是用來運行單個應(yīng)用的(比如http daemon,應(yīng)用服務(wù)器,數(shù)據(jù)庫等等),如果我們非要在一個容器里跑幾個應(yīng)用,那么在管理每個應(yīng)用進程、存取日志、升級應(yīng)用的時候就會很麻煩。
8)不要把認(rèn)證口令存在鏡像中,用環(huán)境變量比較好。
如果我們把用戶名/密碼值對存在鏡像里的話,就只有采用硬編碼的方式來挨個處理,估計這種麻煩事沒人愿意去干。所以我們最好是用環(huán)境變量的方從容器外部獲取此類信息。
Docker容器默認(rèn)是以root權(quán)限運行的。不過隨著技術(shù)的成熟,docker也會提供安全性更高的默認(rèn)操作選項。在現(xiàn)有技術(shù)條件下,以root權(quán)限運行會對其他應(yīng)用帶來安全隱患,而且在有些運行環(huán)境下root權(quán)限是取不到的,所以我們在跑容器的時候應(yīng)該用USER命令來指定非root權(quán)限的用戶。
每個容器都有一個內(nèi)部IP,這個IP不是固定的,我們啟動容器或者停止容器的時候IP都會變。如果我們要讓應(yīng)用或者微服務(wù)模塊在容器之間進行通信的話,正確的做法是通過設(shè)置環(huán)境變量來傳遞主機名和端口號。
總結(jié)
以上是生活随笔為你收集整理的使用Docker容器的十大误区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Docker】安装与常用命令
- 下一篇: 【人工智能导论】遗传算法求解TSP问题(