docker出來也有不少年了,但用到的公司其實並非不少,docker對傳統開發是一個革命性的,幾乎顛覆了以前咱們傳統的開發方法和部署模式,而大多html
公司保守起見或不到萬不得已基本上不會去變動現有模式。java
一:Docker出現以前咱們都有哪些困惑mysql
1. 應用依賴多,系統參數配置雜,部署起來麻煩web
這句話怎麼理解? 拿真實案例說,好比你能夠看一下我以前寫的一篇安裝elasticsearch的博文:http://www.javashuo.com/article/p-rdvrhtqb-bc.htmlredis
《1》 因elasticsearch是java寫的,因此你須要安裝java運行環境,而後屁顛屁顛的去官網下載,接下來還要配置 java_home 變量等等。sql
《2》 es5.0以後的啓動不能使用root帳號,你不得不新建用戶和用戶組,煩。mongodb
《3》 而後你啓動可能會遇到:os::commit_memory(0x00000000a9990000, 1449590784, 0) failed; error='Cannot allocate memory' 內存不足的狀況。docker
《4》 而後就是文件句柄不足:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 的異常。api
《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系列的整個流程。