win10 + python3 + 安裝rosbag & cv_bridge & sensor_msgs+解析bag檔案生成pcd和圖片
“馱著集裝箱的鯨魚”
0x00 是什麼
1、為什麼會有docker出現?
思考一下,任何事物的產生,是為了解決一個痛點。就像我們之前沒有微信和支付寶,照樣活得好好的,照樣能交流,但是他們解決了什麼?同理,Docker出現前和出現後,是什麼樣子的?
假設你正在開發一個專案,使用的是一臺筆記本而且你的開發環境具有特定的配置。其他開發人員身處的環境配置也各不相同。甚至還會有特定的配置檔案,此外,公司還具有自己的一套標準化和生產環境,也具有自身的配置和一系列依賴檔案。這就導致了,開發人員跑得好好的,運維或者售前拿到後,執行不起來。
那麼如何確保應用能夠在各個環境中執行和通過質量檢測?並且在部署過程中不出現令人頭疼的版本、配置問題,也無需重新編寫程式碼和進行故障修復?
答案就是使用容器。Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案——系統平滑移植,容器虛擬化技術。
環境配置相當麻煩,換一臺機器,就要重來一次,費時費力。很多人想到,能不能從根本上解決問題?軟體可以帶環境安裝?也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用Docker可以消除協作編碼時“在我的機器上可以正常工作”的問題。
Before
總結,三個問題會導致公司內耗嚴重
1、如何解決不同環境,不同標準,不同版本與不同配置檔案之間的差異?
2、如何解決多臺叢集機器安裝複雜效率低的問題?
3、如何解決機器擴容、縮容秒級別的問題?
傳統上認為,軟體編碼開發/測試結束後,所產出的成果即是程式或是能夠編譯執行的二進位制位元組碼等(java為例)。而為了讓這些程式可以順利執行,開發團隊也得準備完整的部署檔案,讓運維團隊得以部署應用程式,開發需要清除地告訴運維部署團隊,用的全部配置檔案+所有軟體環境。
Docker的出現,使得Docker得以打破過去[程式即應用]的觀念。透過映象(images)將作業系統核心除外,運作應用程式所需要的系統環境,由下而上打包,達到應用程式跨平臺之間的無縫接軌運作。
所以我能不能將開發測試好的各種物件,打個包,直接送過去?
說白了,我們有Docker之前,每次都是搬家,一定會產生問題,一定會產生物件損耗。有了Docker之後,我直接搬整棟樓過去,規定限制死了運輸過程。Docker起的就是這麼個作用。
2、Docker理念
有了Docker,開發也要逐漸有了運維的思維。之前,開發直接給運維程式碼就不管了,現在,可以直接給運維,讓他一鍵部署,一氣呵成。
結論:一次映象,處處執行,從搬家到搬樓。(總分總,三板斧)
那麼多人學開發、滲透,都是不同的系統和品牌,我們都用vmware workstation來保證執行的是同一個虛擬機器,保證了環境遷移的一致。
Docker更狠,把它發揚光大。它將所有開發的檔案、配置、依賴檔案等等,都歸一規劃成一個映象,這就是一次映象,處處執行,從搬家到搬樓。
那麼多個Docker效果都是一樣的,接著奏樂,接著舞。全場動作跟我整齊劃一!
3、Docker
Docker是基於Go語言實現的雲開源專案。
Docker的主要目標是Build, Ship and Run Any App, Anywhere
,也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,使使用者的APP(可以是一個WEB應用或者資料庫應用等等)及其執行環境能夠做到“一次映象,處處執行”。避免版本缺失,環境不同等開發錯誤問題,完整部署上線。
Linux容器技術的出現就解決了這樣一個問題,而Docker就是在它的基礎上發展過來的。將應用打成映象,通過映象成為執行在Docker容器上面的例項,而Docker容器在任何作業系統上都是一致的,這就實現了跨平臺、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
總結
解決了執行環境和配置問題的軟體容器,方便做持續整合並有助於整體釋出的容器虛擬化技術。
0x01 容器與虛擬機器的比較
這是一道經典的面試題。
1、容器發展簡史
2、傳統虛擬機器技術
這麼一套確實可以解決不同環境安裝的方案,但是痛點是什麼??
- 資源佔用多,動不動就新建一個硬碟啥的
- 冗餘步驟多,有些步驟根本就不需要,但是還是得裝
- 啟動慢,安裝一臺虛擬機器沒個幾分鐘幾乎是安裝不上的
那麼怎麼優化呢?
就拿CVE復現來說吧,假設一個CVE裝一臺機器,3個就是3臺,我能不能直接裝一臺機器上啊?而且我僅僅需要個LAMP環境就行,別的什麼桌面、聲音,那麼多的硬體我都不需要行不行?這就是Docker
只用最小巧的Linux核心來支撐我的軟體,這樣的話,步子比較輕,速度比較快。
3、容器技術與Docker技術
由於前面虛擬機器存在某些缺點,Linux發展出了另一種虛擬化技術:
Linux容器(Linux Containers,縮寫為LXC)
Linux容器是與系統其他部分隔離開的一系列程序,從另一個映象執行,並由該映象提供支援程序所需的全部檔案。容器提供的映象包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和一致性。
Linux容器不是模擬一個完整的作業系統而是對程序進行隔離。有了容器,就可以將軟體執行所需的所有資源打包到一個隔離的容器中。容器與虛擬機器不同,不需要捆綁一整套作業系統,只需要軟體工作所需的庫資源和設定。系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一地執行。
Docker容器是在作業系統層面上實現虛擬化,直接複用本地主機的作業系統,而傳統虛擬機器則是在硬體層面實現虛擬化。與傳統的虛擬機器相比,Docker優勢體現為啟動速度快、佔用體積小。這也就是為什麼說Docker是個”揹著集裝箱的鯨魚”。
比較Docker和傳統虛擬化方式的不同:
- 傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程序層,很麻煩哦
- 容器內的應用程序直接運行於宿主的核心(複用技術),容器內沒有自己的核心且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
- 每個容器(集裝箱)之間互相隔離,每個容器有自己的檔案系統,容器之間程序不會相互影響,能區分計算資源。
Docker只啟動僅需要的即可,虛擬機器是完整系統再啟動應用。
0x02 Docker能做什麼呢?
有了之前的鋪墊,對Docker的理解,現在逐漸弱化了開發與運維的分界。以前有一個詞叫做全棧工程師。前端後端都要懂。但是現在呢?前端有H5什麼的,後端有資料庫,大資料,C++伺服器什麼的,太多了,根本學不過來。也就逐漸迴歸到了自己的職位上了。就跟村長臨時讓大家集合,結果剛叫出來,大家就各回各家了。
1、技術職級變化
coder(just copy and paste)——programmer(懂了一些規範以及行內標準等)——software engineer(developers)——有了Docker後,DevOps engineer(開發運維混合型工程師)
希望自己能夠盯緊技術和本事的發展,不要整天只會說 格子衫啊,掉頭髮,光頭了,找不到女朋友了,沒有辦法在生活中面向物件了,全他媽扯淡啊。我身邊幹IT的混的都挺好的,黑不過他們。專注於自己好吧。
2、開發/運維(DevOps)
更快速的應用交付和部署
傳統的應用開發完成後,需要提供一堆安裝程式和配置說明文件,運維人員安裝部署後需要根據配置文件進行繁雜的配置才能正常執行。Docker化之後只需要交付少量容器映象檔案,在正式生產環境載入映象並執行即可,應用安裝配置在映象裡已經內建好,大大節省部署和測試驗證時間。
更便捷的升級和擴縮容
隨著微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應用的升級將變得非常容易。當現有的容器不足以支撐業務處理時,可通過映象執行新的容器進行快速擴容,使應用系統的擴容從原先的小時級別變成分鐘級別甚至妙級別。
更簡單的系統運維
應用容器化執行後,生產環境執行的應用可與開發、測試環境的應用高度一致,容器會將應用程式相關的環境和狀態完全封裝起來,不會因為底層基礎架構和作業系統的不一致性給應用帶來影響,產生新的BUG。當出現程式異常時,也可以通過測試環境的相同容器進行快速定位和修復。
更高效的計算資源利用
Docker是核心級虛擬化,我只需要核心的支援,不要不必要的東西。其不像傳統的虛擬化技術一樣需要額外的Hypervisor
支援,所以在一臺物理機上可以執行很多個容器例項,可大大提升物理伺服器的CPU和記憶體的利用率。
3、Docker的應用場景
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是,集裝箱運輸貨物,而Docker運輸軟體。
4、哪些企業在用?
新浪
美團
蘑菇街
0x03 去哪兒下
https://www.docker.com/ docker官網
https://hub.docker.com/ 安裝docker映象的倉庫