Docker技術入門
引言
如果說主機時代大家比拼的是單個伺服器的物理效能,那麼在雲時代,最為看重的則是憑藉虛擬化技術所構建的叢集處理能力。
隨著資訊科技的飛速發展,虛擬化技術早已經應用到各種關鍵場景中。從20世紀60年代IBM推出的大型主機虛擬化,到後來以Xen、KVM為代表的虛擬機器虛擬化,再到現在以Docker為代表的容器技術,虛擬機器技術自身也在不斷創新和突破。
傳統來看,虛擬化既可以通過硬體模擬來實現,也可以通過作業系統軟體來實現。而容器技術更為優雅,它充分利用了作業系統本身已有的機制和特性,可以實現遠超傳統虛擬機器的清亮虛擬化。因此,有人甚至把它稱為“新一代的虛擬化”技術,並將基於容器打造的雲平臺親切地稱為“容器雲”。
Docker毫無疑問正是眾多容器技術中的佼佼者,是容器技術發展過程中耀眼的一抹亮色。那麼Docker 到底是什麼,要解決什麼問題,好處又在哪裡?接下來將一一進行解答。
Docker的發展歷史
在做軟體開發的時候,往往需要配置軟體的執行環境,如JAVA,Python。而且換一臺機器,就要重來一次。那麼能不能在安裝的時候,把原始環境一模一樣地複製過來,從根本上解決環境配置的難題呢。
在此環境下,虛擬機器應運而生。虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種作業系統裡面執行另一種作業系統,虛擬機器就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響。
雖然使用者可以通過虛擬機器還原軟體的原始環境。但是,這個方案有幾個缺點。
1)資源佔用多
2)冗餘步驟多
3)啟動慢
由於虛擬機器存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器
Linux 容器不是模擬一個完整的作業系統,而是對程序進行隔離。或者說,在正常程序的外面套了一個保護層。對於容器裡面的程序來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。
由於容器是程序級別的,相比虛擬機器有很多優勢。
1)啟動快
2)資源佔用少
3)體積小
Docker是什麼
首先,Docker 是一個開源的應用容器引擎。其次,Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。
Docker 將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。
Docker的構想是要實現“Build, Ship and Run Any App, Anywhere”,即通過對應用的封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)生命週期進行管理,達到應用元件“一次封裝,到處執行
基於Linux平臺上的多項開源技術,Docker提供了高效、敏捷和輕量級的容器方案,並支援部署到本地環境和多種主流平臺。可以說,Docker首次為應用的開發、執行和部署提供了“一站式”的使用解決方案。
Docker與虛擬化
Docker和常見的虛擬化方式的不同之處如下圖所示。
傳統方式是在硬體層面實現虛擬化,需要有額外的虛擬機器管理應用和虛擬機器作業系統層。Docker容器是在作業系統層面上實現虛擬化,直接複用本機的作業系統,因此更加輕量級。
Docker的核心概念
Docker的大部分操作都圍繞著它的三大核心概念——映象、容器和倉庫而展開。因此,準確把握這三大核心概念對於掌握Docker技術尤為重要。
1、Docker映象
Docker映象類似於虛擬機器映象,可以將它理解為一個只讀的模板。例如,一個映象可以包含一個基本的作業系統環境,裡面僅安裝了Mysql應用程式。可以把他稱為一個Mysql映象。
映象是建立Docker容器的基礎。通過版本管理和增量的檔案系統,Docker提供了一套十分簡單的機制來建立和更新現有的映象,使用者甚至可以從網上下載一個已經做好的應用映象,並直接使用。
2、Docker容器
Docker容器類似於一個輕量級的沙箱,Docker利用容器來執行和隔離應用。容器是從映象建立的應用執行例項。可以將其啟動、開始、停止、刪除,而這些容器都是彼此相互隔離、互不可見的。
注:映象自身是隻讀的。容器從映象啟動的時候,會在映象的最上層建立一個可寫層。
3、Docker倉庫
Docker倉庫類似於程式碼倉庫,它是Docker集中存放映象檔案的場所。
安裝Docker
以CentOS7為例。
1、檢查核心版本
Docker目前只能執行在64位平臺上,並且要求核心版本不低於3.10。
uname -r
2、使用yum命令安裝Docker
yum install docker
3、啟動Docker
systemctl start docker
4、檢視Docker版本
docker –v
5、開機啟動Docker
systemctl enable docker
6、停止Docker
systemctl stop docker
Docker常用操作
映象操作
下面看一個案例,使用Docker安裝Mysql。
1、啟動docker
[[email protected] ~]# systemctl start docker
2、搜尋mysql
[[email protected] ~]# docker search mysql
注意:如果報以下錯誤。
Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: dial tcp: lookup index.docker.io: no such host
解決方法見以下連線:
3、拉取Mysql映象
[[email protected] ~]# docker pull mysql
4、檢視安裝的映象
[[email protected] ~]# docker images
5、刪除映象
[[email protected] ~]# docker rmi a8a59477268d
容器操作
在拉取映象之後,執行映象就會產生一個容器。容器其實就是正在執行的軟體。
下面看一個案例,使用Docker安裝Tomcat。
1、搜尋映象
docker search tomcat
2、拉取映象
docker pull tomcat
3、根據映象啟動容器
docker run --name mytomcat -d tomcat:latest
4、檢視執行中的容器
docker ps
5、 停止執行中的容器
docker stop 容器的id
docker stop d5fc94dc82d0
6、檢視所有的容器
docker ps -a
7、啟動容器
docker start 容器id
8、刪除一個容器
docker rm 容器id
docker rm d5fc94dc82d0
9、啟動一個做了埠對映的tomcat
docker run -d -p 8888:8080 tomcat
-d:後臺執行
-p: 將主機的埠對映到容器的一個埠 主機埠:容器內部的埠
10、為了演示簡單關閉了linux的防火牆
service firewalld status
;檢視防火牆狀態
service firewalld stop
;關閉防火牆
11、檢視容器的日誌
docker logs container-name/container-id
注:更多命令參看:
https://docs.docker.com/engine/reference/commandline/docker/
埠對映與容器互聯
在實踐中,經常會碰到需要多個服務元件容器共同協作的情況,這往往需要多個容器之間有能夠相互訪問到對方的服務。
除了通過網路訪問外,Docker還提供了兩個很方便的功能來滿足需求:一個是允許對映容器內應用的服務埠到本地宿主主機,另一個是互聯機制實現多個容器間通過容器名來快速訪問。
啟動一個做了埠對映的tomcat
docker run -d -p 8888:8080 tomcat
-d:後臺執行
-p: 將主機的埠對映到容器的一個埠 主機埠:容器內部的埠