中国领先的IT技术网站
|
|

Java开发人员:如何穿过Docker现象这片"丛林"

今天我们来谈谈Java开发人员如何能够穿过Docker现象这片丛林,更容易了解使用这种热门新技术来简化开发流程的种种好处。我们在本文中将探讨你可以用Docker来完成什么以及如何认识Docker这项新兴技术。

作者:布加迪编译来源:51CTO|2015-02-13 09:13

沙龙活动 | 去哪儿、陌陌、ThoughtWorks在自动化运维中的实践!10.28不见不散!


如今我要话要说:一段时间以来,我一直迟迟没有认真打量Docker,原因主要是缺少时间,再加上我们的赞助商兼母公司ZeroTurnaround最近决定完全退出运维(Ops)行业,致力于开发者工具。作为开发昔日版本自动化工具的工程师,我在关注虚拟化或大型集群管理工具时往往兴趣不太大。

于是我现在关注Docker领域可能有点晚,不过今天我还是要谈谈Java开发人员如何能够穿过Docker现象这片丛林,更容易了解使用这种热门新技术来简化开发流程的种种好处。

我们在本文中将探讨你可以用Docker来完成什么以及如何认识Docker这项新兴技术。

安装和入手

让人大为意外的是,官方网站就有安装Docker的操作说明(https://docs.docker.com/installation/mac/#installation)。我不想具体介绍获得Docker所需的具体步骤,所以为了让这篇文章立足于更宏观的层面,这一章节将非常简短。

要是你很幸运,在运行一款直接支持Docker的操作系统(言外之意是一些Linux发行版),你就可以开始上手了。使用你青睐的程序包管理器来安装Docker,然后证实这个命令正常运行:

  1. $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' 
  2. Hello world

要是你不是那么幸运,属于运行Windows或OS X的这一类人,那也大可不必担心。boot2docker项目(http://boot2docker.io)会为你启动一个小型的轻量级Linux虚拟机,那样你就能享受使用Docker的乐趣了。

安装boot2docker的过程很容易,已为我们准备好了针对特定操作系统的安装程序。运行安装程序也很简单,下面列出了面向Mac用户的操作说明:https://docs.docker.com/installation/mac/#installation。

使用上述命令证实boot2docker正常运行,通过ssh进入到boot2docker,运行它:

  1. $ boot2docker ssh 
  2. ## . 
  3. ## ## ## == 
  4. ## ## ## ## === 
  5. /""""""""""""""""\___/ === 
  6. ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ 
  7. \______ o __/ 
  8. \ \ __/ 
  9. \____\______/ 
  10. _ _ ____ _ _ 
  11. | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ 
  12. '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| 
  13. | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | 
  14. |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| 
  15. Boot2Docker version 1.3.1, build master : 9a31a68 - Fri Oct 31 03:14:34 UTC 2014 
  16. Docker version 1.3.1, build 4e9bbfa 
  17.  
  18. docker@boot2docker:~$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' 
  19. Hello world 

就是这样,我们已运行了第一个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命令:

  1. # 定义工作目录。
  2. WORKDIR /data 
  3. # 定义常用的JAVA_HOME变量 
  4. ENV JAVA_HOME /usr/lib/jvm/java-8-oracle 
  5. # 定义默认命令。 
  6. CMD ["bash"

现在,我们的Docker容器已配备了Java,能够运行Java命令了:

  1. docker run -it --rm dockerfile/java:oracle-java8 java -version 
  2. java version "1.8.0_25" 
  3. Java(TM) SE Runtime Environment (build 1.8.0_25-b17) 
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 

我们可以运行在我们的Docker环境中执行的随机性Java命令。它并不为此使用标准的虚拟机,所以你根本不用担心虚拟机开销问题。

瞧瞧这有多么简单、多么易于移植?!

进一步个性化

我知道你在想什么:这相当酷,但现在我不得不做一个Docker文件,以便下载和安装Maven,克隆我的项目软件库,然后构建它,并且在这个过程中下载一半的互联网。别担心,Docker可以轻松访问你的主机文件系统,所以除了对Java的访问外,你没必要提供太多的东西。

的确,你可以拥有它。Linux显然具有作为Docker原生操作系统的优点,所以映射起来非常顺畅无阻。Docker命令只要接收一个参数:-v,即可让目录映射到容器里面的某个对象。

比如说,下面这个命令将与容器共享我的~/repo目录。

  1. docker run -v /Users/shelajev/repo:/opt/repo ubuntu ls -la /opt/repo/zt-zip 

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/)来启动该应用程序。

所以通常来说,我在自己的机器上会这样运行它:

  1. shelajev@shrimp ~/repo/tmp/gs-spring-boot/complete ‹master› 
  2. $ java -jar target/gs-spring-boot-0.1.0.jar 

另外证实该应用程序在端口8080上运行。想在Docker容器里面运行它,我只要做同样的事情,不过需要提供端口映射,那样我就能从主机访问它:

  1. docker run -v /Users/shelajev/repo:/opt/repo -p 8080:8080 --rm dockerfile/java:oracle-java8 java -jar /opt/repo/tmp/gs-spring-boot/complete/target/gs-spring-boot-0.1.0.jar 

该命令的输出结果非常容易预测,它启动Spring Boot应用程序,并输出显示所有初始化内容。为了简便起见,这里就不附上了,但它看起来就像这个pastebin。

瞧!我现在可以通过主机浏览器来访问它了!只要使用下面这个命令,就很容易获得确切的IP,boot2docker提供了被映射到docker的接口:

  1. open http://$(boot2docker ip 2>/dev/null)/ 

结束语:Docker是一种对开发人员友好的运维工具

我可以有把握地说,Docker是一种深思熟虑的工具,几乎一切都可以从命令行来加以访问。

我们在本文中分析了如何从Docker容器入手,以便为Java项目建立一个易于移植的开发环境。这也许可以为新项目减少安装方面的难度,又不必牺牲通常使用的环境为你提供的好处或性能:平常使用的集成开发环境(IDE)、自动化测试、JRebel(厚着脸皮做下广告)等工具及其他。

对于Java开发人员而言,Docker有助于在一个干净的环境中隔离我们的应用程序,所以多少缓解了无法预测“是否可以在我的机器上运行”的问题。隔离之所以很重要,是因为它减小了我们使用的软件环境的复杂性。另外,想得益于使用Docker,你没必要深入钻研容器世界,就可以开始将应用程序部署到成千上万个节点。与开发人员的机器隔离开来是一大有利条件。

Docker拥有直观的用户界面,进一步减小了这种复杂性,它已成为任何开发人员的一款出色工具。使用它的额外好处包括,它简化了运维人员的工作,而我们都知道这有多重要。

英文原文链接:http://zeroturnaround.com/rebellabs/docker-for-java-developers-how-to-sandbox-your-app-in-a-clean-environme

【编辑推荐】

  1. 从SDN以及Docker看网络模型发生的变革
  2. 基于Docker开发的PaaS平台 DINP
  3. Docker 1.5新特性:支持IPV6、只读容器、容器运行监控,还有彩蛋
  4. 完美应对企业生产环境的挑战,Docker是否已做好准备?
  5. 赞!Docker生态系统常用组件介绍 开启快乐开发之旅
【责任编辑:Ophira TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

精通JBuilder 2006

JBuilder 2006是一款强大的Java企业级开发平台,其集成了几乎所有的Java技术,涵盖了软件开发生命周期的各个过程。本书深入浅出地介绍了JBu...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× Python最火的编程语言