如今我要話要說(shuō):一段時(shí)間以來(lái),我一直遲遲沒(méi)有認(rèn)真打量Docker,原因主要是缺少時(shí)間,再加上我們的贊助商兼母公司ZeroTurnaround最近決定完全退出運(yùn)維(Ops)行業(yè),致力于開(kāi)發(fā)者工具。作為開(kāi)發(fā)昔日版本自動(dòng)化工具的工程師,我在關(guān)注虛擬化或大型集群管理工具時(shí)往往興趣不太大。
于是我現(xiàn)在關(guān)注Docker領(lǐng)域可能有點(diǎn)晚,不過(guò)今天我還是要談?wù)凧ava開(kāi)發(fā)人員如何能夠穿過(guò)Docker現(xiàn)象這片叢林,更容易了解使用這種熱門新技術(shù)來(lái)簡(jiǎn)化開(kāi)發(fā)流程的種種好處。
我們?cè)诒疚闹袑⑻接懩憧梢杂肈ocker來(lái)完成什么以及如何認(rèn)識(shí)Docker這項(xiàng)新興技術(shù)。
安裝和入手
讓人大為意外的是,官方網(wǎng)站就有安裝Docker的操作說(shuō)明(https://docs.docker.com/installation/mac/#installation)。我不想具體介紹獲得Docker所需的具體步驟,所以為了讓這篇文章立足于更宏觀的層面,這一章節(jié)將非常簡(jiǎn)短。
要是你很幸運(yùn),在運(yùn)行一款直接支持Docker的操作系統(tǒng)(言外之意是一些Linux發(fā)行版),你就可以開(kāi)始上手了。使用你青睞的程序包管理器來(lái)安裝Docker,然后證實(shí)這個(gè)命令正常運(yùn)行:
要是你不是那么幸運(yùn),屬于運(yùn)行Windows或OS X的這一類人,那也大可不必?fù)?dān)心。boot2docker項(xiàng)目(http://boot2docker.io)會(huì)為你啟動(dòng)一個(gè)小型的輕量級(jí)Linux虛擬機(jī),那樣你就能享受使用Docker的樂(lè)趣了。
安裝boot2docker的過(guò)程很容易,已為我們準(zhǔn)備好了針對(duì)特定操作系統(tǒng)的安裝程序。運(yùn)行安裝程序也很簡(jiǎn)單,下面列出了面向Mac用戶的操作說(shuō)明:https://docs.docker.com/installation/mac/#installation。
使用上述命令證實(shí)boot2docker正常運(yùn)行,通過(guò)ssh進(jìn)入到boot2docker,運(yùn)行它:
就是這樣,我們已運(yùn)行了第一個(gè)Docker應(yīng)用程序。它沒(méi)有任何花哨的功能,只是回送一個(gè)消息而已,但這是為有用的系統(tǒng)安裝基礎(chǔ)設(shè)施的一個(gè)重要步驟。
那些重要的容器
雖然我們喜歡Groovy這門語(yǔ)言,但我們根本不是一家使用Groovy的公司,于是我們將著重介紹讓Java在容器中運(yùn)行。
好消息是,即便在這里,一切工作都為我們做好了。有一個(gè)官方軟件庫(kù):dockerfile/java(https://github.com/dockerfile/java),附有面向Java的Docker映像。確切地說(shuō),這些并不是映像,而是告訴Docker如何創(chuàng)建實(shí)際映像的Docker文件(dockerfile)。
如果你看一下面向Java 8的Docker文件(https://github.com/dockerfile/java/blob/master/oracle-java8/Dockerfile),立馬就會(huì)注意到:Java 8映像基于常規(guī)的Ubuntu映像,你可以像對(duì)待平常的Ubuntu機(jī)器那樣來(lái)安裝Java。
另外,它定義了JAVA_HOME以及需要執(zhí)行的默認(rèn)Docker命令:
現(xiàn)在,我們的Docker容器已配備了Java,能夠運(yùn)行Java命令了:
我們可以運(yùn)行在我們的Docker環(huán)境中執(zhí)行的隨機(jī)性Java命令。它并不為此使用標(biāo)準(zhǔn)的虛擬機(jī),所以你根本不用擔(dān)心虛擬機(jī)開(kāi)銷問(wèn)題。
瞧瞧這有多么簡(jiǎn)單、多么易于移植?!
進(jìn)一步個(gè)性化
我知道你在想什么:這相當(dāng)酷,但現(xiàn)在我不得不做一個(gè)Docker文件,以便下載和安裝Maven,克隆我的項(xiàng)目軟件庫(kù),然后構(gòu)建它,并且在這個(gè)過(guò)程中下載一半的互聯(lián)網(wǎng)。別擔(dān)心,Docker可以輕松訪問(wèn)你的主機(jī)文件系統(tǒng),所以除了對(duì)Java的訪問(wèn)外,你沒(méi)必要提供太多的東西。
的確,你可以擁有它。Linux顯然具有作為Docker原生操作系統(tǒng)的優(yōu)點(diǎn),所以映射起來(lái)非常順暢無(wú)阻。Docker命令只要接收一個(gè)參數(shù):-v,即可讓目錄映射到容器里面的某個(gè)對(duì)象。
比如說(shuō),下面這個(gè)命令將與容器共享我的~/repo目錄。
OS X用戶也不必?fù)?dān)心,因?yàn)樽詁oot2docker 1.3.1以來(lái),你的主目錄默認(rèn)情況下就與boot2docker虛擬機(jī)共享,所以-v也會(huì)正常發(fā)揮作用:
Windows用戶不用擔(dān)心,完全有一個(gè)版本可以讓你確保正常運(yùn)行(參閱http://www.incrediblemolk.com/sharing-a-windows-folder-with-the-boot2docker-vm/)。簡(jiǎn)而言之,你不得不安裝VirtualBox Guest Additions,并且在你的主機(jī)和boot2docker虛擬機(jī)之間手動(dòng)映射一個(gè)文件夾。如果你明白自己在做什么,或者遵守實(shí)用操作指南,就像上面那個(gè)鏈接,這部分相當(dāng)簡(jiǎn)單直觀。
現(xiàn)在如何在Docker容器里面運(yùn)行實(shí)際的Java應(yīng)用程序已相當(dāng)一目了然了。你的源代碼位于主機(jī)上,你同樣可以在主機(jī)上編輯源代碼;甚至可以在主機(jī)上構(gòu)建源代碼,因?yàn)檫\(yùn)維活動(dòng)并不從源代碼開(kāi)始,而是從預(yù)制構(gòu)件開(kāi)始。之后,它就跟將它放到正確的位置,使用正確的命令來(lái)啟動(dòng)它一樣簡(jiǎn)單。
下面是Java項(xiàng)目的例子,我將使用Spring Boot(http://projects.spring.io/spring-boot/)來(lái)啟動(dòng)該應(yīng)用程序。
所以通常來(lái)說(shuō),我在自己的機(jī)器上會(huì)這樣運(yùn)行它:
另外證實(shí)該應(yīng)用程序在端口8080上運(yùn)行。想在Docker容器里面運(yùn)行它,我只要做同樣的事情,不過(guò)需要提供端口映射,那樣我就能從主機(jī)訪問(wèn)它:
該命令的輸出結(jié)果非常容易預(yù)測(cè),它啟動(dòng)Spring Boot應(yīng)用程序,并輸出顯示所有初始化內(nèi)容。為了簡(jiǎn)便起見(jiàn),這里就不附上了,但它看起來(lái)就像這個(gè)pastebin。
瞧!我現(xiàn)在可以通過(guò)主機(jī)瀏覽器來(lái)訪問(wèn)它了!只要使用下面這個(gè)命令,就很容易獲得確切的IP,boot2docker提供了被映射到docker的接口:
結(jié)束語(yǔ):Docker是一種對(duì)開(kāi)發(fā)人員友好的運(yùn)維工具
我可以有把握地說(shuō),Docker是一種深思熟慮的工具,幾乎一切都可以從命令行來(lái)加以訪問(wèn)。
我們?cè)诒疚闹蟹治隽巳绾螐腄ocker容器入手,以便為Java項(xiàng)目建立一個(gè)易于移植的開(kāi)發(fā)環(huán)境。這也許可以為新項(xiàng)目減少安裝方面的難度,又不必犧牲通常使用的環(huán)境為你提供的好處或性能:平常使用的集成開(kāi)發(fā)環(huán)境(IDE)、自動(dòng)化測(cè)試、JRebel(厚著臉皮做下廣告)等工具及其他。
對(duì)于Java開(kāi)發(fā)人員而言,Docker有助于在一個(gè)干凈的環(huán)境中隔離我們的應(yīng)用程序,所以多少緩解了無(wú)法預(yù)測(cè)“是否可以在我的機(jī)器上運(yùn)行”的問(wèn)題。隔離之所以很重要,是因?yàn)樗鼫p小了我們使用的軟件環(huán)境的復(fù)雜性。另外,想得益于使用Docker,你沒(méi)必要深入鉆研容器世界,就可以開(kāi)始將應(yīng)用程序部署到成千上萬(wàn)個(gè)節(jié)點(diǎn)。與開(kāi)發(fā)人員的機(jī)器隔離開(kāi)來(lái)是一大有利條件。
Docker擁有直觀的用戶界面,進(jìn)一步減小了這種復(fù)雜性,它已成為任何開(kāi)發(fā)人員的一款出色工具。使用它的額外好處包括,它簡(jiǎn)化了運(yùn)維人員的工作,而我們都知道這有多重要。
本文來(lái)源:51CTO 布加迪編譯