使用Docker映像分发您的应用程序

自从开始撰写此博客以来,我需要开发几个示例应用程序来展示我所涉及的一些主题。 通常,需要将某种Java EE应用程序部署在Java EE容器中。 即使提供有关如何设置环境的说明,对于新手来说也可能很棘手。 我的一些读者在其本地计算机上没有Java EE容器。 有些甚至没有安装Java Development Kit。 如果我可以为您提供整个环境的设置,而您只需要以某种方式执行它,那不是很好吗? 我确实是这样! 不仅分发应用程序,还分发应用程序运行所需的环境。 我们可以使用Docker做到这一点。

在我的机器上工作240x300

几周前,我写了文章Get into Docker 。 现在,本文将继续探讨最有趣的Docker功能之一: Docker Images 。 这是为我的读者提供一个可以随时运行的完整环境的答案。

Docker镜像

Docker映像是用于创建Docker容器的只读模板。 每个图像都由一系列构成最终图像的层构成。 如果需要使用Ubuntu和Apache分发内容,请从基本的Ubuntu映像开始,然后在顶部添加Apache。

创建一个Docker映像文件

我将使用我最新的应用程序,即魔兽世界拍卖行 ,展示如何将其打包到Docker Image中并将其分发给其他人。 最简单的方法是创建一个Dockerfile 。 这是一个简单的纯文本文件,其中包含一组指令,这些指令告诉Docker如何构建我们的映像。 您可以使用的说明定义明确且简单明了。 检查Dockerfile参考页面以获取可能的指令列表。 每条指令都会在Docker映像中添加一个新层。 通常, Dockerfile名为Dockerfile 。 将其放在您选择的目录中。

基本图片

每个Dockerfile都必须以FROM指令开头。 我们需要从某个地方开始,所以这表明我们将用来构建环境的基础映像。 如果要构建虚拟机,则还必须从某个地方开始,并且必须首先选择要使用的操作系统。 使用Dockerfile并没有什么不同。 让我们将以下内容添加到Dockerfile中

FROM debian:latest

我们的基础映像将是Debian的最新版本,可在以下位置找到: Docker Hub Debian Repo

添加您需要的

这里的想法是建立一个环境,以检出代码,构建并执行《 魔兽世界》拍卖行样本。 你能弄清楚你需要什么吗? 当然,JDK可以编译和运行,而Maven可以执行构建。 但是这些还不够。 您还需要Git命令行客户端来签出代码。 对于这一部分,您需要了解一些有关Unix shell脚本的知识。

由于我们需要安装JDK和Maven,因此需要从某个地方将它们下载到我们的映像中。 您可以使用wget命令执行此操作。 但是wget在我们的基本Debian映像中不可用,因此我们需要先安装它。 要运行shell命令,我们使用Dockerfile中RUN指令。

安装wget:

RUN apt-get update && apt-get -y install wget git

安装JDK:

RUN wget --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz && \
    mkdir /opt/jdk && \
    tar -zxf jdk-8u40-linux-x64.tar.gz -C /opt/jdk && \
    update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_40/bin/java 100 && \
    update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_40/bin/javac 100 && \
    rm -rf jdk-8u40-linux-x64.tar.gz

安装Maven:

RUN wget http://mirrors.fe.up.pt/pub/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz && \
    tar -zxf apache-maven-3.2.5-bin.tar.gz -C /opt/ && \
    rm -rf apache-maven-3.2.5-bin.tar.gz

我们还需要从映像中的任何位置访问Java和Maven。 就像设置环境时对本地计算机的处理一样,您需要设置JAVA_HOME并将Maven二进制文件添加到PATH 。 您可以使用Docker ENV指令执行此操作。

ENV JAVA_HOME /opt/jdk/jdk1.8.0_40/

ENV PATH /opt/apache-maven-3.2.5/bin:$PATH
添加应用

现在我们已经拥有了魔兽世界拍卖行所需的环境,我们只需要克隆代码并构建它:

RUN cd opt && \
    git clone https://github.com/radcortez/wow-auctions.git wow-auctions

WORKDIR /opt/wow-auctions/

RUN mvn clean install && \
    cd batch && \
    mvn wildfly:start

