如今Docker的使用已經非常普遍,特別在一線網際網路公司。使用Docker技術可以幫助企業快速水平擴充套件服務,從而到達彈性部署業務的能力。在雲服務概念興起之後,Docker的使用場景和範圍進一步發展,如今在微服務架構越來越流行的情況下,微服務+Docker的完美組合,更加方便微服務架構運維部署落地。
本文詳細解釋介紹Docker入門相關內容,後期重點關注Docker在微服務體系中的使用。在瞭解Docker之前我們先考慮幾個問題:1、Docker是什麼?2、為什麼要使用Docker,它有什麼優勢?帶著這些問題我們來看看下面的內容。
什麼是Docker?
Docker 是世界領先的軟體容器平臺。開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。運維人員利用 Docker 可以在隔離容器中並行執行和管理應用,獲得更好的計算密度。企業利用 Docker 可以構建敏捷的軟體交付管道,以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應用釋出新功能。
Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。Docker 將應用程式與該程式的依賴,打包在一個檔案裡面。執行這個檔案,就會生成一個虛擬容器。程式在這個虛擬容器裡執行,就好像在真實的物理機上執行一樣。有了 Docker,就不用擔心環境問題。
總體來說,Docker 的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部專案,它是基於 dotCloud 公司多年雲服務技術的一次革新,並於 2013 年 3 月以 Apache 2.0 授權協議開源,主要專案程式碼在 GitHub 上進行維護。Docker 專案後來還加入了 Linux 基金會,併成立推動 開放容器聯盟(OCI)。
Docker 自開源後受到廣泛的關注和討論,至今其 GitHub 專案已經超過 4 萬 6 千個星標和一萬多個 fork。甚至由於 Docker 專案的火爆,在 2013 年底,dotCloud 公司決定改名為 Docker。Docker 最初是在 Ubuntu 12.04 上開發實現的;Red Hat 則從 RHEL 6.5 開始對 Docker 進行支援;Google 也在其 PaaS 產品中廣泛應用 Docker。
為什麼要使用Docker
容器除了執行其中應用外,基本不消耗額外的系統資源,使得應用的效能很高,同時系統的開銷儘量小。傳統虛擬機器方式執行 10 個不同的應用就要起 10 個虛擬機器,而Docker 只需要啟動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
1、更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。
開發者可以使用一個標準的映象來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署程式碼。 Docker 可以快速建立容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何建立和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
2、更高效的虛擬化
Docker 容器的執行不需要額外的 hypervisor 支援,它是核心級的虛擬化,因此可以實現更高的效能和效率。
3、更輕鬆的遷移和擴充套件
Docker 容器幾乎可以在任意的平臺上執行,包括物理機、虛擬機器、公有云、私有云、個人電腦、伺服器等。 這種相容性可以讓使用者把一個應用程式從一個平臺直接遷移到另外一個。
4、更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
Docker vs VM
從下圖可以看出,VM是一個執行在宿主機之上的完整的作業系統,VM執行自身作業系統會佔用較多的CPU、記憶體、硬碟資源。Docker不同於VM,只包含應用程式以及依賴庫,基於libcontainer執行在宿主機上,並處於一個隔離的環境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內完成。由於Docker輕量、資源佔用少,使得Docker可以輕易的應用到構建標準化的應用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機作業系統的一些基礎庫等;網路配置功能相對簡單,主要以橋接方式為主;檢視日誌也不夠方便靈活。
Docker 在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互聯到程式隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機器技術更為輕便、快捷。
作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機器方式要快得多;Docker 對系統資源的利用率很高,一臺主機上可以同時執行數千個 Docker 容器。
相關概念
Docker是CS架構,主要有兩個概念:
- Docker daemon: 執行在宿主機上,Docker守護程式,使用者通過Docker client(Docker命令)與Docker daemon互動
- Docker client: Docker 命令列工具,是使用者使用Docker的主要方式,Docker client與Docker daemon通訊並將結果返回給使用者,Docker client也可以通過socket或者RESTful api訪問遠端的Docker daemon
瞭解了Docker的組成,再來了解一下Docker的三個主要概念:
- Docker image:映象是隻讀的,映象中包含有需要執行的檔案。映象用來建立container,一個映象可以執行多個container;映象可以通過Dockerfile建立,也可以從Docker hub/registry上下載。
- Docker container:容器是Docker的執行元件,啟動一個映象就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程式執行在一個相對安全的環境中。
- Docker hub/registry: 共享和管理Docker映象,使用者可以上傳或者下載上面的映象,官方地址為
https://registry.hub.docker.com/
,也可以搭建自己私有的Docker registry。
映象就相當於打包好的版本,映象啟動之後執行在容器中,倉庫就是裝儲存映象的地方。
Docker安裝
建議在linux環境下安裝Docker,window環境搭建比較複雜且容易出錯,使用Centos7+yum來安裝Docker環境很方便。
Docker 軟體包已經包括在預設的 CentOS-Extras 軟體源裡。因此想要安裝 docker,只需要執行下面的 yum 命令:
yum install docker
安裝完成後,使用下面的命令來啟動 docker 服務,並將其設定為開機啟動:
service docker start
chkconfig docker on
LCTT 譯註:此處採用了舊式的 sysv 語法,如採用CentOS 7中支援的新式 systemd 語法,如下:
systemctl start docker.service
systemctl enable docker.service
測試
docker version
輸入上述命令,返回docker的版本相關資訊,證明docker安裝成功。
Hello World
下面,我們通過最簡單的 image 檔案"hello world",感受一下 Docker。
因為國內連線 Docker 的官方倉庫很慢,因此我們在日常使用中會使用Docker 中國加速器。通過 Docker 官方映象加速,中國區使用者能夠快速訪問最流行的 Docker 映象。該映象託管於中國大陸,本地使用者現在將會享受到更快的下載速度和更強的穩定性,從而能夠更敏捷地開發和交付 Docker 化應用。
Docker 中國官方映象加速可通過registry.docker-cn.com
訪問。該映象庫只包含流行的公有映象,私有映象仍需要從美國映象庫中拉取。
修改系統中docker對應的配置檔案即可,如下:
vi /etc/docker/daemon.json
#新增後
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
執行下面的命令,將 image 檔案從倉庫抓取到本地。
docker pull library/hello-world
上面程式碼中,docker image pull是抓取 image 檔案的命令。library/hello-world是 image 檔案在倉庫裡面的位置,其中library是 image 檔案所在的組,hello-world是 image 檔案的名字。
抓取成功以後,就可以在本機看到這個 image 檔案了。
docker images
#顯示結果
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest f2a91732366c 3 months ago 1.848 kB
現在,執行這個 image 檔案。
docker run hello-world
#顯示結果
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
輸出這段提示以後,hello world就會停止執行,容器自動終止。有些容器不會自動終止,因為提供的是服務,比如Mysql映象等。
常用命令
除過以上我們使用的Docker命令外,Docker還有一些其它常用的命令
拉取docker映象
docker pull image_name
檢視宿主機上的映象,Docker映象儲存在/var/lib/docker目錄下:
docker images
刪除映象
docker rmi docker.io/tomcat:7.0.77-jre7 或者 docker rmi b39c68b7af30
檢視當前有哪些容器正在執行
docker ps
檢視所有容器
docker ps -a
啟動、停止、重啟容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
後臺啟動一個容器後,如果想進入到這個容器,可以使用attach命令:
docker attach container_name/container_id
刪除容器的命令:
docker rm container_name/container_id
檢視當前系統Docker資訊
docker info
從Docker hub上下載某個映象:
docker pull centos:latest
docker pull centos:latest
執行docker pull centos會將Centos這個倉庫下面的所有映象下載到本地repository。