面向Java开发人员的Docker:简介

本文是我们学院课程中名为《 面向Java开发人员的Docker教程 》的一部分。

在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Docker的应用程序。 我们涵盖了广泛的主题,从通过命令行的Docker到开发,测试,部署和持续集成。 通过我们简单易懂的教程,您将能够在最短的时间内启动并运行自己的项目。 在这里查看

1.简介

如果您还没有听说过Docker ,那么您可能在过去几年中在太阳系的其他星球上度过了。 Docker席卷了我们的行业,并且立即改变了许多公认的软件开发以及运营实践和模式。 如今,几乎每个组织都在使用Docker (或等效的Docker ),甚至在生产中也使用勇敢的Docker ,并且它的采用正以惊人的速度增长。

在本教程中,我们将讨论Docker如何帮助我们Java开发人员完成日常任务。 本教程包括几个部分,我们将探讨Docker的不同方面及其在Java应用程序开发中的适用性。

我们将从学习基础知识开始:

  • 为什么我们应该花时间学习Docker
  • 了解Docker命令行工具
  • 使用REST外观与Docker对话

然后,我们将紧接着在Java应用程序的上下文中继续讨论与Docker相关的主题:

  • 建造
  • 发展
  • 测试中
  • 部署中
  • 持续集成/交付

我们将通过的材料假定您对Docker有一定的基本了解,并且至少已经在计算机上安装17.06.1-ce版本(如果您本身在Linux,Windows或Mac上,这并不重要)。

2. Linux容器:大爆炸

这个故事使Docker和朋友成为可能,这个故事可以追溯到2006年,当时Google的几个很棒的工程师以“过程容器”的名义开始了对该功能的研究。 后来将其更名为“控制组”(或我们今天所知的cgroup ),并从2008年1月发布的2.6.24版本开始将其合并到Linux内核中。

本质上, cgroups是一种Linux内核功能,可限制,说明,区分优先级和隔离进程资源使用 (CPU,内存,磁盘I / O,网络等)。 最重要的是,要支持所有Linux内核 ,无需启动任何虚拟机虚拟机 管理程序cgroup命名空间Linux内核的另一个非常强大的功能)一起,是容器的基本构建块:操作系统级虚拟化。

基于容器的虚拟化非常轻巧(与传统虚拟机相比 ),几乎没有开销,共享相同的操作系统内核,并且不需要特殊的硬件支持即可有效执行。 换句话说,容器成为包装应用程序的新模型,因此它们可以在共享操作系统上独立运行。 尽管并非没有局限性,但使用容器已成为当今虚拟化领域的主流。

公平地说,并非所有Linux / Unix发行版都使用相同的机制进行操作系统级虚拟化。 举几个例子, FreeBSD为此目的设有监狱 ,而Solaris具有zone的概念。

那么,如何开始使用容器呢? 好吧,您可能已经听说过LXCLXD之类的缩写,它们实际上是大多数Linux / Unix发行版中容器管理的切入点。 事实是,这些内容有些底层并且不容易入门。 但是幸运的是,我们拥有以应用程序为中心的容器管理引擎Dockerrkt ,它们从一开始就成为全球应用程序开发人员的事实上的选择。

3. Docker:大众化的容器

那么, Docker本质上是什么? 它起初是一个功能强大且易于使用的容器引擎,但是如今,可以称其为成熟的容器管理平台将是很公平的。 它用Go编写,并利用Linux内核功能(主要是名称空间cgroups )来完成这项工作。 社区版可免费下载,而企业版也可通过订阅产品获得。 为了解决这个问题,在本教程中,我们将仅使用社区版的功能。

建筑

从架构的角度来看, Docker由三个主要部分组成。 守护进程dockerd位于Docker的中心。 反过来, dockerd依赖于另一个容器容器守护进程作为抽象层,以与Linux内核名称空间cgroups接口。 最后一个难题是一组称为Docker CLI的命令行工具(例如dockerdocker-compose ),它们能够通过其公开的Docker Engine APIdockerd守护程序进行通信

上面提到的每个Docker组件都应该拥有自己的教程,因此它们提供了许多有趣的特性和功能,尽管我们的重点将主要集中在Docker引擎API和Docker CLI系列( dockerdocker-compose )上。

选择Docker的最有力论据之一是,它可以在大多数Linux发行版中本地运行,但并不止于此。 还很好地支持了macOSWindows操作系统, 但需要注意一些警告

为了了解Docker的工作方式,我们必须公开其内部模型。 在任何时候,如果您觉得没有找到足够的有关该主题的详细信息,请随时查阅官方文档

图片

Docker中 ,您所做的一切都是管理特定对象。 图像和容器可以说是最重要的,但是还有其他一些,例如卷,网络和插件。 我们将在本教程的不同部分中看到所有这些内容,并立即从图像和容器开始。

可以将图像视为有关如何创建容器的一组说明。 在Docker中 ,一个映像可以从另一个映像继承(或基于),在基本映像的基础上添加其他指令。 每个图像由多层组成,这些层实际上是不可变的。 在底层 ,这些层由专用文件系统支持(默认情况下为UnionFS ,但也可以插入其他文件系统),从而使它们非常轻巧,快速。

