使用Docker部署SpringBoot项目
环境 | 步骤
- 使用的虚拟机安装Ubuntu20.04,Ubuntu里面安装了docker,还需要安装JDK和Maven
- 在Win10上的Idea写好一个SpringBoot的Demo项目打包后传到Ubuntu中
- 先用mvn package打包项目并运行 测试项目是否能成功跑起来
- 最后用mvn package docker:build 打成Docker镜像
- 注意事项(看了其他的博客,然后打镜像的时候报各种异常):
- 项目名也就是artifactId最好也是小写
- docker镜像名最好要小写
新建一个SpringBoot项目
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 添加docker镜像名称(注意:docker镜像名最好要小写)-->
<properties>
<docker.image.prefix>dockerdemoservice</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</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>
<!-- Docker maven plugin -->
</plugins>
</build>
启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
Controller
@RestController
public class DockerController {
@GetMapping("/docker")
public String getString() {
return "dockerDemo is run";
}
}
在src/main下新建一个docker的目录
也就是src/main/docker。注意是目录不是package
-
在src/main/docker下新建一个Dockerfile的文件
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD dockerdemoservice-1.0-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
-
这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中:
- FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
- VOLUME ,VOLUME 指向了一个
/tmp
的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp
作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker
目录下创建一个临时文件并把它链接到容器中的/tmp
目录 - ADD ,拷贝文件并且重命名
- ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加
java.security.egd
的系统属性指向/dev/urandom
作为 ENTRYPOINT
-
在本地运行没问题,然后传到Ubuntu里解压
打docker镜像
-
项目打压缩包放到Ubuntu里
正常的应该是用git或svn拉代码,这里为了方便直接copy到服务器里
cd /home/lanceli/code/dockerdemoservice # dockerdemoservice 是我的demo项目 ls # 可以看到src pom.xml 就是在这一级目录使用mvn打包 mvn package # 先打成jar包,然后会生成一个target目录 cd target java -jar dockerdemoservice-1.0-SNAPSHOT.jar # 可以看到spring boot的Log,然后请求controller 如果成功说明没问题 cd /home/lanceli/code/dockerdemoservice # 回到项目的目录中 mvn package docker:build # 打成docker镜像,看到BUILD SUCCESS后说明成功
-
查看镜像并运行
sudo docker images # openjdk之前是没有的,自动pull下来的 REPOSITORY TAG IMAGE ID CREATED SIZE dockerdemoservice/dockerdemoservice latest ea60d12b0337 24 minutes ago 121MB jenkins/jenkins lts 697d76eba014 8 days ago 677MB nginx latest 4bb46517cac3 11 days ago 133MB portainer/portainer latest 62771b0b9b09 4 weeks ago 79.1MB openjdk 8-jdk-alpine a3562aa0b991 15 months ago 105MB sudo docker run -d -p 8080:8080 dockerdemoservice/dockerdemoservice # 运行刚刚打好的镜像
-
测试访问
- 我在win10上访问ubuntu的IP,加上映射的8080端口
- http://192.168.18.135:8080/docker 可以访问到我的接口
你的出现让我有了杂念