前言
Docker 是现在很火的一个容器技术,能够帮助我们快速部署一个项目和环境(如:mysql 数据库、mq等等)
本篇文章将带领大家从0部署一个 SpringBoot项目。看完你就可以部署你的项目,然后惊艳你的🐍友啦!
目录
基础环境部署
我们在部署一个SpringBoot 项目时,往往是需要其它环境的(如 mysql、redis等),如果说你的 Docker 还没有安装其它的环境,可以参考这篇文章
快速在服务器上使用 Docker 安装部署各种常用数据库和软件(无bug版,10分钟完成配置和各类软件安装)
可以根据自己的需要,完成对应环境的安装。来对程序提供支持。
SpringBoot jar包导出
在这里我准备了一个最简单的一个springboot的接口,如图
等会就以这个接口来进行测试
打包完成之后,可以在目录看到我们的 产品
接下来,我们的产品就已经出来了,要进行部署到 docker当中。
dockerfile编写
ps:如果我们不使用docker 来进行部署,应该怎么进行部署呢?
如果没有使用docker,我们可以在jar包所在的目录执行 java 命令来进行启动项目。
要求你的服务器或虚拟机有java的环境
java -jar xxx.jar
这样部署的话,一旦你关闭了后台的窗口,程序也会跟着结束。所以需要使用
nohup java -jar xxx.jar &
来让 springboot 程序在后台运行。
如果要杀死这个进程或关闭jar包的执行,需要使用
关闭jar包执行
ps aux|grep xxx.jar 查找出pid
kill -9 [pid] 关闭进程
那么接下来进入正题,使用 docker 要如何进行部署呢?
首先需要进行 dockerfile 文件的编写,可以在 windows中编写好,也可以在 linux 中创建,效果是一样的。这里提供一份 springboot 项目部署的一份模板 dockerfile。注意:dockerfile文件不需要后缀
# 设置JAVA版本
FROM java:8-alpine
# 指定存储卷, 任何向/tmp写入的信息都不会记录到容器存储层
VOLUME /tmp
# 拷贝运行JAR包
ADD demo.jar app.jar
# 设置JVM运行参数, 这里限定下内存大小,减少开销
ENV JAVA_OPTS="\
-server \
-Xms256m \
-Xmx512m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m"
#空参数,方便创建容器时传参
ENV PARAMS=""
# 入口点, 执行JAVA运行命令
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS app.jar $PARAMS"]
Dockerfile 里是有很多参数和关键字的。这里展示其它常用的关键字。(只是想部署的话可以跳过这一段表格)
dockerfile常用命令
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
构建并部署项目
我们需要将 Dockerfile 和 我们的 jar包 上传的服务器的同一个目录下。
docker build -t demo .
使用这个命令来进行一个镜像的构建,(-t 后面的demo为镜像名) 注意后面有个一个 . 表示为在当前文件夹下构建,如果要指定文件夹就可以将 . 该为对应的文件夹,如 ./demo
配置镜像源(可能需要)
如果你在构建时出现了如下错误:
那么可能是你配置 的 docker镜像没有这个 java:8-alpine,你可能需要在 daemon.json 文件中添加一些镜像源。也可以参考 我上述引用的文章。
1、在宿主机器编辑文件:
vim /etc/docker/daemon.json
2、在改文件添加如下内容
{
"registry-mirrors": [
"https://ustc-edu-cn.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://registry.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
3、重启 docker (此命令为 centOS7的命令,其它操作系统为别的重启命令)
systemctl restart docker
构建部署测试
配置完成之后,再次执行构建命令。我们可以看到
这样就构建完成了。在查看我们的镜像
除了 demo 本身,还有了刚刚 dockerfile开头的 java的镜像来提供 jdk的环境。
最后我们需要运行 这个镜像。执行
docker run -d \
--name=demo \
-p 8080:8080 \
demo
这样就完成我们的部署工作啦。再来进行测试一下。
可以看到接口也能够正常访问了。
如果部署之后访问不了,可以查看 log,看看服务是否正常启动。
根据日志再来检查问题所在。如果启动正常,但是访问不了的情况。你需要检查 服务器运营商的安全组 和 服务器防火墙 是否开放了该端口。
最后可以看看我的开源项目: i集大校园(类似于一个定位为校园里的微博)
i集大校园软件服务端,基于SpringCloud Alibaba 微服务组件及部分分布式技术实现服务之间关联及协作进行前后端分离项目实现。计划实现微信小程序和app两端同步。
使用技术栈为:Spring Boot、Spring Cloud Alibaba、rabbitMQ、JWT、minIO、mysql、redis、ES、docker、Jenkins、mybatis-plus
前端将使用 微信小程序 编写。
欢迎一起参加开源贡献和star项目哈!