docker出來也有很多年了,但用到的公司其實並不是很多,docker對傳統開發是一個革命性的,幾乎顛覆了之前我們傳統的開發方法和部署模式,而大多
公司保守起見或不到萬不得已基本上不會去變更現有模式。
一:Docker出現之前我們都有哪些困惑
1. 應用依賴多,系統引數配置雜,部署起來麻煩
這句話怎麼理解? 拿真實案例說,比如你可以看一下我之前寫的一篇安裝elasticsearch的博文:https://www.cnblogs.com/huangxincheng/p/9120028.html
《1》 因elasticsearch是java寫的,所以你需要安裝java執行環境,然後屁顛屁顛的去官網下載,接下來還要配置 java_home 變數等等。
《2》 es5.0之後的啟動不能使用root賬號,你不得不新建使用者和使用者組,煩。
《3》 然後你啟動可能會遇到:os::commit_memory(0x00000000a9990000, 1449590784, 0) failed; error='Cannot allocate memory' 記憶體不足的情況。
《4》 然後就是檔案控制程式碼不足:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 的異常。
《5》 然後就是虛擬記憶體不足:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 的異常。
其實我的初衷就是想安裝下es,結果來了這麼多的坑,煩不勝煩,要解決上面這些問題,我只需要9行程式碼搞定,你信不?可以說秒級部署。
1 version: '3.0' 2 services: 3 elasticsearch: 4 image: elasticsearch:5.6.14 5 ports: 6 - 9200:9200 7 volumes: 8 - "/data/elastic/store:/usr/share/elasticsearch/data" 9 - "/data/elastic/logs:/usr/share/elasticsearch/logs"
2. 分散式部署麻煩
搭建es的時候,通常為了高可用需要部署到幾臺機器上,麻煩來了,你又需要在其他機器上做一遍同樣的事情,煩不煩呢? 如果用了docker,你就可以
把上面9行程式碼稍微改一改就可以搞定。
3. 系統垃圾多
收集日誌有了es,產生日誌的程式用netcore,要跑core程式你還要安裝core的runtime,久而久之伺服器裡面什麼語言環境以及各種環境的各種版本都有,
往往給你帶來了意想不到和防不勝防的bug,而docker的解決辦法就是將每個應用程式和它所屬的相關依賴都鎖在一個叫做容器的盒子裡面,這樣就可以起到
相互隔離,從而不汙染宿主機的系統環境。
4. 應用之間啟動順序搞蒙
如果你開發的網站有很多技術棧,在生產部署的時候肯定有一個啟動的先後順序,比如基礎服務(redis,mongodb,mysql) 要先啟動,然後才能啟動
webapplication和kibana,如果你換了順序帶來了就是一堆報錯,那有沒有一種辦法可以預先配置好各個應用的啟動順序的呢?在docker中你只需要用
depends_on命令就可以搞定啟動順序。
上面提到的四大問題,或許多多少少你都遇到過,而這些問題對docker來說都不是問題,所以學好docker還是有一定必要的。
二:Docker介紹
docker的官方網址是:https://www.docker.com/
上面這張圖給你的感覺認知是不是下面這樣:
1. docker 就是一條大鯨魚,和貨船有的一拼。
2. 大鯨魚上有很多的集裝箱,集裝箱裡裝的自然就是貨物了,感覺集裝箱就是規整,隔離貨物用的,上海有很多碼頭都有這種集裝箱,不知道有多少人
親眼見過哈,類比到docker上就是容器裡面裝了你的應用程式和相關依賴啦。
總體上來說,docker就是用類似集裝箱的概念解決我之前提到的四個問題。
三:Docker架構圖和核心概念
Docker 是一個典型的CS模式架構,和Docker deamon通訊有Docker client命令列模式,也可以自己呼叫deamon提供的api方法和其進行通訊。
1. 映象
這個裡面儲存了你的應用和需要的依賴環境,比如netcore的runtime和webapplication。
2. 容器
如果說映象是class,那容器就是new class(),真正的將你的映象跑起來了,前面也說到了它是一個隔離的盒子,它其實並不關心盒子裡面是什麼,
以及盒子當前在哪個平臺上。
3. hub
它是一個遠端的存放映象的平臺,hub上有很多已製作好的映象,比如redis,mongodb,我們只需要pull下來直接使用,或者自己製作映象。
四:docker 和 虛擬機器的區別
嚴格來說他們之間沒有可比性,因為他們的初衷本身就是不一樣的,雖然都用到了虛擬化技術,這就好比,開蘭博基尼的人和開五菱巨集光的人,
雖然都是燒汽油的,但開蘭博基尼的帥哥是為了泡妹子,耍酷,凸顯身份地位的,而開五菱巨集光的小哥是為了竟可能多的拖貨養家餬口,順帶也
能多拖點人,所以兩者初衷不一樣,沒有可比性。 docker就是為了在雲端計算時代解決優化和快速部署的問題,而虛擬機器是為了虛擬出一個物理機
來儘可能的合理使用CPU,記憶體,磁碟等其他用途。
這篇就和大家簡單的胡侃一下,後面我準備用一個core的小案例貫穿於docker系列的整個流程。