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