docker 入门教程指南
關(guān)于 docker
今天云平臺(tái)的同事提到, 現(xiàn)在的運(yùn)維就是惡性循環(huán), 因?yàn)榇蠹叶荚谏暾?qǐng)機(jī)器, 顯然的是, 大家申請(qǐng)機(jī)器都是按照自己的峰值申請(qǐng)的, 而為了保證突發(fā)狀況, 如 ddos, 雙11 等, 申請(qǐng)者甚至?xí)杀队谧约旱姆逯等ス浪阕约旱姆?wù). 由于資源緊張, 云平臺(tái)會(huì)對(duì)其削減, 因?yàn)樵破脚_(tái)也要為公司減少運(yùn)維成本, 可能原來申請(qǐng)10臺(tái)機(jī)器最后變成給5臺(tái), 而最終有經(jīng)驗(yàn)的申請(qǐng)者會(huì)直接申請(qǐng)20臺(tái), 然后等削減成10臺(tái)(正如魯迅所說, 如果不說把屋頂掀了, 中國(guó)人根本不會(huì)同意在屋里裝個(gè)窗戶)
申請(qǐng)容易而回收難, 云平臺(tái)并沒有能力去監(jiān)控每臺(tái)機(jī)器的使用量, 就算他們找到使用資源大大浪費(fèi)的機(jī)器, 他們也難以說服擁有機(jī)器的團(tuán)隊(duì)回收其機(jī)器, 最終, 大量超高配的機(jī)器(比如64g 內(nèi)存, 16核), 就貢獻(xiàn)著幾百的 qps, 造成極大的浪費(fèi)
也許自動(dòng)化運(yùn)維是每個(gè)云平臺(tái)的目標(biāo), 將運(yùn)維自動(dòng)化, 私有化, 最后公有化, 而當(dāng)今大熱 docker 就是解決運(yùn)維困境的一劑良藥
什么是 docker? 為了更好理解, 你可以直接和別人說它是虛擬機(jī), 實(shí)際上 docker 并不是虛擬機(jī), 它做的是 linux 的隔離, 但它的隔離做的如此之真實(shí)以至于讓人覺得自己擁有可以一臺(tái)完整的 linux 系統(tǒng)
那 docker 和 虛擬機(jī)具體是什么區(qū)別呢, 虛擬機(jī)在底層模擬出各種硬件, cpu, 硬盤之類的, 而 docker 是在軟件層面給資源分組, docker 性能無限接近原生, 因?yàn)?docker 用的就是系統(tǒng)自己的進(jìn)程, 而虛擬機(jī)做的再好, 也做不出原生的感覺
docker 的隔離技術(shù)源自于 Linux 容器 LXC(linux container), 聽起名字就知道, 這和沙箱應(yīng)該差不多, 可以把東西分開放, 也就是隔離的意思, 甚至可以在某些倉庫中看到 docker 的名字叫 lxc-docker
而 LXC 又是基于 cgroup 的 namespace, chroot 等, 由于我并不懂這些, 但 namespace 可以幫助我們理解, 就像我們寫程序一樣, 這是一個(gè)命名空間, 與其他 namespace 相區(qū)別
cgroup 對(duì)于 docker 是至關(guān)重要的, 了解它才會(huì)覺得 docker 不神秘, cgroup 全稱為 control group, 是 linux 內(nèi)核提供的功能, 簡(jiǎn)單的說, 它的作用就是把系統(tǒng)運(yùn)行的進(jìn)程按用戶自定義的群組區(qū)分, 也就是說 一個(gè) docker, 一個(gè) group
cgroup 有限制使用資源的能力
-
blkio -- 這個(gè)子系統(tǒng)為塊設(shè)備設(shè)定輸入/輸出限制,比如物理設(shè)備(磁盤,固態(tài)硬盤,USB 等等)
-
cpu -- 這個(gè)子系統(tǒng)使用調(diào)度程序提供對(duì) CPU 的 cgroup 任務(wù)訪問
-
cpuacct -- 這個(gè)子系統(tǒng)自動(dòng)生成 cgroup 中任務(wù)所使用的 CPU 報(bào)告
-
cpuset -- 這個(gè)子系統(tǒng)為 cgroup 中的任務(wù)分配獨(dú)立 CPU(在多核系統(tǒng))和內(nèi)存節(jié)點(diǎn)
-
devices -- 這個(gè)子系統(tǒng)可允許或者拒絕 cgroup 中的任務(wù)訪問設(shè)備
-
freezer -- 這個(gè)子系統(tǒng)掛起或者恢復(fù) cgroup 中的任務(wù)
-
memory -- 這個(gè)子系統(tǒng)設(shè)定 cgroup 中任務(wù)使用的內(nèi)存限制,并自動(dòng)生成由那些任務(wù)使用的內(nèi)存資源報(bào)告
-
net_cls -- 這個(gè)子系統(tǒng)使用等級(jí)識(shí)別符(classid)標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包,可允許 Linux 流量控制程序(tc)識(shí)別從具體 cgroup 中生成的數(shù)據(jù)包
-
ns -- 名稱空間子系統(tǒng)
看到上面的 cgroup 配置屬性真的是恍然大悟, docker 成為當(dāng)今最熱的運(yùn)維神器一點(diǎn)都不奇怪, 它簡(jiǎn)直就是為了運(yùn)維而生,?彈性計(jì)算,?資源報(bào)表,?暫停服務(wù),?資源限制?根本不在話下
入門教程
幫 docker 吹了這么多牛, 得說說具體怎么用
安裝
不管你是什么系統(tǒng), 你應(yīng)該首先嘗試腳本一鍵安裝, 也是官方推薦的方法
sudo curl -sL https://get.docker.io/ | sh如果你很不幸的失敗了, 那你也許是苦逼的 centos 或者 redhat 使用者, 那建議你使用
yum search docker運(yùn)氣好的話你可以找到一個(gè)叫 docker.io 的程序, 沒錯(cuò)就是他
如果再不行, 恩, 那就只能上官網(wǎng)看英語安裝文檔了
不得不承認(rèn)我至今都沒有成功的從源碼安裝過
運(yùn)行
docker 也需要一個(gè) daemon(后臺(tái)), 所以首先要啟動(dòng) docker 服務(wù)(不知為啥很多教程根本不提這一步)
sudo docker -d # 或者 sudo docker -H tcp://127.0.0.1:4243 -d如果沒報(bào)啥錯(cuò)誤, 并且?docker images?也能看到一個(gè)列表目錄而不是報(bào)錯(cuò), 那少年你一定是成功了
docker 依賴系統(tǒng)模塊 bridge, 可以用?modprobe bridge?來查看有沒有
阿里云默認(rèn)是啟動(dòng)不了 docker 的, 輸入?route del -net 172.16.0.0 netmask 255.240.0.0?可解決
使用
使用前你不得不了解兩個(gè)概念, 一個(gè)叫 image, 一個(gè)叫 container, 對(duì)初學(xué)者來說這倆可能意思有點(diǎn)接近或者混淆, 看這些比喻也許你一下子就明白了, image 是只讀的模板, 用來生成你需要的 container, 而 container 也可以變成新的 image
使用 docker 就是使用 container, 而 container 來自于 image, 因此你需要先有個(gè) image, docker 的操作像極了 git, 你可以這樣下載一個(gè) image
docker pull ubuntu這樣你就有了一個(gè) ubuntu image, 可以用?docker images?看到這個(gè)新的 image
使用這個(gè) image, 可以向它發(fā)送一個(gè)命令, docker run ubuntu echo hello docker
當(dāng)然, 沒人會(huì)這么無聊, come on! 我們需要像虛擬機(jī)一樣使用它, 搭建屬于我們自己的環(huán)境, 自己的系統(tǒng), 把搭建完成的 container 變成一個(gè)新的 image, 這才是我們的目標(biāo)!
docker run -it ubuntu /bin/bash沒錯(cuò), 這條神奇的命令終于讓 docker 變得有趣起來, 它讓我們像 ssh 進(jìn)入虛擬機(jī)一樣操作, 翱翔
退出可以用 exit, 或者 CTRL + D
可惜的是, 一旦退出, container 不在維持了, 我們不可能一直在 container 中不出來, 但我們也要保持 container 的狀態(tài), 那怎么辦呢
docker run -itd ubuntu /bin/bash # 后臺(tái)執(zhí)行 containerdocker ps # 找到后臺(tái)執(zhí)行的 container id 或昵稱docker attach <container id> # 重新 attach 這個(gè) container注意, 這時(shí)候如果 exit 依然會(huì)終止這個(gè) container, 要想 detach 跳出一個(gè) container, 你需要使用?CTRL + P, CTRL + Q, 這樣我們就又能用 attach 重新進(jìn)入 container, 真是來去自如
也許你不了解這些命令參數(shù)的意思, 不要緊, 本文并不準(zhǔn)備當(dāng)一個(gè)解釋參數(shù)的大媽, docker 像 git, svn 那樣可以用?docker help <command>?來非常方便的查看這些幫助
覺得實(shí)用就趕緊試試吧!
from:?http://bg.biedalian.com/2014/11/20/docker-start.html
總結(jié)
以上是生活随笔為你收集整理的docker 入门教程指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈JVM的实现与垃圾回收机制
- 下一篇: git部署与基本命令汇总