今天看到汪云飞老师的Spring boot实战中关于Dockerfile的创建以及用docker部署项目,感觉非常简单,这里跟大家分享下。
默认有一台已经安装了docker的主机,新建一个springboot项目,该项目只有一个对外接口(只是用来测试实现功能,如果喜欢你可以写任意多个接口),创建好后打包成jar包。
package com.rhett;
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 StartApplication {
@RequestMapping("/")
public String home(){
return "Hello docker";
}
public static void main(String[] args){
SpringApplication.run(StartApplication.class, args);
}
}
这里是我的代码,跟汪老师的基本一样,另外我设定项目的端口为8081.
我的服务器是CentOs7.2,其它环境的也可以作为参考。
在var下边新建目录apps,我的项目名称是firstdocker,所有又建了个目录firstdockerapp,具体如下:
Dockerfile内容为:
FROM java:8
MAINTAINER rhett
ADD firstdocker-0.0.1-SNAPSHOT.jar firstdockerapp.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","/firstdockerapp.jar"]
运行环境是java8,给项目重命名为firstdockerapp.jar,端口8081为之前定义的项目端口,这个需要统一。ENTRYPOINT 里为jar包的运行指令,大家都应该比较熟悉。
创建image的指令为docker build -t rhett/anotherdocker .
rhett/anotherdocker 为创建的镜像的名字,可以在后边加上rhett/anotherdocker :1.0之类的来指定tag,如果不指定默认为latest.
还有一定特别重要,上面的指令最后有个".",这个是必须的,说明是本目录。如果该指令不在本目录,可以把"."改为具体路径(这个我没试过,听一些朋友说的,大家可以试试)。
创建好镜像之后就可以安装正常镜像使用了,创建包含项目的容器:
docker run -d --name firstdockerapp -p 8084:8081 rhett/firstdockerapp
8081为容器内部的端口,8084为对外的端口。
这时一个springboot项目就在docker容器中运行起来了。
这里有一些需要注意的地方我说下:
1、目录下的结构,项目的jar包和Dockerfile文件必须放在同一目录(以后研究是否可以分开放,名字是否可以更改),文件名字必须为Dockerfile。否则执行的时候可能会报一下异常:
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /var/apps/Dockerfile: no such file or directory
2、Dockerfile文件的创建,第一步是创建一个普通的文件,命名为Dockerfile。Dockerfile其实只是一个普通的文件,只是里面包含一些docker运行的指令。这一点一般都没有说明,对我这种开发兼运维的人来说真的很头疼,不知道怎么入手。如果执行build指令的时候没有新建Dockerfile也会报1中的异常。