1、打包 SpringBoot
项目
创建一个 SpringBoot 项目,下面是我的一个测试 demo:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wangtingyun
*/
@RestController
@RequestMapping("/")
public class TestController {
@GetMapping("/hello/{info}")
public String sayHello(@PathVariable("info") String info) {
return "Hello, " + info;
}
}
设置端口为 8080:
server:
port: 8080
servlet:
context-path: /
使用 Maven 将项目 Package 打包得到 jar 包:demo-1.0.0.jar
2、编写 Dockerfile
文件名称就叫 Dockerfile,没有后缀:
# 使用 Java8 为基础镜像
FROM java:8
# 指定临时文件挂载目录
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD demo-1.0.0.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
配置解释:
FROM
:指定基础镜像,如果是第一次打包,它会自动下载java:8
的镜像,以后再制作镜像的时候就不会再下载了;VOLUME
:指定了临时文件目录为 /tmp,其效果是在主机 /var/lib/docker 目录下创建了目录 /tmp,并链接到容器的 /tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要,/tmp 目录用来持久化到 Docker 数据文件夹,因为 SpringBoot 使用的内嵌 Tomcat 容器默认使用 /tmp 作为工作目录;ENTRYPOINT
:执行项目 app.jar,为了缩短 Tomcat 启动时间,添加一个系统属性指向 /dev/./urandom 作为 Entropy Source。
3、制作镜像
将 jar
包和 Dockerfile
放在同一个目录下:
[user@localhost home]$ ls
-------------------------
demo-1.0.0.jar Dockerfile
然后执行镜像构建命令(别漏了最后面还有一个点 .
):
docker build -t demo4docker .
命令解释:
-t
:参数指定镜像的 tag 名;.
:指定镜像构建过程中的上下文环境的目录(不是指 Dockerfile 的路径);
4、启动容器
docker run -d --name demo -p 8080:8080 demo4docker
-d
:表示让容器后台运行;--name
:指定容器运行时的名称;-p
:进行端口映射,将服务器的 8080 端口映射到容器中的 8080 端口中。
启动之后访问测试接口:
curl http://localhost:8080/hello/wangingyun
-------------------------------------------
Hello, wangingyun