本文做爲Docker基礎系列第一篇文章,將詳細闡述和分析三個問題:Docker是什麼?爲何要用Docker?如何快速掌握Docker技術?java
本系列文章中Docker的用法演示是基於CentOS7進行,所以假設讀者已經掌握了初步的Linux知識,若是你對Linux最基本的經常使用命令及操做還不太熟悉,請參考我以前寫的Linux入門系列教程。linux
用簡單的一句話來概況:Docker就是一種容器虛擬化技術。git
要了解Docker爲何會出現,它解決了什麼樣的問題,那就要回顧下虛擬化技術及Docker的發展歷程。github
ps:相信你們若是安裝或使用過虛擬機VMware,或許你已經遇到過虛擬化技術的問題。正如個人Linux入門系列文章中的「linux入門系列1--環境準備及linux安裝」中的3.2.1提到,你可能會遇到「此主機至此Interl VT-x,但Interl VT-x處於禁用狀態「這個問題,若是要在VMware中安裝Linux,那就要在BIOS中開啓虛擬化支持。docker
虛擬化技術是一個通用的概念,不一樣領域能夠有不一樣的理解。而在計算機領域中一般是指計算虛擬化或服務器虛擬化,它的核心是對資源進行抽象,以能在同一個主機上同時運行多個系統或軟件應用爲目標,從而提升服務器系統資源的利用率,下降成本,方便對應用的生命週期進行管理。數據庫
虛擬化技術分類整體上分爲2大類:基於硬件的虛擬化和基於軟件的虛擬化。編程
真正意義上基於硬件的虛擬化並很少見,而基於軟件的虛擬化從對象所在的層次,又能夠分爲應用虛擬化和平臺虛擬化。應用虛擬化通常是指經過軟件去模擬設備,而咱們一般所說的虛擬化技術大多數狀況下指的是平臺虛擬化技術。ubuntu
平臺虛擬化又能夠細分爲如下幾類:centos
虛擬機模擬完的底層硬件環境和特權指的執行過程,客戶操做系統無須進行修改。好比:VirtualBox、VMware Workstation瀏覽器
利用硬件主要是CPU來輔助支持處理敏感指令來實現徹底虛擬化的功能,客戶操做系統無須修改 。目前86體系結構上可用的硬件輔助虛擬化技術包括Intel-VT和AMD-V。 好比:VMware Workstation、Xen、KVM
只針對部分硬件資源進行虛擬化,客戶操做系統須要進行修改。
部分硬件接口以軟件的形式提供給客戶機操做系統, 客戶操做系統須要進行修改。
內核經過建立多個虛擬的操做系統實例(包括內核和庫)來隔離不一樣的進程。咱們一般所說的容器相關技術屬於此分類,而Docker則是這衆多容器技術中的一種。
若是要說Docker與虛擬化技術之間的關係,我認爲能夠歸納爲:虛擬化技術通過發展,從之前經過硬件層面來實現虛擬化的傳統方式,逐步演變爲當今流行的基於操做系統層面的容器化方式。而Docker則做爲容器化技術的佼佼者脫穎而出。
Docker是基於Go語言實現的開源容器項目,Docker項目已加入Linux基金會,並遵循Apache協議, 所有開源代碼均在https://github.com/docker項目倉庫進行維護。
正如官方網站所說,Docker的理念就是「Build Ship and Run Any App, Anywhere」,即經過對應用的封裝( Packaging )、分發( Distribution )、部署( Deployment )、運行( Runtime )生命週期進行管理,簡單說就是一次封裝 ,處處運行。
Docker目前已獲得各大主流操做系統的支持,包括Linux各大發行版、Windows、MacOS等都可以安裝使用。同時各大雲服務提供商如IBM、Amazon、Azure等雲平臺均提供對Docker的集成支持。
那麼Docker爲何會發展的如此迅速呢?
正如Docker創始人說的,Docker只是在正確的時間和正確的地點作了正確的事情,它的出現並不是偶然,它其實也是站在了前人LXC的肩膀上發展而來。LXC(Linux Containers)也就是日常說的Linux容器技術,對於LXC更多細節就很少說了,簡單說就是LXC通過長期的發展,踩了不少坑,而後被集成到了主流Linux的內容中,正是這樣才爲Docker的誕生鋪平了前期的道路。
Docker在LXC的基礎上,進一步優化了容器的使用體驗,才使得容器化技術獲得普及。好比它提供了各類容器管理工具來實現應用的分發、版本移植等,讓用戶無需關注底層操做;同時也引入分層文件系統和高效的鏡像機制,極大的下降遷移難度。早期Docker是直接基於LXC的,到0.9版本以後開發了libcon-tainer項目做爲更普遍的容器驅動實現,從而替換掉了LXC的實現,,試圖讓容器的支持再也不侷限於Linux操做系統,而是更安全、更開放、更具擴展性。
正是基於Linux平臺上的多項開源技術,Docker提供了高效、敏捷和輕量級的容器方案,並支持部署到本地環境和多種主流雲平臺。能夠說Docker首次爲應用的開發 、運行和部署提供了「 一站式」的實用解決方案。
Docker包含三大核心概念:鏡像、容器、倉庫,基礎部分功能都是圍繞他們進行展開,所以先有個簡單的印象便可。
能夠簡單理解爲一個只讀的模板或者應用程序及其環境的打包,後邊的容器就是經過它來進行建立。它相似於虛擬機鏡像,若是你有面向對象的編程經驗,也能夠把它理解爲一個實體類(Class)。
簡單理解爲一個沙盒,用來運行和隔離咱們開發的應用程序。你能夠理解爲正在運行的一個虛擬機,也能夠理解爲經過實體類Clss建立的一個對象。鏡像是靜態的,容器是動態的。
倉庫就是集成存放鏡像的地方,Docker倉庫相似於代碼倉庫,若是你有Git和Maven的使用經驗,那就很好理解了。
官方提供的倉庫爲Docker Hub,但有時候國外網速不太理想,所以國內雲廠商如阿里雲、網易雲等也提供了鏡像倉庫的本地源,固然也能夠本身搭建私有倉庫。
要搞清楚咱們爲何要用Docker,那就來先看看Docker都能幹些啥?
正如Docker的理念宣言:一次打包,到處運行。因爲Docker鏡像是將咱們開發的應用程序和他運行所需的環境一塊兒打包,它帶來的好處很是明顯,尤爲是快速部署和分發能力。
舉個簡單的例子,假設咱們以前開發了某個軟件部署在了某一臺服務器上,可是由於種種緣由,咱們但願把該軟件部署到另一臺服務器上。一般狀況下咱們須要怎麼作呢?咱們須要登陸到新的服務器上,按照以前的方法重複部署一次運行環境,而後運行觀察結果,還擔憂環境的變化帶來未知的影響。那若是是用Docker會怎麼樣呢?咱們只須要把相應的鏡像下載下來而後運行起來便可。快速且省心。
還記得前面系列文章的LNMP環境搭建嗎?「linux入門系列20--Web服務之LNMP架構實戰」,是否是感受很是麻煩呢?這個過程少說也得半小時,若是咱們換爲Docker進行部署的話,也就分分鐘就能夠搞定。後文會演示採用Docker的方式來部署LNMP,到時候會有一個很是直觀的對比,相信你必定會愛上Docker。
採用Docker能夠作到一次打包,到處運行。
因爲鏡像中已經包含了環境,所以不會存在開發人員本地開發運行沒問題,可是交給運維人員運行就有問題的狀況。同時它使得遷移、擴展和更新管理變得更加容易,極大減小了重複勞動、有效解放了運維人員。
容器化技術在性能上完勝虛擬機。
Docker容器除了運行其中的應用外,基本不消耗額外的系統資源,在保證應用性能的同時,儘可能減少系統開銷。
傳統虛擬機方式運行N個不一樣的應用就要啓用N個虛擬機,每一個虛擬機須要單獨分配獨佔的內存、磁盤等資源,而Docker只須要啓動N個容器,並將應用放進容器內便可。
它的啓動速度、性能、內存代價、遷移性等都完勝虛擬機。
微服務架構是當前軟件開發領域的熱點技術之一,若是你是開發人員或者瞭解開發技術,相信你必定聽過單體應用和微服務這二個名詞。
在軟件架構演進過程當中,曾經一個歸檔包(如war包)包含了全部應用程序的功能,好比一個Web系統咱們全部功能模塊都放在一塊兒,一般就稱爲單體應用。儘管你能夠在項目內部進行了模塊化開發,可是全部業務功能都包含在一個項目中,這樣複雜度高、部署麻煩,可靠性也差。好比只修改了其中很小一個功能也得從新部署;其中某一小部分出現問題也會致使整個系統出現問題。
爲了解決這些狀況,因而就產生了微服務架構。若是是Java開發,那主要就是指Spring Boot和Spring Cloud技術棧。微服務就是要求功能拆分,業務單一,把複雜系統拆分爲各個可靠的小模塊,這雖然有不少優點,但同時也增長了運維和管理的難度。
雖然微服務架構容器一旦很是多的時候,管理起來有點麻煩,但Docker能很好的對各個容器進行管理、彈性擴容等,所以每每會採用SpringBoot+SpringCloud+Docker的微服務架構模式。
在傳統的大數據架構中都一般會部署Hadoop、Hbase、Kafka、Zookeeper、Flink、Spark等等集羣,若是都手動或者採用腳本去進行管理效率很是低,而且應對彈性擴容或縮容、遷移的情景是控制還須要作些額外的工做,而若是採用Docker進行管理和容器化的部署,這一切將會變得更加簡單。
這一部分的演示將會在後續分享完大數據相關知識後在返回來進行對比,敬請期待。
Docker容器技術以及在各大企業中獲得了充分的驗證,如:京東61八、美團點評、騰訊、新浪、蘑菇街等等。
2016年京東彈性雲團隊,從1萬Docker到15萬,從試水部分應用到承擔所有流量,通過了618的嚴格考驗。
2015年,美團雲團隊開始試水Docker容器集羣管理平臺,通過一些列的優化和完善,前該平臺爲美團點評的外賣、酒店、到店、貓眼等十幾個事業部提供容器計算服務,承載線上業務數百個,業務類型涵蓋Web、數據庫、緩存、消息隊列等。
騰訊2014年10月份正式上線 Docker,其基於 Yarn 的代號爲Gaia的調度平臺能夠同時兼容 Docker 和非Docker 類型的應用,其上層業務包括離線、實時以及在線 service 服務,如 Hadoop MR、Spark、Storm、Hive 以及騰訊內部的 Lhotse、Hermes、廣點通等業務。
新浪微博的DCP是基於Docker的混合雲架構,在2014年作了Docker容器化,2015年作了私有云+混合雲以及還有動態調度,在2016年從容應對十億級PV、千億級數據、2000臺以上的服務器規模、20個以上的大小服務模塊、百億級數據Hbase存儲、千臺以上的Docker混合雲集羣。
蘑菇街的私有云項目於2014年聖誕節期間上線,把應用進行拆分,變成一個個微服務,實現PaaS基於應用的部署和發佈。經歷了 幾回雙11大促,已經逐漸造成了必定的規模。
從官網能夠看到Docker分爲社區版(CE)和企業版(EE),通常狀況下使用社區版便可。
https://labs.play-with-docker.com/
該網站是Docker船長爲了幫助你們學習Docker而花了幾天時間開發的一款基於瀏覽器的產品,play-with-docker,人稱PWD,它是一個Docker的演練場。
它可讓用戶在幾秒鐘內在瀏覽器中體驗免費的Alpine Linux虛擬機,運行Docker命令,能夠構建、運行Docker容器,甚至能夠在Docker Swarm模式下建立集羣,除了演練場以外,PWD還包含了一個由大量Docker labs實例和測試。
若是你只是想快速體驗一下Docker,你甚至都不用本地裝環境就能夠立刻體驗,註冊一個帳戶或者直接用Docker Hub的帳戶便可登陸進入體驗。
正如前文提到支持Linux、Windows、MacOS等,但生產環境咱們通常是在Linux中使用,所以本文將演示在Centos7下Docker的安裝和使用。
Docker的安裝也很是簡單,只須要按照官網提示操做便可。
官網介紹的安裝有三種:rpm、yum、腳本方式
接下來採用YUM的方式進行安裝
配置好IP地址,同時爲了減小干擾,關閉防火牆和SELinux。
若是你的系統比較老舊須要yum更新一下,此步驟不是必須的。
[root@docker ~]# yum update -y
[root@docker ~]# yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 ...省略部分輸出內容 Complete! [root@docker ~]#
[root@docker ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ...省略部分輸出內容 repo saved to /etc/yum.repos.d/docker-ce.repo [root@docker ~]#
此處直接用官方的倉庫https://download.docker.com/linux/centos/docker-ce.repo,若是你網速慢也能夠換成國內的倉庫,如阿里雲的。
[root@docker ~]# yum install docker-ce ...省略部分輸出內容 Complete! [root@docker ~]#
安裝過程當中按3次y進行確認便可。此過程跟網速有關,通常10多分鐘便可安裝完成。
因爲該命令後沒有帶具體的版本號,所以默認的tag爲lastest,因此不一樣時間去執行有可能版本會不同,生產環境建議帶上指定的版本號。
安裝完成後Docker是沒有啓動的,所以須要先啓動Docker,並設爲開機啓動。能夠經過systemctl status docker查看Docker的狀態。
[root@docker ~]# systemctl start docker [root@docker ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@docker ~]# systemctl status docker docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-02-26 21:39:22 CST; 1min 30s ago Docs: https://docs.docker.com Main PID: 57003 (dockerd) CGroup: /system.slice/docker.service ...省略部份內容
能夠看處處於running狀態,至此docker安裝並啓動成功。
查看版本信息
[root@docker ~]# docker -v Docker version 19.03.6, build 369ce74a3c
查看docker安裝信息
[root@docker ~]# docker info ...省略部份內容 Docker Root Dir: /var/lib/docker ...省略部份內容
能夠看到默認的安裝路徑爲/var/lib/docker。
咱們經過Docker Hub上官方提供的現成的hello-world鏡像來建立一個容器,建立容器使用docker run 命令,該容器的功能就是建立並啓動後輸出helloworld字樣。
[root@docker ~]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ [root@docker ~]#
能夠看到容器成功運行了,而且輸出了hello from docker!
此時採用docker images命令查看本地的鏡像,能夠看到一個名爲hello-world的鏡像。
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 14 months ago 1.84kB [root@docker ~]#
運行一個容器,實際上就是運行容器內部的程序,就像咱們平時作helloworld程序,咱們須要用java或者其餘語言進行開發,而後打包爲jar文件,而後經過java命令執行。每次須要運行該程序都須要作手動執行命令,而在docker中,咱們把helloworld對應的jar包打包到容器中,只須要run容器,程序就能夠當即執行,是否是很方便呢?
咱們分析一下hello-world容器運行的原理:首先咱們看到「Unable to find image 'hello-world:latest' locally」這樣的提示,說明本地沒有這個hello-world鏡像,他會自動從Docker Hub倉庫去下載該鏡像,而後在建立容器並運行容器內的helloworld程序,這個過程都是自動化完成的。
而且啓動的這個容器其實就至關因而一個小型的linux系統,可是啓動的很是快,幾秒鐘就啓動並運行了,這也正是以前談到的和虛擬機相比的優點。
至於它爲何這麼快?以及這個容器內究竟有什麼東西?能夠執行哪些docker命令?在後續文章中你將找到答案。
這樣Docker環境就準備好了,下一篇文章開始,咱們正式來演示Docker中各類命令的使用方法。