docker保护java源码_java操作docker

hacker|
72

文章目录:

使用docker作为开发环境还需要写java代码吗

现在有非常多的Java Web框架,但我这里并不打算使用它们。我只想要的是一个小的框架所以我选择了Spark,它是一个基于Java 8的极小的框架。Spark使用Maven作为构建工具。

回到顶部

源代码和配置文件

在这个例子中你要增加三个文件:

Maven的配置文件: pom.xml

一个Java类:Hello.java

一个Dockerfile

如何使用docker进行java入门级开发

现在有非常多的Java Web框架,但我这里并不打算使用它们。我只想要的是一个小的框架所以我选择了Spark,它是一个基于Java 8的极小的框架。Spark使用Maven作为构建工具。

源代码和配置文件

在这个例子中你要增加三个文件:

Maven的配置文件: pom.xml

一个Java类:Hello.java

一个Dockerfile

如果有读者等不及了,可以克隆这个repo:

下面我们会详细解释这三个文件的结构,你可以此视频来快速了解。(读者可以查看原文中的视频,看完视频基本可以了解怎么做)

pom.xml

pom.xml包含一些基本的Maven配置,比如配置Spark所依赖的Java 8。它会把所有的依赖封装成一个大的jar包。我不是 Maven专家,所以我没法把例子写得更简单、更流畅以便让他们更受欢迎。这是pom文件地址,

Hello.java

pom.xml文件定义mainClass为sparkexample.Hello,我们需要在src/main/java/sparkexample/目录下创建Hello.java文件。

Dockerfile

最后我们来编写Dockerfile文件,这个Dockerfile使用到了Java镜像(java:oracle-java8),并从安装Maven开始做起。下一步它会安装项目依赖。我们通过pom.xml来解析这些依赖,正如你所看到的,它允许Docker缓存这些依赖。下一步,我们要编译打包我们的应用,并启动应用。如果我们重建应用时,pom.xml文件没有任何修改,之前的步骤都被缓存下来了,直接到最后一步启动应用。这可以加快应用的重新构建速度。

创建和运行

一旦这三个文件已经完成,那创建Docker镜像就变得轻而易举了。

$ docker build -t giantswarm/sparkexample

注意:首次启动时会花费一些时间,因为它要安装Maven并下载所有的依赖。之后再启动就需要几秒钟,因为所有的东西都已经缓存了。

镜像创建之后,用下面的命令创建容器:

docker run -d -p 4567:4567 giantswarm/sparkexample

用下面的命令访问:

curl localhost:4567 hello from sparkjava.com

现在可以去修改源码(返回你想返回的东西)并重新构建,这看起来是不是很棒?

如何在docker中运行java程序

pom.xml文件定义mainClass为sparkexample.Hello,需要在src/main/java/sparkexample/目录下创建Hello.java文件。Dockerfile

最后我们来编写Dockerfile文件,这个Dockerfile使用到了Java镜像(java:oracle-java8),并从安装Maven开始做起。下一步它会安装项目依赖。我们通过pom.xml来解析这些依赖,正如你所看到的,它允许Docker缓存这些依赖。下一步,要编译打包应用,并启动应用。如果重建应用时,pom.xml文件没有任何修改,之前的步骤都被缓存下来了,直接到最后一步启动应用。这可以加快应用的重新构建速度。

创建和运行

一旦这三个文件已经完成,那创建Docker镜像就变得轻而易举了。

$ docker build -t giantswarm/sparkexample .

注意:首次启动时会花费一些时间,因为它要安装Maven并下载所有的依赖。之后再启动就需要几秒钟,因为所有的东西都已经缓存了。

镜像创建之后,用下面的命令创建容器:

docker run -d -p 4567:4567 giantswarm/sparkexample

用下面的命令访问:

curl localhost:4567 hello from sparkjava.com

如何通过java来操作docker镜像

利用Dockerfile构建一个简单的java应用镜像,依赖环境比较简单,JDK,定制化的Tomcat(名为star-appserver)

1、环境准备

ubuntu:14.04

docker : 1.4

jdk:jdk-8u31-linux-x64.gz

tomcat : 7.0(star-appserver)

在/usr/local下创建目录:sms,将jdk-8u31-linux-x64.gz和star-appserver(此处为了简单,已包含应用)拷贝到此目录下,由于Docker在构建镜像时,需将Dockerfile所在目录传给Docker daemon作为构建上下文,所以此目录下应包含构建时所依赖的各种环境。

2、环境准备好后,在sms下创建Dockerfile(名字必须为Dockerfile)文件,内容如下

FROM ubuntu:latest

MAINTAINER zhangjy

#install JDK and TOMCAT

ADD jdk-8u31-linux-x64.gz /usr/local/

ADD tomcat /usr/local/ #tomcat下为star-appserver,如果直接复制star-appserver,只会复制目录里边的内容,不会复制目录本身

ADD timezone /etc/

#启动脚本,用于从镜像启动容器时调用执行,见下面的ENTRYPOINT

ADD onStart.sh /usr/local/

ENV JAVA_HOME=/usr/local/jdk1.8.0_31 CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin

RUN echo "JAVA_HOME=/usr/local/jdk1.8.0_31\nCALSSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar\nPATH=$PATH:$JAVA_HOME/bin" /etc/profile

#start tomcat

ENTRYPOINT ["/usr/local/onStart.sh"]

3、在sms下创建onStart.sh,并赋予执行权限,用于启动tomcat并输出日志(为了保证容器中有执行状态的进程,否则容器停止)

#!/bin/bash

/usr/local/star-appserver/bin/startup.sh

tail -f /usr/local/star-appserver/logs/stariboss.log

