前期准备
1、准备好CentOS7.6系统的服务器环境。
2、在服务器上搭建好docker环境,可以参考CentOS7.6离线安装Docker,当然如果网络条件可以可以参考菜鸟教程的Docker安装教程。
3、其次搭建好数据库,如果是mysql数据库可以参考CentOS7离线安装Mysql5.7。数据库建议直接安装在服务器上,不要采用docker镜像方式创建数据库镜像。数据库搭建好后,记得配置防火墙开放3306端口,否则外部无法访问此数据库。具体命令可以参见此博客的结尾部分。
JDK准备
我本次采用openjdk8镜像, 此镜像大家可以通过docker search直接搜索,然后docker pull拉去,只要是符合你自己需要的jdk即可,或者你自己同Dockerfile构建一个jdk镜像。
SpringBoot应用Jar包准备
Springboot应用在IDEA中通过Maven的package命令直接生成相应的Jar文件,此处以eureka为例,将生成好的eureka.jar文件拷贝至CentOS服务器的/usr/local/temp目录下(目录自己创建一下),后续文件统一放在这个目录下面。
Dockerfile
创建用于构建Springboot应用镜像的Dockerfile文件,并将此文件拷贝至/usr/local/temp目录下。Dockerfile文件必须和Springboot应用的jar包放在同一个目录下,否则就必须在Dockerfile文件中指定挂载目录。
Dockerfile文件内容如下:
#依赖镜像
FROM openjdk8:latest
#构建者
MAINTAINER Snow.Zhou
ADD eureka.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#开启内部服务端口
EXPOSE 8761
其中 ADD 命令后面的 eureka.jar就是你自己的应用jar包的名字,另外EXPOSE是指定应用在容器内使用的端口,此处你可以根据自己需要设置自己的端口,在docker run的时候必须做宿主机端口与此容器端口的映射,否则无法访问应用,不设置端口默认80端口。具体映射后面会讲到。
创建和运行镜像
1、通过docker build命令创建镜像,注意后面必须有个点(.),表示当前目录
[root@localhost temp]# docker build -t eureka .
执行后会打印相应步骤的日志step ,并提示Successfully,详细日志这里就不展示了。可以通过docker images命令查看创建好的镜像。
2、运行docker镜像,执行docker run命令,此处 -p 后面就是端口映射,表示将宿主服务器的8761端口映射到eureka这个容器的8761端口, -d 表示后台运行
[root@localhost temp]# docker run -p 8761:8761 -d eureka /bin/bash;
执行成功后会打印一串字符,可以不用关注此字符串
至此Springboot应用就发布好了,可以通过网页访问相应地址既可。
需要注意的事项
Dokcer容器启动成功后,可能出现无法访问应用的情况,导致的原因有多种,最直接的可能是CentOS7的防火墙拦截了你的应用端口导致外部无法访问,其次就是docker容器通信有问题,可以查看容器日志了解情况。因为CentOS7自身的防火墙默认是开着的,想正常访问只有两个办法:一是关闭防火墙;二是配置防火墙白名单规则。当然我的建议是配置白名单的方式,比较服务器安全应该考虑在第一位。如果你只是做测试什么的那你可以直接关闭防火墙。
1、防火墙规则配置
通过以下命令,打开防火墙的公共配置文件public.xml
[root@localhost temp]# vi /etc/firewalld/zones/public.xml
并在文件中的<zone></zone>标签内的最后位置添加以下内容
<rule family="ipv4">
<source address="172.17.0.0/16" />
<accept />
</rule>
其中address的172.17.0.0/16表示匹配172.17.xx.xx IP段所有IP,不需要配置端口。
当然如果你只想放开某个特定的端口,比如前面提到的Mysql数据库的3306端口,你可以在此文件中添加:
<port protocol="tcp" port="3306"/>
或者,通过命令的方式进行添加,如:
# 开放3306端口
[root@localhost temp]# firewall-cmd --permanent --add-port=3306/tcp
2、Springboot应该自身原因,可以通过docker logs命令查看容器内的运行日志情况,进行进一步的判断。
[root@localhost temp]# docker logs -f b1bb;
这里命令中的 b1bb是docker的容器ID,只需要前4位即可。可以通过docker ps 命令查看所有的容器,获得你自己容器的ID。
至此整个发布结束。有其他问题的可以一起探讨。