我们还希望公开一个端口,以便您可以访问该应用程序。 您应该使用应用程序服务器的侦听http端口。 在这种情况下,它是8080。您可以在Docker中使用EXPOSE指令执行此操作:

我不得不在这里使用一些技巧。 我不想下载并安装应用程序服务器,因此我正在使用Maven插件的嵌入式Wildfly版本。 现在,正如我之前告诉您的那样, Dockerfile的每条指令都为映像添加了一个新层。 在这里,我强制服务器的启动和停止,只是为了让Maven下载所需的依赖项并使它们在映像中可用。 如果不这样做,那么每当我要运行映像时,都必须下载所有服务器依赖项,并且映像的启动将花费更长的时间。

EXPOSE 8080
运行应用程序

最终指令应为CMD以设置运行映像时要执行的命令:

CMD git pull && cd batch && mvn wildfly:run

在这种情况下,我们要确保使用的是最新代码,因此我们先进行git pull ,然后运行嵌入式Wildfly服务器。 部署配置已在Wildfly Maven插件中设置。

完整的Dockerfile
FROM debian:latest
MAINTAINER Roberto Cortez <radcortez@yahoo.com>

RUN apt-get update && apt-get -y install wget git

RUN wget --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz && \
    mkdir /opt/jdk && \
    tar -zxf jdk-8u40-linux-x64.tar.gz -C /opt/jdk && \
    update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_40/bin/java 100 && \
    update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_40/bin/javac 100 && \
    rm -rf jdk-8u40-linux-x64.tar.gz

ENV JAVA_HOME /opt/jdk/jdk1.8.0_40/

RUN wget http://mirrors.fe.up.pt/pub/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz && \
    tar -zxf apache-maven-3.2.5-bin.tar.gz -C /opt/ && \
    rm -rf apache-maven-3.2.5-bin.tar.gz

ENV PATH /opt/apache-maven-3.2.5/bin:$PATH

RUN cd opt && \
    git clone https://github.com/radcortez/wow-auctions.git wow-auctions

WORKDIR /opt/wow-auctions/

RUN mvn clean install && \
    cd batch && \
    mvn wildfly:start

EXPOSE 8080

CMD git pull && cd batch && mvn wildfly:run

编译Dockerfile

为了能够分发映像,您需要构建Dockerfile 。 要做的是读取每条指令,执行该指令,然后在Docker Images中添加一层。 除非更改Dockerfile ,否则只需执行一次。 CMD指令不在构建中执行,因为它仅在您实际运行映像并执行容器时使用。

要构建Dockerfile ,我在包含Dockerfile的目录中使用以下命令:

docker build -t radcortez/wow-auctions .

-t radcortez/wow-auctions用于标记和命名我正在构建的图像。 您应该使用用户名/名称格式。 您应该使用在Docker Hub中注册的相同用户名。

推送图像

Docker Hub是一个Docker Image存储库。 这与用于Java库的Maven存储库的概念相同。 下载或上传图像,一切顺利。 Docker Hub已经包含了大量可供使用的映像,从简单的Unix发行版到功能完善的应用服务器。

现在,我们可以选择在本地构建的映像,并将其上传到Docker Hub 。 这将允许任何人下载和使用此图像。 我们可以这样做:

docker push radcortez/wow-auctions

根据图像大小,这可能需要几分钟。

运行图像

最后运行图像和容器,我们执行:

docker run -it --name wow-auctions -p 8080:8080 radcortez/wow-auctions

由于我首先在本地构建了图像,因此将运行CMD radcortez / wow-auctions。 只需使用以上命令,即可在您的环境中下载并执行该映像。

结论

使用Docker ,可以分发您自己的应用程序,并为您创建适当的应用程序运行所需的环境。 由于您需要一些Unix的知识,所以这并不是一件容易的事,但这不是问题。

在这里使用Docker的主要动机是简化示例应用程序的分发。 收到一些读者的电子邮件来寻求帮助以设置环境的情况并不少见。 当然,您现在还必须以这种方式安装Docker ,但这是您唯一需要的。 剩下的,现在就交给我吧!

翻译自: https://www.javacodegeeks.com/2015/05/distribute-your-applications-with-docker-images.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值