Docker全面詳解
- 1.Docker概述
- 1.2.聊聊Docker
- 1.3.Docker能幹嘛
- 2.Docker安裝
- 2.1.Docker的基本組成
- 2.2.Linux上安裝Docker
- 3.下一篇:[Docker全面詳解(二)]()
1.Docker概述
1.1.Docker為什麼出現
開發上線,兩套環境
一款產品從開發到上線,從操作系統,到運行環境,再到應用配置。作為開發+運維之間的協作我們需要關心很多東西,這也是很多互聯網公司都不得不面對的問題,特別是各種版本的迭代之後,不同版本環境的兼容,對運維人員是極大的考驗!
環境配置如此麻煩,換一台機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題, 軟件可以帶環境安裝?也就是説,安裝的時候,把原始環境一模一樣地複製過來。解決開發人員説的“在
我的機器上可正常工作”的問題。
之前在服務器配置一個應用的運行環境,要安裝各種軟件,就拿一個基本的工程項目的環境來説吧,Java/Tomcat/MySQL/JDBC驅動包等。安裝和配置這些東西有多麻煩就不説了,它還不能跨平台。假如我們是在Windows上安裝的這些環境,到了Linux又得重新裝。況且就算不跨操作系統,換另一台同樣操作系統的服務器,要移植應用也是非常麻煩的。
以前:發佈一個項目,打成jar包或war包,要在服務器上部署JDK、MySQL、Redis、ES……
如果能帶上開發時的環境一起打包安裝多好!
傳統上認為,軟件編碼開發/測試結束後,所產出的成果即是程序或是能夠編譯執行的二進制字節碼文件等(Java為例)。而為了讓這些程序可以順利執行,開發團隊也得準備完整的部署文件,讓維運團隊得以部署應用程式,開發需要清楚的告訴運維部署團隊,用的全部配置文件+所有軟件環境。不過,即便如此,仍然常常發生部署失敗的狀況。
傳統:開發打個Jar包,其他的由運維來部署。
高級開發人員重金難求,低級開發人員滿大街都是。
Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。
Docker鏡像的設計,使得Docker得以打破過去「程序即應用」的觀念。通過Docker鏡像 ( images ) 將應用程序所需要的系統環境,由下而上打包,達到應用程序跨平台間的無縫接軌運作。
現在:開發打包部署上線,一套流程做完。
Java > apk > 發佈(應用商店) > 張三使用apk > 下載安裝即可用。
同理
Java > jar(環境) > 打包項目帶上環境(鏡像) > Docker倉庫(商店) > 下載我們發佈的鏡像 >直接運行即可。
Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就可以用一艘大船把他們都運走。
以前多個項目可能使用一套環境,比如多個項目使用的JRE就是同一個,現在需要把它們都隔離出來。
Docker就是類似的理念。
隔離:Docker核心思想。打包裝箱,每個箱子是互相隔離的。
1.2.聊聊Docker
Docker是基於Go語言實現的雲開源項目。
官網: https://www.docker.com/ 文檔地址:https://docs.docker.com/ 超詳細
倉庫地址:https://hub.docker.com/
1.3.Docker能幹嘛
1.3.1.之前的虛擬機技術
虛擬機(virtual machine)就是帶環境安裝的一種解決方案。
它可以在一種操作系統裏面運行另一種操作系統,比如在Windows 系統裏面運行Linux 系統。應用程序對此毫無感知,因為虛擬機看上去跟真實系統一模一樣,而對於底層系統來説,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統,能夠使應用程序,操作系統和硬件三者之間的邏輯不變。
虛擬機技術缺點:
- 資源佔用十分多
- 冗餘步驟多
- 啓動很慢
1.3.2.容器虛擬化技術
由於前面虛擬機存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量並保證部署在任何環境中的軟件都能始終如一地運行。
比較Docker和傳統虛擬化方式的不同之處:
- 傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;
- 而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
- 每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。
1.3.3.開發/運維(DevOps)
更快速的應用交付和部署:
傳統的應用開發完成後,需要提供一堆安裝程序和配置説明文檔,安裝部署後需根據配置文檔進行繁雜的配置才能正常運行。Docker化之後只需要交付少量容器鏡像文件,在正式生產環境加載鏡像並運行即可,應用安裝配置在鏡像裏已經內置好,大大節省部署配置和測試驗證時間。
(傳統:一堆幫助文檔,安裝程序
Docker:打包鏡像發佈測試,一鍵運行)
更便捷的升級和擴縮容:
隨着微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應用的升級將變得非常容易。當現有的容器不足以支撐業務處理時,可通過鏡像運行新的容器進行快速擴容,使應用系統的擴容從原先的天級變成分鐘級甚至秒級。
(項目打包為一個鏡像,如要擴展服務器,直接將鏡像安裝到新服務器即可。)
更簡單的系統運維:
應用容器化運行後,生產環境運行的應用可與開發、測試環境的應用高度一致,容器會將應用程序相關的環境和狀態完全封裝起來,不會因為底層基礎架構和操作系統的不一致性給應用帶來影響,產生新的BUG。當出現程序異常時,也可以通過測試環境的相同容器進行快速定位和修復。
(在容器化之後,我們的開發、測試環境都是高度一致的。)
更高效的計算資源利用:
Docker是內核級虛擬化,其不像傳統的虛擬化技術一樣需要額外的Hypervisor [管理程序] 支持,所以在一台物理機上可以運行很多個容器實例,可大大提升物理服務器的CPU和內存的利用率。
(假設一台單核的服務器以前能跑3個虛擬機,如果使用鏡像可以跑30個。將服務器性能壓榨到極致。)
2.Docker安裝
2.1.Docker的基本組成
Docker的架構圖:
鏡像(image):
Docker 鏡像(Image)就是一個只讀的模板。鏡像可以用來創建 Docker 容器,一個鏡像可以創建很多容器。就好似 Java 中的 類和對象,類就是鏡像,容器就是對象!
容器 = new 鏡像()
容器(container):
Docker 利用容器(Container)獨立運行的一個或一組應用。容器是用鏡像創建的運行實例。
它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平台。
可以把容器看做是一個簡易版的 Linux 環境(包括root用户權限、進程空間、用户空間和網絡空間等) 和運行在其中的應用程序。
容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
倉庫(repository):
倉庫(Repository)是集中存放鏡像文件的場所。
倉庫(Repository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 DockerHub(https://hub.docker.com/),存放了數量龐大的鏡像供用户下載。
國內的公開倉庫包括阿里雲 、網易雲等,配置鏡像加速。
小結:
需要正確的理解倉儲/鏡像/容器這幾個概念:
- Docker 本身是一個容器運行載體或稱之為管理引擎。我們把應用程序和配置依賴打包好形成一個可交付的運行環境,這個打包好的運行環境就似乎 image鏡像文件。只有通過這個鏡像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根據 image 文件生成容器的實例。
同一個 image 文件,可以生成多個同時運行的容器實例。 - image 文件生成的容器實例,本身也是一個文件,稱為鏡像文件。
- 一個容器運行一種服務,當我們需要的時候,就可以通過docker客户端創建一個對應的運行實例,也就是我們的容器。
- 至於倉庫,就是放了一堆鏡像的地方,我們可以把鏡像發佈到倉庫中,需要的時候從倉庫中拉下來就可以了。
2.2.Linux上安裝Docker
Docker是用golang開發的,主要面向linux系統。所以在linux下Docker可以完美運行。但是大部分開發人員都是用win10作為開發機。當然你可以安裝一個虛擬機來跑Docker。目前docker已經支持在win10上直接安裝了。
2.2.1.環境準備
(1)需要會一點點Linux基礎
(2)CentOS 7
(3)使用Xshell連接遠程服務器進行操作
2.2.2.環境查看
要求Linux系統為64位、系統內核版本為 3.10 以上。
查看當前系統相關信息(內核版本號、硬件架構、主機名稱和操作系統類型等):
uname -r
查看系統版本:
cat /etc/os-release
2.2.3.下載Docker
下載地址:https://docs.docker.com/get-docker/,選擇Linux版Docker。
2.2.4.安裝步驟
在Linux安裝Docker的文檔:https://docs.docker.com/engine/install/centos/
第1步:卸載舊的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第2步:需要安裝包(在線安裝),已安裝直接跳過
yum install -y yum-utils
或
第3步:設置鏡像的倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默認的是國外的,非常慢,不建議使用
#這裏使用國內的鏡像地址,百度搜索“docker的阿里雲鏡像地址”
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第4步:更新軟件包索引(可省略)
在安裝之前,建議先更新yum軟件包索引:
yum makecache fast
第5步:安裝docker引擎
yum install docker-ce docker-ce-cli containerd.io
注意:docker-ce是社區版,ee是企業版,推薦使用社區版。
注意:如果不想安裝最新的版本,可以在安裝時指定版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
第6步:啓動docker
systemctl start docker
第7步:查看docker是否啓動成功
docker version
第8步:測試hello world鏡像
docker run hello-world
所有的命令都是通過docker run執行的。
以上表明安裝成功了。
第9步:查看下載的hello-world鏡像是否存在
docker images
卸載鏡像兩步:
(1)卸載Docker Engine,CLI和Containerd軟件包:
yum remove docker-ce docker-ce-cli containerd.io
(2)刪除資源(主機上的映像、容器、卷或自定義配置文件不會自動刪除。要刪除所有圖像、容器和卷):
rm -rf /var/lib/docker #docker的默認工作路徑
rm -rf /var/lib/containerd #containerd表示容器