1. 程式人生 > >docker 入門教程指南

docker 入門教程指南

關於 docker

今天雲平臺的同事提到, 現在的運維就是惡性迴圈, 因為大家都在申請機器, 顯然的是, 大家申請機器都是按照自己的峰值申請的, 而為了保證突發狀況, 如 ddos, 雙11 等, 申請者甚至會兩倍於自己的峰值去估算自己的服務. 由於資源緊張, 雲平臺會對其削減, 因為雲平臺也要為公司減少運維成本, 可能原來申請10臺機器最後變成給5臺, 而最終有經驗的申請者會直接申請20臺, 然後等削減成10臺(正如魯迅所說, 如果不說把屋頂掀了, 中國人根本不會同意在屋裡裝個窗戶)

申請容易而回收難, 雲平臺並沒有能力去監控每臺機器的使用量, 就算他們找到使用資源大大浪費的機器, 他們也難以說服擁有機器的團隊回收其機器, 最終, 大量超高配的機器(比如64g 記憶體, 16核), 就貢獻著幾百的 qps, 造成極大的浪費

也許自動化運維是每個雲平臺的目標, 將運維自動化, 私有化, 最後公有化, 而當今大熱 docker 就是解決運維困境的一劑良藥

什麼是 docker? 為了更好理解, 你可以直接和別人說它是虛擬機器, 實際上 docker 並不是虛擬機器, 它做的是 linux 的隔離, 但它的隔離做的如此之真實以至於讓人覺得自己擁有可以一臺完整的 linux 系統

那 docker 和 虛擬機器具體是什麼區別呢, 虛擬機器在底層模擬出各種硬體, cpu, 硬碟之類的, 而 docker 是在軟體層面給資源分組, docker 效能無限接近原生, 因為 docker 用的就是系統自己的程序, 而虛擬機器做的再好, 也做不出原生的感覺

docker 的隔離技術源自於 Linux 容器 LXC(linux container), 聽起名字就知道, 這和沙箱應該差不多, 可以把東西分開放, 也就是隔離的意思, 甚至可以在某些倉庫中看到 docker 的名字叫 lxc-docker

而 LXC 又是基於 cgroup 的 namespace, chroot 等, 由於我並不懂這些, 但 namespace 可以幫助我們理解, 就像我們寫程式一樣, 這是一個名稱空間, 與其他 namespace 相區別

cgroup 對於 docker 是至關重要的, 瞭解它才會覺得 docker 不神祕, cgroup 全稱為 control group, 是 linux 核心提供的功能, 簡單的說, 它的作用就是把系統執行的程序按使用者自定義的群組區分, 也就是說 一個 docker, 一個 group

cgroup 有限制使用資源的能力

  • blkio -- 這個子系統為塊裝置設定輸入/輸出限制,比如物理裝置(磁碟,固態硬碟,USB 等等)

  • cpu -- 這個子系統使用排程程式提供對 CPU 的 cgroup 任務訪問

  • cpuacct -- 這個子系統自動生成 cgroup 中任務所使用的 CPU 報告

  • cpuset -- 這個子系統為 cgroup 中的任務分配獨立 CPU(在多核系統)和記憶體節點

  • devices -- 這個子系統可允許或者拒絕 cgroup 中的任務訪問裝置

  • freezer -- 這個子系統掛起或者恢復 cgroup 中的任務

  • memory -- 這個子系統設定 cgroup 中任務使用的記憶體限制,並自動生成由那些任務使用的記憶體資源報告

  • net_cls -- 這個子系統使用等級識別符(classid)標記網路資料包,可允許 Linux 流量控制程式(tc)識別從具體 cgroup 中生成的資料包

  • ns -- 名稱空間子系統

看到上面的 cgroup 配置屬性真的是恍然大悟, docker 成為當今最熱的運維神器一點都不奇怪, 它簡直就是為了運維而生, 彈性計算資源報表暫停服務資源限制 根本不在話下

入門教程

幫 docker 吹了這麼多牛, 得說說具體怎麼用

安裝

不管你是什麼系統, 你應該首先嚐試指令碼一鍵安裝, 也是官方推薦的方法

sudo curl -sL https://get.docker.io/ | sh 

如果你很不幸的失敗了, 那你也許是苦逼的 centos 或者 redhat 使用者, 那建議你使用

yum search docker

運氣好的話你可以找到一個叫 docker.io 的程式, 沒錯就是他

如果再不行, 恩, 那就只能上官網看英語安裝文件了

不得不承認我至今都沒有成功的從原始碼安裝過

執行

docker 也需要一個 daemon(後臺), 所以首先要啟動 docker 服務(不知為啥很多教程根本不提這一步)

sudo docker -d
# 或者
sudo docker -H tcp://127.0.0.1:4243 -d

如果沒報啥錯誤, 並且 docker images 也能看到一個列表目錄而不是報錯, 那少年你一定是成功了

docker 依賴系統模組 bridge, 可以用 modprobe bridge 來檢視有沒有

阿里雲預設是啟動不了 docker 的, 輸入 route del -net 172.16.0.0 netmask 255.240.0.0 可解決

使用

使用前你不得不瞭解兩個概念, 一個叫 image, 一個叫 container, 對初學者來說這倆可能意思有點接近或者混淆, 看這些比喻也許你一下子就明白了, image 是隻讀的模板, 用來生成你需要的 container, 而 container 也可以變成新的 image

使用 docker 就是使用 container, 而 container 來自於 image, 因此你需要先有個 image, docker 的操作像極了 git, 你可以這樣下載一個 image

docker pull ubuntu

這樣你就有了一個 ubuntu image, 可以用 docker images 看到這個新的 image

使用這個 image, 可以向它傳送一個命令, docker run ubuntu echo hello docker

當然, 沒人會這麼無聊, come on! 我們需要像虛擬機器一樣使用它, 搭建屬於我們自己的環境, 自己的系統, 把搭建完成的 container 變成一個新的 image, 這才是我們的目標!

docker run -it ubuntu /bin/bash

沒錯, 這條神奇的命令終於讓 docker 變得有趣起來, 它讓我們像 ssh 進入虛擬機器一樣操作, 翱翔

退出可以用 exit, 或者 CTRL + D

可惜的是, 一旦退出, container 不在維持了, 我們不可能一直在 container 中不出來, 但我們也要保持 container 的狀態, 那怎麼辦呢

docker run -itd ubuntu /bin/bash # 後臺執行 container

docker ps # 找到後臺執行的 container id 或暱稱

docker attach <container id> # 重新 attach 這個 container

注意, 這時候如果 exit 依然會終止這個 container, 要想 detach 跳出一個 container, 你需要使用 CTRL + P, CTRL + Q, 這樣我們就又能用 attach 重新進入 container, 真是來去自如

也許你不瞭解這些命令引數的意思, 不要緊, 本文並不準備當一個解釋引數的大媽, docker 像 git, svn 那樣可以用 docker help <command> 來非常方便的檢視這些幫助

覺得實用就趕緊試試吧!

from: http://bg.biedalian.com/2014/11/20/docker-start.html