Docker 是 PaaS 提供商 dotCloud 開(kāi)源的一個(gè)基于 LXC 的高級(jí)容器引擎,源代碼托管在 Github 上, 基于go語(yǔ)言并遵從Apache2.0協(xié)議開(kāi)源。Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從Apache2.0協(xié)議開(kāi)源。Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類(lèi)似 iPhone 的 app),更重要的是容器性能開(kāi)銷(xiāo)極低。
認(rèn)識(shí)Docker
Docker自2013年以來(lái)非?;馃幔瑹o(wú)論是從 github上的代碼活躍度,還是Redhat在RHEL6.5中集成對(duì)Docker的支持, 就連 Google 的 Compute Engine 也支持 docker 在其之上運(yùn)行。
1.0 Docker 架構(gòu)
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,使用遠(yuǎn)程API來(lái)管理和創(chuàng)建Docker容器。Docker 容器通過(guò) Docker 鏡像來(lái)創(chuàng)建。容器與鏡像的關(guān)系類(lèi)似于面向?qū)ο缶幊讨械膶?duì)象與類(lèi)。

1.1 Docker 特性
由于其基于LXC的輕量級(jí)虛擬化的特點(diǎn),docker相比KVM之類(lèi)最明顯的特點(diǎn)就是啟動(dòng)快,資源占用小。因此對(duì)于構(gòu)建隔離的標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,輕量級(jí)的PaaS(如dokku), 構(gòu)建自動(dòng)化測(cè)試和持續(xù)集成環(huán)境,以及一切可以橫向擴(kuò)展的應(yīng)用(尤其是需要快速啟停來(lái)應(yīng)對(duì)峰谷的web應(yīng)用)。
- 構(gòu)建標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,現(xiàn)有的方案大多是在一個(gè)baseOS上運(yùn)行一套puppet/chef,或者一個(gè)image文件,其缺點(diǎn)是前者需要base OS許多前提條件,后者幾乎不可以修改(因?yàn)閏opy on write 的文件格式在運(yùn)行時(shí)rootfs是read only的)。并且后者文件體積大,環(huán)境管理和版本控制本身也是一個(gè)問(wèn)題。
- PaaS環(huán)境是不言而喻的,其設(shè)計(jì)之初和dotcloud的案例都是將其作為PaaS產(chǎn)品的環(huán)境基礎(chǔ)
- 因?yàn)槠錁?biāo)準(zhǔn)化構(gòu)建方法(buildfile)和良好的REST API,自動(dòng)化測(cè)試和持續(xù)集成/部署能夠很好的集成進(jìn)來(lái)
- 因?yàn)長(zhǎng)XC輕量級(jí)的特點(diǎn),其啟動(dòng)快,而且docker能夠只加載每個(gè)container變化的部分,這樣資源占用小,能夠在單機(jī)環(huán)境下與KVM之類(lèi)的虛擬化方案相比能夠更加快速和占用更少資源
1.2 Docker 應(yīng)用場(chǎng)景
- Automating the packaging and deployment of applications(使應(yīng)用的打包與部署自動(dòng)化)
- Creation of lightweight, private PAAS environments(創(chuàng)建輕量、私密的PAAS環(huán)境)
- Automated testing and continuous integration/deployment(實(shí)現(xiàn)自動(dòng)化測(cè)試和持續(xù)的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署與擴(kuò)展webapp、數(shù)據(jù)庫(kù)和后臺(tái)服務(wù))
1.3 Docker到底是什么?
來(lái)舉個(gè)簡(jiǎn)單的例子。docker設(shè)想是交付運(yùn)行環(huán)境如同海運(yùn),OS如同一個(gè)貨輪,每一個(gè)在OS基礎(chǔ)上的軟件都如同一個(gè)集裝箱,用戶可以通過(guò)標(biāo)準(zhǔn)化手段自由組裝運(yùn)行環(huán)境,同時(shí)集裝箱的內(nèi)容可以由用戶自定義,也可以由專(zhuān)業(yè)人員制造。這樣,交付一個(gè)軟件,就是一系列標(biāo)準(zhǔn)化組件的集合的交付,如同樂(lè)高積木,用戶只需要選擇合適的積木組合,并且在最頂端署上自己的名字(最后一個(gè)標(biāo)準(zhǔn)化組件是用戶的app)。這也就是基于docker的PaaS產(chǎn)品的原型。
v安裝Docker
2.0 版本檢測(cè)
正如上文所說(shuō),Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,查看本頁(yè)面的前提條件來(lái)驗(yàn)證你的CentOS 版本是否支持 Docker 。
通過(guò) uname -r命令查看你當(dāng)前的內(nèi)核版本

