前端時間有幸被邀請參加了青島諾基亞車庫的成立儀式,在下午的技術(shù)沙龍上,聽取了諾基亞研發(fā)中心專家對于微服務(wù)的技術(shù)分享,遂開始對Docker產(chǎn)生了十分濃厚的興趣。一段時間以來一直在關(guān)注并且學(xué)習(xí)著。
1.Docker是什么
Docker是目前最為流行的 Linux 容器解決方案。在虛擬化技術(shù)發(fā)展的過程中,由于虛擬機存在著諸如啟動速度慢、資源占用多等諸多不便,Linux 發(fā)展出了另一種虛擬化技術(shù):Linux 容器(Linux Containers)。
相比于虛擬機,Linux容器并不是虛擬一個完整的操作系統(tǒng),而是對進程進行隔離,物理機上的進程被區(qū)分為容器內(nèi)和容器外兩部分,對于容器里面的進程來說,它接觸到的各種資源都是虛擬的,從而實現(xiàn)與底層系統(tǒng)的隔離。因此作為進程級別的容器來講,無論是啟動速度還是資源占用都有著明顯的優(yōu)勢。
Docker則是目前最為流行的 Linux 容器解決方案,它本身 屬于 Linux 容器的一種封裝,因此也具有容器的諸多優(yōu)點。此外Docker對外提供簡單易用的容器接口,用戶可以方便地創(chuàng)建和使用容器。
2.Docker的優(yōu)勢
Docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器,該容器除了運行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,因此得以保證應(yīng)用性能的同時對系統(tǒng)的開銷加以節(jié)省。具體而言存在以下優(yōu)勢。
1. 高功效,低開銷
Docker是內(nèi)核級的虛擬化,Docker 容器的運行不需要額外的 hypervisor 支持,,因此可以實現(xiàn)更高的性能和效率。
2. 方便持續(xù)集成、快速交付與部署
傳統(tǒng)的軟件交付包括應(yīng)用程序、依賴軟件安裝包、配置說明文檔、安裝文檔、上線文檔等諸多文件,繁瑣復(fù)雜。使用Docker可以將交付物打包成鏡像(一個文件),簡化了交付模式,可以做到“一次構(gòu)建,多次交付”。當(dāng)涉及到應(yīng)用程序多副本部署或者應(yīng)用程序遷移時,更能體現(xiàn)Docker的價值。這對于部署來說也極大的減少部署的時間成本和人力成本。容器本身還可以進行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣,通過與代碼進行關(guān)聯(lián)使持續(xù)集成非常方便。
3. 便于拓展與遷移
Docker是一個開源的商業(yè)產(chǎn)品,支持大部分平臺與操作系統(tǒng),加之可以帶環(huán)境部署,所以當(dāng)在平臺間進行應(yīng)用程序遷移非常容易。同時一臺機器也可以運行多個容器,跑多個服務(wù),因此一臺機器也可以模擬出微服務(wù)架構(gòu),方便拓展與測試。
3.Docker安裝
Docker分為社區(qū)版(CE)與企業(yè)版(EE),企業(yè)版包含了一些收費服務(wù),安全性更高,個人開發(fā)者一般用不到,一下介紹面向社區(qū)版進行。
各平臺具體的安裝方式可參考Docker的官方文檔
在Linux環(huán)境下(CentOS 7),使用yum命令可以很方便的安裝。
yum install docker
安裝完成后啟動Docker
service docker start
#設(shè)置開機啟動
chkconfig docker on
安裝完成后,通過運行下面的命令,驗證是否安裝成功。
docker version
Docker 需要用戶具有 sudo 權(quán)限,為了避免每次命令都輸入sudo,可以把用戶加入 Docker 用戶組
sudo usermod -aG docker $USER
Docker 是CS架構(gòu)。命令行運行docker命令的時候,需要本機有 Docker 服務(wù)。如果這項服務(wù)沒有啟動,可以用下面的命令啟動
# service 命令的用法
sudo service docker start
# systemctl 命令的用法
sudo systemctl start docker
4.image文件
前邊我們說過,Docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面,該文件就是image文件,Docker 根據(jù) image 文件生成容器的實例。image文件是通用的,一般情況下我們都可以在Docker的官方倉庫 Docker Hub中使用別人制作好的 image 文件,省時省力。當(dāng)然也是可以制作并且上傳自己制作的容器文件的,后續(xù)會對次進行介紹。
對于image文件的操作:
# 列出本機的所有 image 文件。
$ docker image ls
# 刪除 image 文件
$ docker image rm [imageName]
國內(nèi)連接 Docker 的官方倉庫比較慢,可以將默認倉庫改成國內(nèi)的鏡像網(wǎng)站,具體參考官方文檔
下面操作可以運行一個 image 文件"hello world"作為示例:
首先,將 image 文件從倉庫拉取到本地:
$ docker image pull library/hello-world
該命令,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在倉庫里面的位置,其中l(wèi)ibrary是 image 文件所在的組,hello-world是 image 文件的名字。 Docker 官方提供的 image 文件,都放在library組里面,library可以省略。
抓取成功以后運行`$ docker image ls
`這個命令就可以在本機看到這個 image 文件了。
運行該image 文件:
$ docker container run hello-world
docker container run命令具有自動抓取 image 文件的功能。如果發(fā)現(xiàn)本地沒有指定的 image 文件,就會從倉庫自動抓取。因此,前面的docker image pull命令并不是必需的步驟。
運行成功后會看到該反饋
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
輸出這段提示以后,hello world就會停止運行,容器自動終止。
有些容器不會自動終止,因為提供的是服務(wù)。對于那些不會自動終止的容器,必須使用docker container kill 命令手動終止。
$ docker container kill [containID]
下文會介紹如何獲取containID
5.容器文件
通過運行image文件生成的容器實例,本身也是一個文件,稱為容器文件??梢酝ㄟ^以下命令查看
# 列出本機正在運行的容器
$ docker container ls
# 列出本機所有容器,包括終止運行的容器
$ docker container ls --all
運行該命令后可以查看CONTAINER ID
$docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6bd5d7f089d hello-world "/hello" 46 seconds ago Exited (0) 46 seconds ago stoic_cray
刪除容器文件
$ docker container rm [containerID]