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