2.1 安裝docker
Docker 軟件包和依賴包已經(jīng)包含在默認(rèn)的 CentOS-Extras 軟件源里,安裝命令:yum -y install docker

2.2 啟動(dòng)docker服務(wù)
通過(guò) service docker start和 systemctl start docker均無(wú)法啟動(dòng)docker。錯(cuò)誤信息: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.。如下圖:

于是在網(wǎng)上找各種類(lèi)似錯(cuò)誤,試過(guò)關(guān)閉防火墻,關(guān)閉selinux,重裝系統(tǒng),等等網(wǎng)上能查到的方法都解決不了。
在docker里禁用selinux( vim /etc/sysconfig/docker), –selinux-enabled=false,重啟啟動(dòng)服務(wù)解決問(wèn)題。

更新后的完整配置: OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'

2.3 測(cè)試運(yùn)行 hello-world
docker run hello-world
但是在運(yùn)行:docker run hello-world的時(shí)候報(bào)錯(cuò):
container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccounting, or unknown property.\""
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccounting, or unknown property.\"".
解決:主要原因還是centos系統(tǒng)版本兼容性問(wèn)題,如果將系統(tǒng)做更新升級(jí),即可解決。
yum update

此時(shí)重新運(yùn)行 docker run hello-world,結(jié)果如下:

2.4 修改鏡像源
docker默認(rèn)的源為國(guó)外官方源,下載速度較慢,可改為國(guó)內(nèi)。
# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
service docker restart
國(guó)內(nèi)的阿里和網(wǎng)易等都可以,或者直接使用官方->國(guó)內(nèi)的。
2.5 設(shè)置docker開(kāi)機(jī)自動(dòng)啟動(dòng)
systemctl enable docker

docker已經(jīng)成功啟動(dòng),至此,docker已經(jīng)安裝完畢。
v探索Hello World
3.0 docker hello world
可以使用docker run 命令來(lái)在容器內(nèi)運(yùn)行一個(gè)應(yīng)用程序,比如輸出Hello World。
docker run centos /bin/echo "Hello World"

參數(shù)解析:
-
docker: Docker 的二進(jìn)制執(zhí)行文件。 -
run:與前面的 docker 組合來(lái)運(yùn)行一個(gè)容器。 -
centos:指定要運(yùn)行的鏡像,Docker首先從本地主機(jī)上查找鏡像是否存在,如果不存在,Docker 就會(huì)從鏡像倉(cāng)庫(kù) Docker Hub 下載公共鏡像。 -
/bin/echo "Hello world": 在啟動(dòng)的容器里執(zhí)行的命令
以上命令完整的意思可以解釋為:Docker 以 centos鏡像創(chuàng)建一個(gè)新容器,然后在容器里執(zhí)行 bin/echo "Hello world",然后輸出結(jié)果。
3.1 運(yùn)行交互式的容器
我們通過(guò)docker的兩個(gè)參數(shù) -i -t,讓docker運(yùn)行的容器實(shí)現(xiàn)"對(duì)話"的能力 docker run -i -t centos /bin/bash
參數(shù)解析:
-
-t:在新容器內(nèi)指定一個(gè)偽終端或終端。 -
-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。
此時(shí)我們已進(jìn)入一個(gè)centos系統(tǒng)的容器.我們嘗試在容器中運(yùn)行命令cat /proc/version和 ls分別查看當(dāng)前系統(tǒng)的版本信息和當(dāng)前目錄下的文件列表

我們可以通過(guò)運(yùn)行exit命令或者使用CTRL+D來(lái)退出容器。
3.2 啟動(dòng)容器(后臺(tái)模式)
使用 docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"命令創(chuàng)建一個(gè)以進(jìn)程方式運(yùn)行的容器

a2274d84c6e8025623a17d1262f1a65dfaa9ce982de94d2301f4c0fff049ed7e這個(gè)長(zhǎng)字符串叫做容器ID,對(duì)每個(gè)容器來(lái)說(shuō)都是唯一的,我們可以通過(guò)容器ID來(lái)查看對(duì)應(yīng)的容器發(fā)生了什么。
我們需要確認(rèn)容器有在運(yùn)行,可以通過(guò) docker ps來(lái)查看

CONTAINER ID:容器ID; NAMES:自動(dòng)分配的容器名稱
在容器內(nèi)使用docker logs命令,查看容器內(nèi)的標(biāo)準(zhǔn)輸出 docker logs a2274d84c6e8

3.3 停止容器
我們使用 docker stop命令來(lái)停止容器

至此,docker hello world就完畢了。