Docker從安裝部署到Hello World

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)。

Docker從安裝部署到Hello World
1.PNG

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)核版本

Docker從安裝部署到Hello World

2.1 安裝docker

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

Docker從安裝部署到Hello World

2.2 啟動(dòng)docker服務(wù)

通過(guò) service docker startsystemctl 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.。如下圖:

Docker從安裝部署到Hello World

于是在網(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)題。

Docker從安裝部署到Hello World

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

Docker從安裝部署到Hello World

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

Docker從安裝部署到Hello World

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

Docker從安裝部署到Hello World

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從安裝部署到Hello World

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"

Docker從安裝部署到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/versionls分別查看當(dāng)前系統(tǒng)的版本信息和當(dāng)前目錄下的文件列表

Docker從安裝部署到Hello World

我們可以通過(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)行的容器

Docker從安裝部署到Hello World

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)查看

Docker從安裝部署到Hello World

CONTAINER ID:容器ID; NAMES:自動(dòng)分配的容器名稱

在容器內(nèi)使用docker logs命令,查看容器內(nèi)的標(biāo)準(zhǔn)輸出 docker logs a2274d84c6e8

Docker從安裝部署到Hello World

3.3 停止容器

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

Docker從安裝部署到Hello World

至此,docker hello world就完畢了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容