實戰(zhàn)教程:如何Docker化你的Mono應用程序
譯文【51CTO.com快譯】Docker發(fā)布至今才過去了兩年多點的時間,現(xiàn)在從Docker中心(Docker Hub)可以下載的映像數(shù)量早已超過13000個。如果你剛接觸Docker,最恰當?shù)拿枋鼍褪牵@是一種可以在任何Linux服務器上運行的虛擬容器里面封裝應用程序及其依賴項的一種方式。相比在虛擬機和操作系統(tǒng)里面封裝應用程序,其要求低得多。
編寫Mono應用程序
C#是受歡迎程度僅次于Java和C/C++的一門編程語言,它是Windows上的.NET環(huán)境的一部分。C#發(fā)布后沒過多久,就啟動了Mono項目,旨在開發(fā)與NET相對應的環(huán)境,不過是在Linux和Mac上運行。盡管最初有人懷疑這是微軟通過專利權(quán)攻擊Linux的一種方式,不過Mono已得到了發(fā)展,如今成為跨平臺移動開發(fā)系統(tǒng)Xamarin的基礎(chǔ)。
.NET和Mono之間存在一些重大的區(qū)別,比如說WinForms和WPF只面向Windows;不過大體上來說,你拿來大多數(shù).NET編譯過的C#可執(zhí)行文件后,即可將它們拷貝到安裝有Mono的Linux系統(tǒng),用下面這個命令運行相應的應用程序:
- Mono AppName.exe
本文的目的是,舉例表明如何結(jié)合使用Docker和Mono技術(shù)。
為何是Docker?
為什么Docker那么好?假設(shè)你想在Nginx、Centos或PostgreSQL上試用某個軟件。要不是Docker,你可能得花幾個小時來完成安裝、配置等操作。要是有了Docker,實際上在幾秒鐘內(nèi)就能完成。
Docker是開源技術(shù),會出現(xiàn)在下一個Windows 2016 Server版本中,不過眼下它的使用僅限于Linux和Mac OS X。使用開源Oracle VirtualBox,你就可以安裝Docker,并在Windows上的VirtualBox里面的虛擬機中運行。比如說,你可以將Ununtu Server之類的標準Linux安裝到VirtualBox中,或者使用一款名為Boot2Docker的特殊的幫助應用程序(https://docs.docker.com/installation/windows/#running-docker)。
開始使用Docker
如果你剛接觸Docker,請閱讀用戶指南(http://docs.docker.com/userguide/)。你需要了解運行中的應用程序、在容器中工作以及讓應用程序成為守護進程。這不是很難;用戶指南頁面內(nèi)容齊全、通俗易懂。
構(gòu)建在Docker中運行的應用程序時,情況變得有點復雜。我用C#編寫的應用程序是一個簡單的“計算頭1000個素數(shù)”程序,使用埃拉托斯特尼篩法(sieve of Eratosthenes)。它輸出2到1000之間的所有素數(shù)。這個程序編譯好后在Windows上運行,也可以在安裝Mono的任何Linux系統(tǒng)上運行。
- using System;
- namespace sieve
- {
- class Program
- {
- const int HiPrime=1000;
- static readonly bool[] Primes = new bool[HiPrime];//by default they're all false
- private static void Main(string[] args)
- {
- for (var i = 2; i < HiPrime; i++)
- {
- Primes[i] = true;//set all potential primes true
- }
- for (var j = 2; j < HiPrime; j++)
- {
- if (!Primes[j]) continue;
- for (long p = 2; (p * j) < HiPrime; p++)
- {
- Primes[p * j] = false;
- }
- }
- for (var index = 2; index < Primes.Length; index++)
- {
- if (Primes[index]) Console.WriteLine(index);
- }
- }
- }
- }
我們想在容器里面運行這個應用程序。不妨先看一下更簡單的應用程序:Hello World,然后再回到這個話題。
為了力求完整,我們將在Ubuntu 14.04(Trusty Tahr)下運行Hello World。如果你安裝了Docker,可以使用這個命令,運行只有一行的Hello World。
- sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
圖1 運行echo
這里,Ubuntu 14.04就是容器。你第一次運行該應用程序時,它會下載容器,并安裝,整個過程大概只要1分鐘,如果是68MB大小的映像,時間稍微長一點。然后,它運行命令/bin/echo ‘Hello World’,然后在終端上輸出Hello World。第二次運行及之后運行時,它會立即運行。
所以想運行篩法應用程序,我們就要確保Mono已安裝,因為我們不僅需要編譯篩法,還要運行它。Docker注冊中心(https://registry.hub.docker.com)列出了一批Mono軟件庫,第一個軟件庫似乎很受歡迎。那第一個Mono鏈接可以將你引到該頁面(https://hub.docker.com/_/mono/)。
現(xiàn)在為了定義發(fā)生的操作,我們就要創(chuàng)建一個文件,具體來說名為Docker文件(Dockerfile)。
Dockerfile是什么?
Dockerfile是一個文本文件,里面含有獲取和構(gòu)建文件的所有指令。
參考頁面含有關(guān)于Docker文件的頁面。就示例篩法程序而言,這個文件很短。以下是我構(gòu)建的Dockerfile:
- FROM mono:latest
- ADD . /home/david/sieve
- RUN mcs /home/david/sieve/sieve.cs
- CMD [ "mono", "/home/david/sieve/sieve.exe" ]
命令使用大寫字母。FROM指定了使用的Mono映像。在這里,它是mono:latest。你可以指定你在此想使用哪個版本的Mono。ADD將文件拷貝到指定文件夾中,RUN使用Mono編譯器mcs來編譯,CMD使用Mono命令運行可執(zhí)行文件。
你第一次運行構(gòu)建的文件時,它會獲取本地沒有的任何內(nèi)容。這個命令負責構(gòu)建:
- sudo docker build -t sieve .
圖2 創(chuàng)建dockerfile
然后,這個命令運行篩法:
- sudo docker run sieve
圖3 運行sieve
瞧,一個Docker化的Mono應用程序就這樣問世了,顯示了最后一批素數(shù)?,F(xiàn)在,Docker方面可以進行諸多操作,比如說讓應用程序成為守護進程顯得特別重要,因為這讓Web服務器及其他服務器成為了可能。
結(jié)束語
Docker是一種非常方便、節(jié)省時間的方法,以便在不同的平臺上試用軟件。有了它,就很容易將軟件從開發(fā)環(huán)境始終如一地轉(zhuǎn)移到生產(chǎn)環(huán)境。它讓應用程序可以連同操作系統(tǒng)放入到容器中,好像在虛擬機上運行,不過占用的空間卻少得多。每個虛擬機都有一份操作系統(tǒng),可能會有數(shù)GB大小。換成是Docker,其實只有一個共享的操作系統(tǒng)。
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】
原文標題:Getting Started With Mono on Docker