天天看點

像apt和yum一樣使用docker

 apt和yum以及其他的包管理工具可以解決Linux下各種包的依賴關系,有了apt和yum基本不需要手動編譯源代碼解決依賴關系了。手動make源代碼,可能會引出好多個make,make到最後發現對核心版本有要求,再去make核心,最後換作業系統。

    使用apt和yum雖然友善了很多,但是還是有些時候會出問題,因為一個作業系統上的各種包大緻都是同一時期的,比如我的gcc是2015年10月的4.8,glibc是2015年7月的2.8。如果我想把我系統上的gcc換成2010年的4.1版本,那麼我可能glibc需要換成2011年之前的版本,然後又引出了一連串依賴關系,最終系統不能用了。

    以上這些稱之為“依賴地獄(dependency hell)”。我們部署一個應用的時候經常會出現這些煩人的問題,我在測試環境廢了老大勁部署好了,到了釋出生産的時候還得部署一遍,有可能生産與測試環境作業系統啥的還不一樣。使用虛拟機(Virtual Machine)可以解決一部分問題,制作好一個VM鏡像然後丢到HyperVisor上就行了,但是太重量級了。而使用容器(Container)可以很好的解決問題,尤其是docker使用了分層鏡像使得容器鏡像更容易釋出和遷移。

    docker目前已經不是一個簡單的容器軟體了,而是一個生态系統了。本文不會介紹那麼多,僅僅分享一下如何在日常開發中像apt和yum一樣來使用docker,反正我現在想安一個軟體(當然不是圖形化的),我都先用docker搜一下,比如nginx,tomcat,甚至DB2,IBM制作了官方的DB2-express鏡像放到docker hub上了。

    現在有這樣一個場景,我們的應用是個C語言程式,要求必須用gcc 5.1.0編譯,而且生産上在centos7上運作。但是我本地隻有一個ubuntu server 14.04,上面除了docker和ssh幾乎什麼都沒有安裝,我想用它開發我們的應用。我如果用apt安裝的話預設是4.8的。現在我用docker來解決這個問題。

使用docker安裝開發環境

首先我需要一個編輯器,例如vim或者emacs,當然最好直接用apt安裝,但是我可以用docker安一個編輯器。這樣做其實還有一個好處,後面說。

<a href="http://s4.51cto.com/wyfs02/M00/79/CE/wKiom1abgU7DG4bQAAB1rs4-CWA756.png" target="_blank"></a>

vim都不是official的,official的就是公司或者社群提供的官方版。但是有不少人都把自己定制的vim打成鏡像放到docker hub上了,可以拿過來用。星數最高的是golang-vim-dev,裡面應該內建了golang的開發環境,下個簡單的haron/vim。直接執行sudo docker pull haron/vim即可。

然後我們需要安裝gcc 5.1.0,先搜一下。

<a href="http://s2.51cto.com/wyfs02/M01/79/CD/wKioL1abgtrzvQYsAADJF0FfhZA313.png" target="_blank"></a>

這個有official的,official就是gcc官方提供的鏡像。執行docker pull gcc:5.1.0

<a href="http://s4.51cto.com/wyfs02/M02/79/CD/wKioL1abgvvz6RfgAACHxxnBADI609.png" target="_blank"></a>

最後我們還需要一個centos 7的運作環境,也有官方的,直接sudo docker pull centos:7就能下載下傳。

<a href="http://s4.51cto.com/wyfs02/M02/79/CE/wKiom1abgu2DNfgxAABdR_Gv6Xg178.png" target="_blank"></a>

把所有需要的東西pull下來,看一下本地的鏡像

<a href="http://s4.51cto.com/wyfs02/M02/79/CE/wKiom1abgv_Sjy-qAADXpP6z7Dw619.png" target="_blank"></a>

本地已經有了gcc5.1.0,centos7以及vim。

開發測試與運作

如何用vim打開一個檔案呢?

假如test.c的路徑為/home/niuxinli/test.c,使用

1

<code>docker run -it --</code><code>rm</code> <code>-</code><code>v</code> <code>/home/niuxinli/test</code><code>.c:</code><code>/test</code><code>.c haron</code><code>/vim</code> <code>vim </code><code>/test</code><code>.c</code>

就能在容器中打開test.c,如果嫌長可以寫一個alias或者腳本。

其中的各個選項的含義是:

2

3

4

<code>-it : interactive+</code><code>tty</code> <code>互動式并且配置設定一個僞終端</code>

<code>--</code><code>rm</code><code>: 退出容器時删掉容器</code>

<code>-</code><code>v</code> <code>/home/niuxinli/test</code><code>.c:</code><code>/test</code><code>.c 把主機</code><code>/home/niuxinli/test</code><code>.c映射到容器的</code><code>/test</code><code>.c, </code><code>v</code><code>是volume的意思</code>

<code>vim </code><code>/test</code><code>.c 在容器裡執行vim </code><code>/test</code><code>.c,這時vim指令看到的檔案系統目錄是容器裡的,需要用裡面的路徑</code>

我們使用另一種方式,直接把主機的工作目錄映射到容器裡。

建立一個工作目錄/home/niuxinli/appworkspace,然後挂載到容器裡,在容器裡用vim編輯各種源代碼。這樣有個好處就是我們可以讓開發人員隻能看到這個目錄裡面的東西,不會互相影響。

<code>docker run -it --</code><code>rm</code> <code>-</code><code>v</code> <code>/home/niuxinli/appworkspace</code><code>:</code><code>/appworkspace</code> <code>haron</code><code>/vim</code> <code>/bin/bash</code>

這次打開一個bash,在裡面在用vim打開/appworkspace裡的檔案。

<a href="http://s3.51cto.com/wyfs02/M00/79/CD/wKioL1abg7yh7SKAAADE_ve6AKM511.png" target="_blank"></a>

現在我們可以在appworkspace裡程式設計了,鏡像作者的配置還挺好的,自動縮進高亮都有。

<a href="http://s2.51cto.com/wyfs02/M02/79/CD/wKioL1abg9TgrQ7vAABJzj7bodQ833.png" target="_blank"></a>

儲存後在/home/niuxinli/appworkspace裡也産生了test.c。下面就是編譯了,同樣,我們把/home/niuxinli/appworkspace映射到gcc容器裡,然後起一個bash程序,用gcc編譯。

用gcc 5.1.0編譯完了,需要放倒centos7裡面運作。

<a href="http://s5.51cto.com/wyfs02/M01/79/CE/wKiom1abg8bBVf3BAAIdib39Omk580.png" target="_blank"></a>

總結

其實這樣做有個問題,我們這個helloworld特别簡單,僅用于示範。對于複雜的程式,還是會有依賴關系的,比如gcc鏡像裡的連結庫與centos7裡面的庫有沖突,可能在centos7裡面不能運作。正确的做法是制作一個centos7+gcc5.1的鏡像,既用這個容器編譯,也用它運作,開發測試生産用的編譯運作環境都一緻,這就是docker的build, ship and run any app anywhere。

本文轉自nxlhero 51CTO部落格,原文連結:http://blog.51cto.com/nxlhero/1735922,如需轉載請自行聯系原作者

繼續閱讀