Docker的特性解析
Docker簡(jiǎn)介與入門(mén):http://segmentfault.com/blog/p_chou/1190000000448808
??????? Docker是個(gè)新生的事物,概念類似虛擬化。網(wǎng)上關(guān)于Docker入門(mén)的東西已經(jīng)很多了。不過(guò)本文探討了Docker的特點(diǎn)、特性、原理,還介紹了具有中國(guó)特色的安裝測(cè)試過(guò)程,另外還談到了Docker的社區(qū)生態(tài)和Dockerfile,并使用Dockerfile構(gòu)建一個(gè)nginx環(huán)境。
原文:Docker簡(jiǎn)介與入門(mén)
緣起
在幾個(gè)月前聽(tīng)說(shuō)Docker,但是一直沒(méi)有時(shí)間去研究,前一段時(shí)間趁著azure免費(fèi)試用,趕緊實(shí)驗(yàn)一下,但是卡在了ubuntu基礎(chǔ)鏡像的下載上(由于國(guó)內(nèi)網(wǎng)絡(luò)的特殊原因),所以也就擱淺了。在逛Segmentfault的時(shí)候,看到上面有個(gè)Docker子站問(wèn)答,逛了逛果然有干貨,于是重新試了一下,這里把經(jīng)驗(yàn)和體會(huì)分享一下。
Docker簡(jiǎn)介
我覺(jué)得簡(jiǎn)單來(lái)說(shuō),Docker就是一個(gè)應(yīng)用程序執(zhí)行容器,類似虛擬機(jī)的概念。但是與虛擬化技術(shù)的不同點(diǎn)在于下面幾點(diǎn):
Docker的主要特性如下(摘自Docker:具備一致性的自動(dòng)化軟件部署):
目前Docker正處在開(kāi)發(fā)階段,官方不建議用于生產(chǎn)環(huán)境。另外,Docker是基于Ubuntu開(kāi)發(fā)的,所以官方推薦將其安裝在Ubuntu的操作系統(tǒng)上,目前只能安裝在linux系統(tǒng)上。
Docker的使用入門(mén)
Docker官方的安裝指導(dǎo)挺詳細(xì)的。但是由于國(guó)內(nèi)的特殊情況,我這里基于這個(gè)安裝指導(dǎo),給出適用于國(guó)內(nèi)開(kāi)發(fā)者的入門(mén)過(guò)程。基于Ubuntu Precise 12.04 (LTS) (64-bit),推薦這個(gè)版本,其他版本參考官方安裝手冊(cè)。
Docker的安裝
首先,Docker官方聲稱最好是運(yùn)行在Linux內(nèi)核3.8以上,所以要先進(jìn)行內(nèi)核升級(jí)
# install the backported kernel sudo apt-get update sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring# reboot sudo reboot添加Docker倉(cāng)庫(kù)的key:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9添加鏡像,這里直接用俄羅斯的Yandex
sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list" sudo apt-get update安裝Docker
sudo apt-get install lxc-docker一般上面的步驟不會(huì)有任何問(wèn)題。
Docker鏡像下載
Docker運(yùn)行至少需要一個(gè)ubuntu的基礎(chǔ)鏡像,這個(gè)鏡像會(huì)在你初次嘗試執(zhí)行時(shí)自動(dòng)下載,不過(guò)從國(guó)內(nèi)直接用基本上就別想了,需要使用代理。這里用Docker中文社區(qū)提供的代理。出處1,出處2。
修改/etc/default/docker文件,取消注釋http_proxy的部分:
# If you need Docker to use an HTTP proxy, it can also be specified here. export http_proxy=http://192.241.209.203:8384/經(jīng)過(guò)筆者測(cè)試,上面這個(gè)代理也不是很穩(wěn)定,可能用的人比較多吧。
可用的代理地址(持續(xù)關(guān)注中)
http://192.241.209.203:8384
然后,你就可以執(zhí)行下面的命令,測(cè)試執(zhí)行了,由于代理不是很穩(wěn)定,可能需要多嘗試幾次(淡定):
sudo docker run -i -t ubuntu /bin/bash下面這個(gè)截圖是我成功pull完成,并測(cè)試hello world成功(大概嘗試了3-4次):
Docker的社區(qū)和生態(tài)
倉(cāng)庫(kù)和鏡像
評(píng)估一項(xiàng)開(kāi)源技術(shù)很大程度上需要關(guān)注它的社區(qū)和生態(tài)。Docker的生態(tài)是通過(guò)推送和拉取特定的“鏡像(image)包”來(lái)展開(kāi)的。你可以從docker index上搜索需要的鏡像。也可以通過(guò)下面的命令搜索:
sudo docker search鏡像可以看作是包含有某些軟件的容器系統(tǒng),比如ubuntu就是一個(gè)官方的基礎(chǔ)鏡像,很多鏡像都是基于這個(gè)鏡像“衍生”,該鏡像包含基本的ubuntu系統(tǒng)。再比如,hipache是一個(gè)官方的鏡像容器,運(yùn)行后可以支持http和websocket的代理服務(wù),而這個(gè)鏡像本身又基于ubuntu。
通過(guò)pull來(lái)拉取鏡像,將鏡像下載到本地,比如
sudo docker pull hipache通過(guò)images查看現(xiàn)在有哪些鏡像:
sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 13.10 9f676bd305a4 6 weeks ago 178 MB ubuntu saucy 9f676bd305a4 6 weeks ago 178 MB ubuntu 13.04 eb601b8965b8 6 weeks ago 166.5 MB ubuntu raring eb601b8965b8 6 weeks ago 166.5 MB ubuntu 12.10 5ac751e8d623 6 weeks ago 161 MB ubuntu quantal 5ac751e8d623 6 weeks ago 161 MB ubuntu 10.04 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu lucid 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu 12.04 9cd978db300e 6 weeks ago 204.4 MB ubuntu latest 9cd978db300e 6 weeks ago 204.4 MB ubuntu precise 9cd978db300e 6 weeks ago 204.4 MB上面的都是鏡像,都從屬于ubuntu倉(cāng)庫(kù)(一般倉(cāng)庫(kù)名應(yīng)該是username/repository格式,如果是直接以repository作為倉(cāng)庫(kù)名的,是指官方發(fā)布的倉(cāng)庫(kù))。我們拉取ubuntu的時(shí)候,實(shí)際上是把倉(cāng)庫(kù)里的鏡像都拉下來(lái)了。每個(gè)鏡像都有一個(gè)唯一的IMAGE ID,和一個(gè)易于記憶的TAG,可以通過(guò)IMAGE ID的前幾位或者repository:TAG來(lái)標(biāo)識(shí)一個(gè)鏡像。
Dockerfile和通過(guò)Dockerfile來(lái)構(gòu)建Nginx容器
除了pull,鏡像也可以通過(guò)"編譯"得到,這里的"編譯"是指一種構(gòu)建行為,通過(guò)手動(dòng)編寫(xiě)或者從github獲取Dockerfile來(lái)構(gòu)建一個(gè)鏡像。可以把Dockerfile看成是一個(gè)腳本,這個(gè)腳本會(huì)在容器每次啟動(dòng)時(shí)執(zhí)行。一般在Dockerfile里面需要編寫(xiě)基礎(chǔ)軟件的安裝腳本和配置腳本。下面這個(gè)Dockerfile是個(gè)例子:
# # Ubuntu Dockerfile # # https://github.com/dockerfile/ubuntu ## Pull base image. FROM ubuntu:12.10# Update OS. RUN echo "deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade -y# Install basic packages. RUN apt-get install -y software-properties-common RUN apt-get install -y curl git htop unzip vim wget# Add files. ADD root/.bashrc /root/.bashrc ADD root/.gitconfig /root/.gitconfig ADD root/scripts /root/scripts# Set working directory. ENV HOME /root WORKDIR /rootFROM指令表示這次構(gòu)建需要基于ubuntu倉(cāng)庫(kù)的12.10這個(gè)TAG的鏡像,如果本地不存在這個(gè)鏡像的話,會(huì)自動(dòng)下載鏡像。鏡像實(shí)際上就是編譯好的結(jié)果。向上面這個(gè)Dockerfile,在原始ubuntu的基礎(chǔ)上安裝了很多常用的軟件。
docker官方有Dockerfile的教程
實(shí)踐
首先確保你已經(jīng)完成上面的安裝步驟,并拉取到基礎(chǔ)鏡像ubuntu:12.10。
現(xiàn)在我們用上面的Dockerfile來(lái)構(gòu)建這個(gè)倉(cāng)庫(kù)(上面的Dockerfile實(shí)際上是github dockerfile項(xiàng)目的基本倉(cāng)庫(kù)dockerfile/ubuntu,所下面的命令直接從github下載Dockerfile來(lái)構(gòu)建)
sudo docker build -t="dockerfile/ubuntu" github.com/dockerfile/ubuntu下面是最后構(gòu)建成功時(shí)的輸出:
... Processing triggers for ureadahead ...---> 0a4392cf8e2d Step 6 : ADD root/.bashrc /root/.bashrc---> b0e86f348c09 Step 7 : ADD root/.gitconfig /root/.gitconfig---> e2a9c001d457 Step 8 : ADD root/scripts /root/scripts---> 678febabdbdc Step 9 : ENV HOME /root---> Running in c4afef311cf1---> eaa3ae3277a8 Step 10 : WORKDIR /root---> Running in d50c273c75b8---> c9ecf5bc3227 Successfully built c9ecf5bc3227 Removing intermediate container 1a3d1f794c49 Removing intermediate container 9f72df8abb63 Removing intermediate container 5694d1e3e77e Removing intermediate container 6a184821f89c Removing intermediate container 8195bd05fc36 Removing intermediate container d50c273c75b8 Removing intermediate container 70de07353ecf Removing intermediate container 73e3f6204613 Removing intermediate container 5dd948415981 Removing intermediate container c4afef311cf1此時(shí)會(huì)多出一個(gè)倉(cāng)庫(kù):
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/ubuntu latest c9ecf5bc3227 About a minute ago 294.2 MB ...現(xiàn)在我們可以來(lái)構(gòu)建dockerfile/nginx了(當(dāng)然,從一開(kāi)始你就可以直接pull這個(gè)鏡像)
sudo docker build -t="dockerfile/nginx" github.com/dockerfile/nginx完成后,會(huì)看到編譯好的鏡像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/nginx latest 68508350c656 About a minute ago 308.3 MB dockerfile/ubuntu latest c9ecf5bc3227 16 minutes ago 294.2 MB ...現(xiàn)在是時(shí)候看到真正的效果了!用下面這個(gè)命令運(yùn)行容器:
sudo docker run -d -p 80:80 dockerfile/nginx這個(gè)命令會(huì)以daemon的方式運(yùn)行容器,通過(guò)下面命令查看正在運(yùn)行的容器:
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98c474a7dd6a dockerfile/nginx:latest nginx 6 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp trusting_hawking訪問(wèn)你主機(jī)的80端口,可以看到nginx的歡迎頁(yè)面了!這時(shí),我們來(lái)看看本機(jī)的進(jìn)程sudo ps -ef:
root 1428 952 0 15:19 ? 00:00:00 nginx: master process nginx root 1429 417 0 15:19 ? 00:00:00 /sbin/udevd --daemon www-data 1441 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1442 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1443 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1444 1428 0 15:19 ? 00:00:00 nginx: worker process似乎有些接近事物的本質(zhì)了!nginx的進(jìn)程實(shí)際上是在本機(jī)上的,這意味著,容器中程序的執(zhí)行仍然是使用本機(jī)操作系統(tǒng)的,容器并不自己構(gòu)建操作系統(tǒng),而是以某種隔離的方式依賴本機(jī)操作系統(tǒng)工作。這就是Docker和虛擬機(jī)的本質(zhì)區(qū)別。
你可以像下面這樣,將本機(jī)的目錄映射給這個(gè)"nginx容器"。<sites-enabled-dir>目錄下應(yīng)該有nginx的配置文件片段
docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginxPS:這步筆者沒(méi)有成功,日志路徑是可以map的,但是sites-enable-dir中的配置始終不行。繼續(xù)診斷中。
鏡像的共享與Dockfile的分發(fā)
可以共享你的鏡像和用來(lái)構(gòu)建的Dockfile分享給社區(qū):
- Docker index是官方的鏡像目錄,可以從里面得到大量的預(yù)編譯好的鏡像
- Dockerfile Project一個(gè)托管Dockerfile的倉(cāng)庫(kù)集合
原理
總的來(lái)說(shuō)Docker的核心技術(shù)如下:
- 命名空間
- AUFS(advanced multi layered unification filesystem)
- cgroup
由于本人才疏學(xué)淺,下面給出一些參考資料,有興趣的朋友可以擴(kuò)展閱讀一下,一定會(huì)對(duì)Docker有更深刻的認(rèn)識(shí)的:
PaaS under the hood, episode 1: kernel namespaces
PaaS Under the Hood, Episode 2: cgroups
PAAS Under the Hood, Episode 3: AUFS
PaaS Under the Hood, Episode 4: GRSEC
PaaS under the hood, episode 5: Distributed routing with Hipache
Under the Hood系列
LXC (Linux 虛擬環(huán)境)簡(jiǎn)單介紹
docker原理簡(jiǎn)介
參考資料
Docker官方
Docker:具備一致性的自動(dòng)化軟件部署
Dockerfile的教程
一些Docker的社區(qū)資源:
Segmentfault的Docker子站問(wèn)答
Docker中文社區(qū)
Docker中文文檔
總結(jié)
以上是生活随笔為你收集整理的Docker的特性解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker的官网在线--中文教程
- 下一篇: 3亿Docker容器部署的挑战及应对方案