那么……您如何才能根据自己的需要创建此类图像? 实际上,这很简单,要在Docker中构建自己的映像,您需要创建一个Dockerfile ,它只是一个文本文件,定义了组装映像(并在以后运行)所需的一组步骤(或指令)。 在此过程中,您可能会决定自己创建完全自定义的映像,或者在大多数情况下,请参考由他人创建的映像,这些映像将在注册表中发布。 为了让您快速了解Dockerfile的外观,这是一个简单的示例:

FROM alpine:3.6
CMD ["uname", "-a"]

Dockerfile中的每条指令都会创建一个新层,因此最后,每个映像都有一个不可变层的列表,这些不可变层相互堆叠,表示文件系统的差异。

在接下来的部分中,我们将按照最佳实践和建议编写大量不同的Dockerfile

货柜

准备好图像后,就可以将它们变为现实了。 容器出现在舞台上的位置是:它们是图像的可运行实例。 假设目标主机(安装了Docker的主机)具有足够的资源,则可以根据需要运行任意数量的主机。 所有这些都是可行的,因为至少在默认情况下,容器彼此之间具有良好的隔离性(但是您可以控制很多选项)。

Docker创建容器的实例时它还会在基础图像层堆栈的顶部添加一个新的可写层 ,通常称为容器层 。 对运行中的容器所做的所有更改(例如,创建,删除或修改文件)都将写入此薄层。

将容器视为短暂的容器非常重要:容器终止(停止并卸下)后,其状态的任何更改都将消失(除非将它们存储在持久性存储中)。

到目前为止, Docker内部使用其自己的映像格式,并严重依赖libcontainerrunc来生成和运行容器。

登记处

Docker体系结构中注册表的目的是存储映像,以便它们可以共享并用作基础映像。 Docker HubDocker Cloud是任何人都可以使用的著名公共注册表。 为了简单起见 ,默认情况下,将Docker配置为在Docker Hub上查找图像。

您还可以考虑选择托管自己的一个或多个私有Docker注册中心的选项。 这样做有很多充分的理由,尤其是在企业界。 最关键的问题之一是安全性,因为公共映像不经过全面的安全审核,并且可能具有已知的安全漏洞或暴露 。 但是,随着越来越多的公司维护所谓的官方存储库 (这些存储库经过精心策划并遵循更高的标准),情况变得越来越好。

为了使事情更加吸引人,新玩家最近加入了注册表游戏。 旗舰Docker产品Docker Store已宣布将全面上市。

图像是新的RPM

随着Docker和其他容器引擎变得越来越流行和广泛,我们用来打包和分发应用程序的方式也在发生巨大变化。 从字面上看,该映像成为一种“新RPM”,您可以将其分发到支持所选容器引擎的任何平台上(稍后再介绍),并将其作为容器运行。 它确实很容易,简单且强大。

4. Moby:Docker的未来

Docker最近发生了很多变化。 在将Docker分解为模块化组件并整合其所有开源协作的计划的推动下, Moby Project诞生了。

Moby项目是一个新的开源项目,旨在推进软件容器化运动并帮助生态系统将容器主流化。 它提供了一个组件库,一个将它们组装到基于容器的定制系统中的框架,以及一个供所有容器爱好者进行实验和交流思想的场所。 https://blog.docker.com/2017/04/introducing-the-moby-project/

随着Docker继续拆分为更多组件, Moby Project也将成为这些组件的所在地,因此让我们密切关注它,并期待激动人心的公告。

5.迈向互操作性

当前有多个以应用程序为中心的容器引擎可用,即Dockerrkt (将来很可能会出现更多),显而易见的问题是:如何选择一个? 如果您在此期间不得不切换到另一个,那会发生什么呢?

的确,目前,如果您选择一个容器引擎而不是另一个,那么您可能必须坚持使用它,因为事实证明转向替代引擎很困难。 但是,由于开放容器倡议 (或只是OCI )的存在,希望有足够的参与者支持通用规范,容器引擎的互操作性将大大改善。

前面我们已经提到 ,目前Docker使用自己的图像格式。 幸运的是,最近随着OCI Runtime和Image规范的首次发布,实现了该领域内开放性的重要里程碑。

6. Docker和Java

最近在容器内使用Java时,关于任何法律后果或许可方面的考虑,已经进行了很多讨论。 问答部分很好地总结了Oracle在此问题上的立场:

是否有Docker特有的Oracle Java SE许可考虑因素?

否。Docker是一个容器化平台,与任何操作系统,虚拟化或打包格式相比,使用或重新分发的许可证没有特别或特殊的限制。 Oracle JDK在Docker生态系统中被广泛使用和采用。 https://blogs.oracle.com/developers/official-docker-image-for-oracle-java-and-the-openjdk-roadmap-for-containers

尽管答案仅涉及Docker ,但它同样也适用于其他基于容器的虚拟化引擎。

为了证明这一点, Oracle已将正式的Oracle Java 8 SE(服务器JRE)映像发布到Docker商店中 ,这是查找可信任的商业和免费软件(以Docker映像形式分发)的地方之一。

7.结论

在本教程的介绍性部分中,我们对Linux / Unix操作系统中虚拟化机制的演变进行了一些研究。 我们已经从高层次上了解了什么是映像,容器,它们与传统虚拟机相比的优势以及如何开始使用它们。

8.接下来

我们仅在简单列出事实和术语的过程中没有做太多工作。 但是,请袖手旁观,在下一节中,我们将通过学习Docker容器引擎的工具和命令来对其进行仔细研究。

翻译自: https://www.javacodegeeks.com/2017/08/docker-java-developers-introduction.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值