本篇主题主要实战如何使用Docker部署springboot项目,那么首先保证服务器上已经安装完docker容器,如果尚未安装请移步《详解阿里云服务器安装docker》文章完成docker安装操作;以下直接搭建springboot项目;以下也是springboot项目中最基本的依赖项;因为我们想测试接口访问,故搭建的是一个web项目,那么我们提供一个controller层
@RestController
public class HelloDockerController {
@GetMapping("/hello")
public String hello() {
return "Hello Docker.";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itwx</groupId>
<artifactId>docker-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>docker-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
docker提供了maven构建的插件docker-maven-plugin
,故pom.xml中<plugins>
标签中引入docker的相关插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<!-- 这里是最终生成的docker镜像名称 -->
<imageName>itwx/${project.artifactId}</imageName>
<!-- 基础镜像,运行一个springboot应用只需要基础的java环境就行 -->
<baseImage>java:8</baseImage>
<!-- docker启动的时候执行的命令 -->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
项目编译,打成Jar包
mvn clean
# -Dmaven.test.skip=true 是跳过测试代码
mvn package -Dmaven.test.skip=true
springboot项目我们采用使用dockerfile
文件的方式构建镜像,故需要创建dockerfile文件,内容如下:
FROM openjdk:8 # FROM: 基础镜像,基于jdk8镜像开始
COPY *.jar /app.jar # COPY: 将应用的配置文件也拷贝到镜像中。
CMD ["--server.port=8097"]
EXPOSE 8080 # EXPOSE:声明端口
ENTRYPOINT ["java","-jar","/app.jar"]
# ENTRYPOINT:docker启动时,运行的命令,这里容器启动时直接运行jar服务。
注意:
1、文件名一定别写错了,Dockerfile
,非驼峰格式;
2、将项目jar包和Dockerfile文件上传到服务器;
3、Jar包和Dockerfile文件要在同一目录下;
命令:docker build -t docker-demo .
docker bulid
是打包命令-t
镜像加一个Tagdocker-demo
自定义的镜像名字.
小数点表示当前目录,即Dockerfile所在目录
等待镜像构建完成[root@VM-4-8-centos project]# docker build -t docker-demo .
Sending build context to Docker daemon 17.77MB
Step 1/5 : FROM openjdk:8
8: Pulling from library/openjdk
0c6b8ff8c37e: Pull complete
412caad352a3: Pull complete
e6d3e61f7a50: Pull complete
461bb1d8c517: Pull complete
e442ee9d8dd9: Pull complete
36b5bcea956c: Pull complete
8ed70148ebcf: Pull complete
Digest: sha256:208812d8c45e0f5cb51c35b143094bd28322bad83ec8e463a1cbe3c5a6308b1f
Status: Downloaded newer image for openjdk:8
---> 47482c603b2a
Step 2/5 : COPY *.jar /app.jar
---> 843484f82093
Step 3/5 : CMD ["--server.port=8083"]
---> Running in 62d4bd1ddf75
Removing intermediate container 62d4bd1ddf75
---> 9ef3ddc144fa
Step 4/5 : EXPOSE 8080
---> Running in e0e627838cc3
Removing intermediate container e0e627838cc3
---> ac55c9edc15d
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in 673eb2c738e2
Removing intermediate container 673eb2c738e2
---> 4e0c81d17c49
Successfully built 034aca093b5e
Successfully tagged docker-demo:latest
查看生成的镜像列表
[root@VM-4-8-centos project]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-demo latest 034aca093b5e 16 minutes ago 544MB
openjdk 8 47482c603b2a 2 weeks ago 526MB
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
centos latest 5d0da3dc9764 5 months ago 231MB
命令:docker run -d -p 8097:8097 --name docker-demo-container docker-demo
-d
是后台运行-p 8097:8097
端口映射--name
定义容器名字docker-demo
以哪个镜像为基础运行容器
运行如下:[root@VM-4-8-centos project]# docker run -d -p 8097:8097 --name docker-demo-container docker-demo
b38019663d93a9917b842e89b59861ac9ce118c02c906f52e8025c30488a2336
查看容器
[root@VM-4-8-centos project]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cdb27ca5858 docker-demo "java -jar /app.jar …" 4 minutes ago Up 4 minutes 0.0.0.0:8097->8097/tcp, :::8097->8097/tcp docker-demo-container
2abc9f2c0dde centos "/bin/bash" 46 hours ago Up 45 hours my_centos
[root@VM-4-8-centos project]# curl localhost:8097/hello
结果如下: