docker环境部署spring boot项目(自制jdk镜像1.8)
(环境准备:VMware 14,Centos7,Xshell5,)
docker部署 spring boot项目大致结构, 在虚拟机上面使用docker创建一个沙箱里面相当于一个小系统,然后把java项目发布在这个沙箱里面,将沙箱端口映射到服务器对应端口,外部通过访问服务器该端口来访问沙箱里面的项目
docker官网
本文使用自定义jdk1.8镜像,也可以使用docker官网提供的镜像 使用docker search jdk 或者官网即可查到提供的jdk.
1.docker环境安装
1.1docer安装(执行)
yum update
# 安装Docker( 参数-y 默认安装时 自动选择Y)
yum -y install docker
#启动docker
service docker start
#要求服务器重启自动启动docker 可输入该命令systemctl enable docker 实现
输入docker version 查看docker信息
1.2配置docker的国内仓库
#Docker配置国内仓库(这里使用网易云),添加如下配置
vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
#重启Docker service服务
systemctl restart docker.service
输入docker info 查看国内仓库是否添加成功
2.docker安装指定版本的jdk1.8镜像
2.1配置准备(写入Dockerfile(类似于脚本文件)和上传指定的jdk1.8)
#创建一个文件夹放**Dockerfile和指定jdk
mkdir -p /usr/docker/java1.8
#切换到该路径
cd /usr/docker/java1.8
#创建一个Dockerfile文件
vi Dockerfile
在Dockerfile里面添加如下内容
#依赖的环境
FROM centos:7
#作者
MAINTAINER "violet"
#切换工作目录,然后会在该目录下执行命令
WORKDIR /usr
RUN mkdir -p /usr/docker/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u251-linux-x64.tar.gz /usr/docker/java
#环境配置 注意: 这里的jdk1.8.0_251的路径与 jdk-8u251版本要进行对应的修改
ENV JAVA_HOME /usr/docker/java/jdk1.8.0_251
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
上传指定的jdk1.8到服务器,项目结构如下图
2.2打包jdk镜像(在上图的路径执行如下命令)
#打包镜像 注意有后缀 . 这个点的意思使用当前目录下面的Dockerfile制作镜像
docker build -t jdk1.8 .
#查看镜像
docker images
2.3测试基于镜像创建容器jdk1.8,环境是否正常
#运行该容器
docker run -it --name=jdk1.8 jdk1.8 /bin/bash
#然后输入java -version 你会发现前面的localhost换成了一段密文,这是当前docker容器的id。 出现java版本说明容器没有问题
#退出容器(在容器输入exit)
exit
3. 部署spring boot项目
3.上传项目和准备Dockerfile
#创建文件夹
mkdir -p /usr/docker/sys
#编写该项目的Dockerfile
vi Dockerfile
#基于刚刚创建的jdk版本,这里使用的自己创建jdk1.8镜像
FROM jdk1.8
#作者
MAINTAINER “violet”
#该dockerfile的描述
LABEL description=“描述”
#服务器时间,根据条件条件
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo “Asia/Shanghai” > /etc/timezone
#sys-0.0.1-SNAPSHOT.jar 改名为 app.jar
COPY sys-0.0.1-SNAPSHOT.jar app.jar
#镜像端口
EXPOSE 12000
#cmd命令
CMD java -jar -XX:+PrintGC -XX:+PrintGCDateStamps app.jar
#ENTRYPOINT ["java","-jar","-XX:+PrintGC","-XX:+PrintGCDateStamps","app.jar"] CMD可替换为
配置结构展示:
#创建spring boot 镜像 注意有点 制作的镜像名字为 sys-java Dockerfile和jar在同一个目录下,并且使用该命令
docker build -t sys-java .
# --name sys-java 容器名字
#-d 后台运行
# -v /docker/java/logs:/usr/logs 解析为将容器路径/usr/logs映射到/docker/java/logs 映射后应该在容器的/docker/java/logs看到服务器日志
# -p 12000:12000 镜像端口12000映射到为12000(springboot启动的端口为12000)
#sys-java 是运行的镜像名字
docker run --name sys-java -d -v /docker/java/logs:/usr/logs -p 12000:12000 sys-java
#可以在-d后面可添加--restart=always或者docker container update --restart=always 容器名字 docker启动时自启动改jar包
运行成功
#查询sys-java的日志
docker logs -f sys-java
#查看本机映射日志
cd /docker/java/logs
到这里就部署完了,接下来添加一个shell脚本一键安装部署(如果出现 “Permission denied” 在启动docker run 添加 --privileged=true (该问题是权限不足) )
4.shell脚本安装
创建一个sys-java.sh(可在windows可在服务器)
大致意思是: 查看服务器是否有服务名的端口运行 如果有关闭docker容器运行并且删除容器和镜像 重新书写dockerfile 打包发布
#!/bin/bash
SERVER_NAME=sys-java
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
if [ -n "$CID" ]; then
docker stop $SERVER_NAME
fi
images=$(docker images "$SERVER_NAME" | awk '{print $1}')
if [ -n "$images" ]; then
docker rm $SERVER_NAME
docker rmi $SERVER_NAME
fi
# echo "$images"
cat > Dockerfile << EOF
FROM jdk1.8
MAINTAINER "violet"
LABEL description="描述"
VOLUME /tmp
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
COPY sys-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 12000
CMD java -jar -XX:+PrintGC -XX:+PrintGCDateStamps app.jar
EOF
docker build -t $SERVER_NAME .
docker run --name $SERVER_NAME -d -v /docker/java/logs:/usr/logs -p 12000:12000 $SERVER_NAME
echo "$SERVER_NAME容器创建完成"
**项目结构 : **
运行./sys-java.sh出现提示权限不足时,执行 chmod +x sys-java.sh 然后运行重新运行