一文读懂Docker及其对系统管理员的重要性
作者 |?Damian Perera
編譯 | 火火醬,責編 |?Carol
出品 | CSDN云計算(ID:CSDNcloud)
自從Docker在2013年初上線以來,就與程序員及系統管理員之間產生了一種愛恨交加的奇妙關系。雖然與我交談過的一些經驗豐富的的開發(fā)人員都非常不喜歡容器化(稍后會詳細介紹),但是為什么許多大公司,包括eBay、Twitter、Spotify和Lyft在內,都在他們的生產環(huán)境中采用了Docker呢?
Docker究竟是做什么的呢?
不知道您是否曾使用過VMware、VirtualBox、Parallels或任何其他的虛擬化軟件呢?Docker和這些軟件差不多(盡管沒有花哨的GUI),它能創(chuàng)建出帶有操作系統的虛擬機,并且可以綁定選定的web應用程序及其依賴項。
虛擬機的速度不是很慢嗎?
虛擬化推動了云計算革命,我喜歡把Docker稱為虛擬化的最后一步,因為實際上,它執(zhí)行著的正是您開發(fā)出來的業(yè)務邏輯。
但是,通常意義上真正的虛擬機的速度是很慢的,而且,并不能將Docker所做的工作完全歸類于虛擬化。
相反,Docker通過使用runc(由Open Containers Initiative提供維護)在內核(對不同進程命名空間和設備命名空間提供的)支持的基礎上建立額外的抽象層,從而能夠共享很多主機系統的資源。因為在Docker容器和主機內核之間沒有額外的虛擬化層,所以容器能夠提供與主機相同的性能。
runc:
https://github.com/opencontainers/runc
Open Containers Initiative:
https://www.opencontainers.org/
完全虛擬化的系統會為其分配自己的資源,并且進行最小化程度的共享(如果需要的話),這會導致更多資源之間的隔離,但系統也會變得需要更多資源——然而,通過Docker,資源的隔離會減少,同時容器也會變得輕量級(需要的資源更少)。
如果您要運行一個需要在保證資源的基礎上完全隔離的系統(例如,游戲服務器),那么或許該選擇基于KVM或OpenVZ的虛擬機。但是,如果您只是想要將各個進程隔離開來,將其運行在一個大小適中的主機上,同時又不致力于把自己搞破產,那么Docker將會是您的不二選擇。
如果您想了解更多關于運行容器化系統的性能方面的信息,可以看看這一篇來自IBM的研究論文:《虛擬機和Linux容器的最新性能比較(An Updated Performance Comparison of Virtual Machines and Linux Containers)》,該論文很好地比較了虛擬機和容器。
論文鏈接:
http://domino.research.ibm.com/library/cyberdig.nsf/papers/0929052195DD819C85257D2300681E7B/$File/rc25482.pdf
不能直接將應用程序上傳到云服務器上嗎?
如果不在意基礎設施、環(huán)境一致性、可擴展性或可用性這類東西的話,是可以這樣做的。
設想一下:您管理著12個Java服務,并將它們全部部署到了運行著Ubuntu和Java 8的獨立服務器上,以用于開發(fā)、質量保證、預發(fā)布及生產環(huán)境。即使您應用程序的使用程度并不高,也需要管理至少48個服務器(12個服務*4個環(huán)境)。
假設現在需要您的團隊帶頭更改策略,將運行環(huán)境升級到Java 11。那么您需要登錄并手動更新48個服務器。即使是使用Chef或Puppet這類的工具,工作量也非常大。
有什么更簡便的解決方案呢?
Docker能夠幫助您創(chuàng)建所需操作系統的快照,并只在其上安裝所需的依賴項。這樣一來,您可以管理或省去所有的“臃腫軟件”。您可以最小化安裝Linux(我推薦Alpine Linux,但在本文中,我將繼續(xù)使用Ubuntu),并且只在上面安裝Java 8。
在需要更新時,只需要在您Java映像的Dockerfile文件中說明使用Java 11,構建并推送到容器存儲庫(如Docker Hub或Amazon ECR)中。此后,您只需修改您的應用程序容器基礎鏡像標簽,引用新的快照并重新部署即可。
以下示例羅列了在Ubuntu 18.04最小操作系統之上構建Docker容器的要點:
我將使用標簽oracle-jdk-ubuntu-18.04:1.8.0_191來構建此映像并將其推送至Docker Hub賬戶damian, 然后用它來為我的服務構建另一個容器:
# Instructs Docker to build this container on top of this snapshotFROM damian/oracle-jdk-ubuntu-18.04:1.8.0_191# Copys the application JAR to the containerCOPY build/hello-world.jar hello-world.jar# Executes this command when the container startsCMD java -jar hello-world.jar現在,如果我需要將服務更新到Java 11,那么需要做的只是:發(fā)布安裝了兼容JRE的Java快照新版本,在服務容器中的FROM聲明中更新標簽,令容器使用新的基礎映像。完成!接下來,您的所有服務都會隨著Ubuntu和Java的更新而更新。
但是這對我的開發(fā)來說有什么意義呢?
這是個好問題。
我最近開始在單元測試中使用Docker。假設您有成千上萬的測試用例(如果真是這樣的話,相信我,我對您的痛苦感同身受),這些用例都連接到一個數據庫,其中每個測試類都需要一個數據庫的新副本,并且每個測試用例都將對數據執(zhí)行CRUD操作。
通常來講,在每次測試之后,都需要使用類似Redgate的Flyway之類的工具來重置數據庫,但是這就意味著您的測試必須按順序運行,該過程會花費很多時間(我見過要因此而花20分鐘才能完成的單元測試套件)。
在Docker中,您可以輕松地創(chuàng)建您數據庫的映像(我建議使用TestContainers),在容器中為每個測試類運行一個數據庫實例,然后并行運行整個測試套件。因為所有測試類都是并行運行的,并且都鏈接單獨的數據庫,所以它們都可以同時在同一主機上運行并且快速完成(假設您的CPU能扛住的話)。
我在用Golang編碼時也會使用Docker。與其直接在開發(fā)機器上安裝GO,我更喜歡采用類似于Konstantin Darutkin的方法:通過安裝Go和依賴項來維護Dockerfile文件,可以將其配置為在對源文件進行修改時實時重新加載項目。
這樣一來,我已經有了自己的項目和Dockerfile版本控制文件,如果我要修改自己的開發(fā)機器或將其格式化,我只需要重新安裝Docker,從上次停留的地方繼續(xù)就可以了。
總結
如果您經營著一家初創(chuàng)公司,還沒有決定要用什么來支撐您的新技術棧,又或者您是一家成熟的服務提供商,正在考慮將您的產品和非產品環(huán)境容器化,但又不敢在“未經測試的”海域上航行,那么可以考慮以下的幾個問題。
1、一致性
您可能有整個行業(yè)中最棒的一群開發(fā)人員,但是在所有這些不同的操作系統中,每個人都有自己喜歡的設置方式。如果您已經用Docker配置了完善的本地環(huán)境,那么新開發(fā)人員只需安裝,用該應用程序生成一個容器,然后啟動即可。
2、調試
您可以輕松地隔離并消除整個團隊環(huán)境中的問題,而無需了解團隊成員計算機的設置方式。一個很好的應用實例是:當我們必須通過從ntpd遷移到Chrony來修復服務器上的一些時間同步問題時,我們只需要更新基礎映像(不需要通知開發(fā)團隊)。
3、自動化
目前,包括Jenkins、CircleCI、TravisCI等在內的大部分CI/CD工具都被完全集成到了Docker中,因此您可以輕松地將從一個環(huán)境應用到另一個環(huán)境。
4、云端支持
要想了解您的服務器和DataDog上運行著什么,就需要持續(xù)監(jiān)視和控制容器。一家云監(jiān)視公司曾說道:
容器的短壽命和密度增加對基礎設施的監(jiān)控具有重要意義。它們代表需要單獨監(jiān)視的事物數量的數量級增加。
自我管理的云編排工具(例如,Docker Swarm和Kubernetes)以及由供應商管理的工具(例如,AWS的Elastic Container Service和Google Kubernetes Engine)提供了針對這一問題的解決方案,這些工具可以監(jiān)視和管理容器集群和調度。
隨著Docker的廣泛使用以及與AWS和Google Cloud等云服務提供商的緊密集成,Docker正在迅速成為處理您新應用程序或現有應用程序的明智之選。
原文:https://hackernoon.com/an-introduction-to-docker-and-how-it-is-important-for-sysadmins-9ai83awo
本文為CSDN 云計算翻譯,未經授權請勿轉載。
技術戰(zhàn)“疫”,賈揚清、李飛飛要給程序員直播講AI技術!
2月18日、2月20日,阿里云CIO學院攻“疫”技術課程正式開啟。您將獲得與達摩院數據庫首席科學家、阿里巴巴集團副總裁、ACM?杰出科學家李飛飛,Caffe之父、ONNX創(chuàng)始人、阿里巴巴集團副總裁賈揚清,阿里巴巴集團副總裁、阿里?CIO?學院院長胡臣杰等頂級技術專家直播互動的機會。
推薦閱讀:別再用那些已經淘汰的技術了!2020 年 9 大頂級 Java 框架出爐!! Linux系統常用指令總結 讀源碼,對開發(fā)者重要嗎? 鏈游真的能賺錢嗎?我肝了3款鏈游終于找到了答案 再見 NoSQL! 超贊的PyTorch資源大列表,GitHub標星9k+,中文版也上線了 真香,朕在看了!點擊“閱讀原文”,即可報名總結
以上是生活随笔為你收集整理的一文读懂Docker及其对系统管理员的重要性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直播连麦贾扬清,谈谈他所理解的四大 AI
- 下一篇: Redis 学习之一招击穿自己的系统,附