springboot项目中使用docker进行部署
这个过程,其实就是先将项目打包为springboot的jar包,再将其封装为一个docker的镜像,再将镜像上传到docker主机上,运行docker run [镜像名称] 以docker容器方式执行我们的应用。
方式一 : idea中安装docker 集成插件,进行docker部署 。
搜索安装docker integration 插件 :
安装完成后,重启idea。 在setting--》build,execution,deployment--》下找到docker ,添加/配置一个docker主机(可以是远程的docker主机)。
当然,需要注意的是,远程主机上的必须有安装docker,并且开启了docker的远程访问。
新建一个简单的springboot项目 。new --》project --》spring initializr --》勾选 web ,devtool即可,项目名称填写为 docker-demo1 。
springboot启动类:
package com.tingcream.dockerdemo1; import org.springframework.beans.factory.annotation.Value; 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; import java.text.SimpleDateFormat; import java.util.Date; @SpringBootApplication @RestController public class DockerDemo1Application { @Value("${spring.application.name}") private String applicationName; @Value("${server.port}") private String port; public static void main(String[] args) { SpringApplication.run(DockerDemo1Application.class, args); } @RequestMapping("/") public String index(){ String date= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); System.out.println("当前时间:"+date); return "hello: "+applicationName+",端口为:" +port+",当前时间为:"+date; } }
application.yml
server: port: 8081 spring: application: name: docker-demo1 #日志 logging: level: root: INFO org.springframework.web: INFO org.springframework.jdbc: debug com.tingcream: DEBUG file: /log/docker-demo1.log
在项目根目录中,创建一个Dockerfile文件,内容如下:
FROM frolvlad/alpine-oraclejre8 VOLUME /tmp # 配置环境变量 ENV LANG="en_US.UTF-8" \ LANGUAGE="en_US:en" \ LC_ALL="en_US.UTF-8" # 复制jar包 ADD target/docker-demo1.jar /app.jar # 修改容器时区为北京时间 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&\ apk --no-cache add tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone #声明要暴露的端口 EXPOSE 8081 5005 #入口 #ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","/app.jar"] #入口,开启远程调试(5005端口) ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom",\ "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-jar","/app.jar"]
在idea中,编辑一个configuration (run/debug--》edit configuration)
完成后,我们编写好项目代码,先执行mvn clean package ,将项目打包,再找到docker-demo1 的运行选项 ,点击绿色三角启动按钮执行,
即可将我们的springboot jar包,打包为docker的镜像,并自动上传到我们的指定的docker主机上。
方式二 :引入maven的一个docker插件进行项目docker打包 。
1、pom.xml 配置
<build> <finalName>docker-demo1</finalName> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*</include> </includes> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <!--springboot 打execute jar包--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--JDK8 编译--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <target>1.8</target> <source>1.8</source> <encoding>utf-8</encoding> </configuration> </plugin> <!--docker 的maven插件 --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <executions> <execution> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--docker主机的地址--> <dockerHost>http://192.168.11.10:2375</dockerHost> <!--打包的镜像名称--> <imageName>jellyflu/${project.build.finalName}:${version}</imageName> <!--Dockerfile所在的目录--> <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <!--<dockerDirectory>${project.basedir}</dockerDirectory>--> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
如上,其中最主要的就是引入了一个docker 的maven插件包,该插件包会将我们的docker build命令绑定到maven的package执行阶段。
也就是说,当我们在项目中执行mvn clean package 时,会先自动打包(springboot 包),同时将springboot包打包为docker镜像,并上传到
指定的docker主机上。
2、在项目根src/main中创建docker目录,里面再新建一个Dockerfile文件。
Dockerfile文件的内容如下:
FROM frolvlad/alpine-oraclejre8 VOLUME /tmp ENV LANG="en_US.UTF-8" \ LANGUAGE="en_US:en" \ LC_ALL="en_US.UTF-8" #ENV LANG en_US.UTF-8 #ENV LANGUAGE en_US:en #ENV LC_ALL en_US.UTF-8 ADD docker-demo1.jar /app.jar # 修改容器时区为北京时间 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&\ apk --no-cache add tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone #声明要暴露的端口 EXPOSE 8081 5005 #入口 #ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","/app.jar"] #入口,开启远程调试 ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom",\ "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-jar","/app.jar"]
3、编写好项目代码后,运行mvn clean package 即可 自动将项目打包,并将springboot包再次打包为docker镜像,并上传到
指定的docker主机上。注意这时镜像并没有自动run出一个容器,需要我们手动到docker主机上执行docker run命令,如
docker run -d -p 8081:8081 -p 5005:5005 -v /log:/log --name docker-demo1 jellyflu/docker-demo1:0.1
查看容器运行日志 :
docker logs -f docker-demo1 或者 tail -f /log/docker-demo1.log 。
Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1