4、在sms下执行命令,创建成功

$docker build -t zhangjy/starsms:v1 .

启动时,发现应用访问数据库报错:ORA-01882: timezone region not found,原因是JVM默认使用Ubuntu的/etc/timezone里配置的时区,查看timezone时区为Etc/UTC,再查看ORACLE数据库支持的时区:select * from V$TIMEZONE_NAMES发现没有,于是又在sms目录下创建了一个timezone文件,将时区配置成Asia/Shanghai,在Dockerfile中加入到镜像/etc/目录下

Dockerfile文件配置说明:

FROM

表明基于哪个镜像创建

MAINTAINER

作者和邮箱

ADD

将目录或文件加入到镜像的某个目录,格式是ADD 源文件 目标目录

RUN

有两种格式:

RUN command (the command is run in a shell - /bin/sh -c - shell form)

RUN ["executable", "param1", "param2"] (exec form)

默认RUN后的命令是在/bin/sh下执行,像Ubuntu默认/bin/sh是指向/bin/dash,如果想使用/bin/bash,则可按如下方式

RUN ["/bin/bash","-c","source /etc/profile"]

但需注意,这种方式不能解析类似于$HOME的参数引用

ENV

设置环境变量,在镜像构建过程中和容器启动后均有效

CMD

CMD在容器运行的时候提供一些命令及参数,用法如下:

CMD ["executable","param1","param2"] (exec form, this is the preferred form) CMD ["param1","param2"] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form)

- 第一种用法:运行一个可执行的文件并提供参数。

- 第二种用法:为ENTRYPOINT指定参数,即为ENTRYPOINT指定命令的默认参数,通过docker run命令传过来的参数会将其覆盖

- 第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。

如指定:

1. CMD [“/bin/echo”, “this is a echo test ”]

build后运行(假设镜像名为ec):

1. docker run ec

就会输出: this is a echo test

注意:如果在docker run命令后指定命令,如docker run ec echo 'test',会将CMD的命令覆盖。CMD的命令不能接收run传过来的参数,而ENTRYPOINT可以

ENTRYPOINT

有两种用法

ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)

ENTRYPOINT command param1 param2 (shell form)

第一种可以接收docker run命令传过来的参数(即使docker run传过来的是命令,也会被当做参数处理),如果想覆盖,可使用docker run ... --entrypoint COMMAND

如何使用Docker 进行Java 开发

1、java项目开发,假定已有一个java项目能够编译成jar/war并且运行了。

2、编写dockerfile,docker是一个容器技术每一个容器就是一个“完整”的linux系统,这个dockerfile需要提供这个系统包含内容的描述,比如FROM maven:3.3.3、FROM ubuntu:16.04。如果这个java项目是个web项目那么还需要提供tomcat环境。添加项目构建信息。比如采用maven编译项目的话该如何如何。

ADD pom.xml /tmp/build/

RUN cd /tmp/build  mvn -q dependency:resolve

ADD src /tmp/build/src

        #构建应用RUN cd /tmp/build  mvn -q -DskipTests=true package \

        #拷贝编译结果到指定目录

         rm -rf $CATALINA_HOME/webapps/* \

         mv target/*.war $CATALINA_HOME/webapps/ROOT.war \

        #清理编译痕迹

         cd /  rm -rf /tmp/build

3、暴漏接口:EXPOSE 8080

CMD ["catalina.sh","run"]

4、执行镜像构建

docker build -t docker-demo-java-tomcat .

5、基于创建好的镜像创建容器

docker run -d -p 8080:8080 docker-demo-java-tomcat

6、访问

来源于dockercloud文档,可自去查看。

如何把java程序封装到docker

初次安装部署好docker后,大多数镜像可以从DockerHub提取,但是大多数人都希望自己可以完全自定义一个镜像,那么这里需要一个第三方工具febootstrapepel6的源提供febootstrap的RPM包yuminstalldocker-iofebootstrap-yservicedockerstartchkconfigdocker--level35on复制代码制作CentOS6.6镜像目录febootstrap-iyum-iiputils-iiproute-ibash-ivim-minimal-icoreutils-itar-inet-toolscentos6base/centos/6.6/updates/x86_64/复制代码-i表示镜像里面安装的RPM包(包括一些人为有必要的软件包)centos6表示镜像的版本说明base表示生成的镜像目录后面之后了系统安装源和更新源为USTC安装执行后,会开始一系列的RPM包下载安装,过程与yum类似,安装完成后当前目录会多了base目录,里面就是一个镜像的系统文件进入base目录等于进入镜像的根目录[root@image~]#cdbase/[root@imagebase]#lsbinbootdevetchomeliblib64mediamntoptprocrootsbinselinuxsrvsystmpusrvar复制代码可以像一般的系统文件一样先做一些修改配置,例如配置第三方yum源等等把base目录把所有文件打包成二进制文件后导入docker创建为镜像

3条大神的评论

  • avatar
    访客 2022-07-09 上午 11:24:50

    va-tomcat .5、基于创建好的镜像创建容器docker run -d -p 8080:8080 docker-demo-java-tomcat6、访问来源于dockercloud文档,可自去查看。如何把java程序封

  • avatar
    访客 2022-07-09 上午 06:26:29

    from sparkjava.com现在可以去修改源码(返回你想返回的东西)并重新构建,这看起来是不是很棒?如何在docker中运行java程序pom.xml文件定义mainClass为sparkexample.Hello,需要在s

  • avatar
    访客 2022-07-09 下午 03:18:13

    0CMD ["catalina.sh","run"]4、执行镜像构建docker build -t docker-demo-java-tomcat .5、基于创建好的镜像创建容器docker run 

发表评论