Java
1 使用官方镜像
在容器中运行Java代码最简单的方法就是将Java编译指令直接写入Dockerfile,然后使用此Dockerfile 构建并运行此镜像,即可启动程序。具体步骤如下。
首先,从官方仓库获取某版本Java基础镜像:
$ docker pull java:8
编写Dockerfile,如下:
FROM openjdk:8
COPY . /usr/src/javaapp
WORKDIR /usr/src/javaapp
RUN javac HelloWorld.java
CMD ["java","HelloWorld"]
编写java文件,如下:
public class HelloWorld {
public static void main(String []args){
System.out.println("Hello World!!!");
}
}
使用Dockerfile构建镜像my-java-image:
$ docker build -t my-java-image .
# 查看生成的镜像
$ docker images
然后,运行此镜像即自动编译并执行:
$ docker run -it --rm --name my-java my-java-image
# 如果只需要容器中编译,而不需要运行,则如下:
$ docker run --rm -v "$(pwd)":/usr/src/javaapp -w /usr/src/javaapp my-java-image javac HelloWorld.java
2 关于Spring Boot
Spring Boot 是由Pivotal 团队开发的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。
Spring Boot特性包括:
- 创建独立Spring应用
- 内嵌Tomcat,Jetty或Undertow(无须部署WAR文件)
- 提供starter POM,简化Maven配置
- 尽可能地实现Spring项目配置自动化
- 提供工业级特性,如metrics,健康检查等
- 不生成代码,不需要XML配置
以下使用compose来搭建Spring Boot 应用,环境要求是JDK 1.8 或以上版本,Maven3.0或以上版本。
第一步,创建一个Spring Boot应用。
下载并解压Spring Boot 应用模板代码:
$ git clone https://github.com/spring-guides/gs-spring-boot-docker.git
$ cd gs-spring-boot-docker/complete/src/main/java/hello
编辑src/main/java/hello/Application.java,内容如下:
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication和@RestController注解表示Java类Application已经准备好被Spring MVC 所调用,并提供HTTP服务。注解@RequestMapping("/")表示context path “/”的请求路由到方法home中进行处理,main方法中的SpringApplication.run() 用来启动一个Spring Boot应用。
第二步,容器化Spring Boot 应用
首先,新建src/main/docker/Dockerfile,内容如下:
FROM java:8
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN bash -c "touch /app.jar"
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
然后使用docker-maven-plugin构建镜像,pom.xml文件内容如下:
<properties>
<docker.image.prefix>registry.aliyuncs.com/linhuatest </docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.2.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
pom.xml中指定了以下属性:
- 镜像的名称,此处为registry.aliyuncs.com/linhuatest/gs-spring-boot-docker其中registry.aliyuncs.com是阿里云镜像仓库的域名,linhuatest是用户的命名空间,gs-spring-boot-docker是用户某个仓库的名称,此处没有镜像tag,默认为latest;
- Dockerfile文件所在的目录,该目录可以理解为Dockerfile的context,保存Dockerfile依赖的资源
- 将何种资源拷贝到Dockerfile文件所在的目录,即context,此处只需要编译出来的jar文件
最后,可以构建推送镜像到任何一个镜像仓库,如下:
$ mvn package docker:build # 此处必须要有docker客户端连接到docker daemon方能构建
$ docker push springio/gs-spring-boot-docker
3 相关资源
Java和Spring Boot的相关资源如下:
Java官方镜像:https://registry.hub.docker.com//java/
Java官方镜像标签:https://registry.hub.docker.com//java/tags/manage/
Spring Boot 官网:http://projects.spring.io/spring-boot/