Docker筆記(一)_容器和虛擬化的觀念





在軟體應用開發過程中,可能也會有需要前端跟後端各自能有獨立開發環境。
以往若大家都在同一個Server去跑程式做驗證或上線等,都極有可能
遇到資源被瓜分、或Server掛點等需要等待修復的繁雜問題。
有時甚至可能遇到有衝突的軟體卻又有需要並存的複雜問題。
各自用不同軟體開發但要整合在一塊



會有需要用到Docker的原因就在於說想去節省剛才講到的這段辛苦的配置安裝過程。
此外,也可避免環境軟體衝突導致每次都要重灌
(因為作業系統太髒 裝太多東西影響了軟體相容性等問題)
甚至可以把配置好的環境打包給他人共享,達到一次配置多人共用的Docker核心精神
(有點類似JAVA跨平台理念)





虛擬機 和 容器之間差異比較

Docker 是一套基於Linux系統發展出來的新時代虛擬容器技術
以往要在一台電腦上去跑其他OS的話,通常會需要安裝VirtualBox、VMware等軟體緊接著要自己去下載並安裝不OS(Guest OS)的映像檔案配置RAM、硬碟空間。
(備註:常見的VirtualBox、VMware就是Hypervisor當中的Type2種類)

事實上不管是docker或VM在廣義的層面定義都算是容器,或說都是一種虛擬技術。

VMs(Virtual Machines)
  1. 像是我們耳熟能詳的VMware Workstation,VirtualBox
  2. 虛擬化是用來模擬虛擬硬體建立一個沙盒環境(sandbox)
  3. 運作單位是以一個VM產生實體為單位,較站硬碟空間容量和資源。

Containers
  1. 其實不只有docker,可能還有containerd,podman其他容器工具喔
  2. 聚焦重點在於將程式碼、library和執行環境配置打包可執行的沙盒環境
  3. 沒有需要去虛擬化硬碟,因此效率優於VM的虛擬化。
  4. 可大量去複製輕量級的映象檔
  5. 若單一個應用程式有意常發生則可將可能問題範圍限縮在單一個特定容器,具有隔離性


容器廣義的定義

容器(互不影響各自獨立的環境)
目的:使資源有效被利用、環境一致
特性:具有隔離性
成效:環境一致性、成本節省、系統可移植性高


虛擬化技術想解決的問題(早期)

(作業系統)虛擬化技術基本上想去解決
實體電腦虛擬化,使硬體資源可分享的一種技術。
這是在早期所面對的課題,如今已發展成熟。




又有分成
1.基於系統層(Ex:VirtualBox , VMware)也就是我們常講的虛擬機
是去模擬一整個硬體(CPU,Mem,I/O,Storage) ,載體是一整個OS(也有人說是作業系統的instance)
演變至後期虛擬化技術專門指VM這類技術
(狹義層面的定義就是指作業系統虛擬化技術)

2.基於應用軟體層(Ex:Docker , LXC),目前比較多人稱的容器大部分指的都是這類的。
是去模擬Process(程序),載體是Application(也有人說是執行環境的instance)
演變至後期大多用容器化技術(或稱容器虛擬化技術)來概括。


如今如果去看多篇文章或聽專家們的分享大多指的容器定義
都是多加上是去模擬Process(程序),載體是Application
使VM跟Container之間的定義被完整劃分出來
所以如果你講VM也是容器的一種就可能會被人說是錯的
而演變到現今又將「虛擬化技術」跟「容器化技術」區隔開來。
但也時常看到有人用虛擬化技術去套用跟解釋容器的觀念或是去統稱。
基本上是正常的因為人習慣用已知去理解新的未知。
這就看遇到的筆者、講者、業師、同事、主管是以狹義還廣義層面去定義。



由於虛擬機是以OS為主且是基於系統層的虛擬化
藉由Hypervisor的技術於電腦設備上提供1或至多10個的虛擬機器的相互獨立
並可運行完整作業系統的平台。
講白話一點虛擬機是需要特別去安裝第三方作業系統(又稱Guest OS)在你本機的。
而且VM中里的OS要開機都很花時間,佔用的disk size又大。

而Contaner技術(比如像Docker)
就不需要花太多時間啟動OS且也不會佔用太多disk size,
因為Container已經去幫我們簡化介於OS和App之間Environment建置的工程。
此外由於是基於應用軟體層的虛擬化,還能夠跑數百個虛擬應用程式。
但相對的電腦、主機記憶體就要夠大。
在開發專案中有不同相依性或語言版本的時候想要
他們並存就能利用Container來控管打包。


虛擬機 和 容器之間差異比較表
摘自:http://www.cc.ntu.edu.tw/chinese/epaper/0036/20160321_3611.html


容器化技術想解決的問題(現今)

容器(虛擬)化技術主要想處理軟體系統的環境建置
相較於早期作業系統虛擬化課題又是新的課題也是目前的趨勢
與其為每一個軟體系統建置執行環境,不如讓整個軟體系統的執行環境是
可以像貨櫃一樣可搬遷與重複利用的。








這種容器技術其實早在很久之前就有了
2008年那時的LXC (LinuX Container),直至2013 Docker才問世。
起初的Docker就是去Call一堆LXC來執行,了無新意。

直到後來發展到第0.9版才終於跨出一大步, 解開LXC是docker唯一且預設的執行環境的束縛。
Docker drops LXC as default execution environment



導入base image的概念之外還多加入如下的isolation tools
DOpenVZ
systemd-nspawn
libvirt-lxc
libvirt-sandbox
qemu/kvm
BSD Jails
Solaris Zones
chroot



結論:
不管是容器化技術或是虛擬化技術都是為了
解決特定情境問題的產物,沒有誰取代誰誰比較新推出比較潮誰就落伍的事。
主要還是看實際應用環境遇到的場景去運用。
















Reference:
Docker Documentation(官網)
https://docs.docker.com/engine/docker-overview/

淺談輕量化的虛擬技術 - Docker容器
http://www.cc.ntu.edu.tw/chinese/epaper/0036/20160321_3611.html

初探Docker - Docker 跟 LXC 以及一般Hypervisor有何差別?
https://lab.howie.tw/2014/08/docker-docker-lxc-hypervisor.html

為什麼要使用容器?
https://rickhw.github.io/2020/02/08/Container/Why-Container/#

Docker 基礎介紹與實戰
https://www.slideshare.net/appleboy/docker-61214768

前端工程師一定要知道的 Docker 虛擬化容器技巧
https://www.slideshare.net/freezejonny/docker-63701917

虚拟机的各种形态
http://weinan.io/2018/10/20/vm.html


認識那條鯨魚 Docker 初探
https://www.slideshare.net/ssuserb43784/docker-56061455


Docker Registry
http://soft.dog/2016/01/22/docker-registry/

Docker - Docker for Windows 10 入門篇
https://skychang.github.io/2017/01/06/Docker-Docker_for_Windows_10_First/


Docker 基礎教學與介紹 101
https://medium.com/unorthodox-paranoid/docker-tutorial-101-c3808b899ac6













留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header