将Java应用Docker化
a) 使用Spring Boot编写一个简单的Java应用,提供HTTP接口。
b) 学习Docker基本用法,包括编写Dockerfile。
c) 将以上Java应用打包为Docker镜像,成功运行。
对于a:使用Spring Boot编写一个简单的Java应用,提供HTTP接口。
用maven新建一个项目
创建时可以使用这个:maven-archetype-archetype.
在pom.xml中加入依赖:
参考文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>test</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>test</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> name test是maven项目工程名其中plugins里面的spring-boot-maven-pluginns得添加。不然后面无法使用maven把依赖打入jar包里面。
然后再src/main/java路径下开始建立java文件
App.java:
package test.test; 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; /** * Hello world! * */ @SpringBootApplication @RestController public class App { @RequestMapping("/") public String greeting() { return "Hello World!"; } public static void main( String[] args ) { SpringApplication.run(App.class, args); System.out.println( "Hello World!1" ); } }
@SpringBootApplication是Spring Boot框架中描述Spring应用的类,它的run()方法会创建一个Spring应用上下文(Application Context)。另一方面它会扫描当前应用类路径上的依赖,例如本例中发现spring-webmvc(由 spring-boot-starter-web传递引入)在类路径中,那么Spring Boot会判断这是一个Web应用,并启动一个内嵌的Servlet容器(默认是Tomcat)用于处理HTTP请求。
简单来说,就是程序的入口
SpringApplication.run(App.class, args); 必须加上去,不然等于就执行了一个打印helloworld的语句,其他都不会加载到。Greeting类:
package test.test; public class Greeting { private final long id; private final String content; public Greeting(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; } }
package test.test; import java.util.concurrent.atomic.AtomicLong; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @RequestMapping("/greeting") public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { return new Greeting(counter.incrementAndGet(),String.format(template, name)); } } GreettingController主要是针对当访问路径为:localhost:8080/greeting
时返回下面的页面:
提供了HTTP接口。
@RequestMapping是对访问路径下执行对应的方法
都弄好了以后,直接执行run as javaApplication程序就好了。
对于bc) 学习Docker基本用法,包括编写Dockerfile。
建立:docker build -t wisely/ecnu .
运行: docker run -p 8080:8080 -t wisely/ecnu
执行jar文件:java -jar ecnuj.jar
建立注意最后面的一个. 表示按使用同路径下编写好的Dockerfile文件
Dockerfile文件如下:
FROM java:8 ADD test-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] 其中ADD 后面是jar文件。后面的app.jar随便写,跟第四行保持相同即可。
EXPOES是访问的端口号。
这些编好了以后,就使用docker 建立 与运行就好 wisely/ecnu这是一个名字,随便改。
在编这些之前可以先尝试吧jar文件单独运行,看是否能够运行。
打出maven依赖的jar包:
第一次打包的时候会弹出下面的
框中填上package以后,然后refresh下就能看到生成的jar包了,里面已经包含了maven依赖。
最后运行成功以后 就是这样了:
成功。
可以参考:https://yq.aliyun.com/articles/47344
这里是maven打jar包的一个小参考:http://blog.csdn.net/sai739295732/article/details/49444447
docker的一些命令:
查看本地镜像列表docker images 镜像删除,后面跟的是镜像的id号:docker rmi a3a308108709 正在运行在container中的镜像是无法删除的。 docker ps 查看运行中的容器列表 docker ps -a 查看运行和停止状态的容器 停止容器:docker stop container-name/container-id 如:docker stop ba07c6640951