背景
Docker是现在主流的容器技术,使用容器部署可以忽略应用依赖环境,我们可以很便捷地部署、更新应用。我们在联调开发过程中,可以借助Docker+Frp
这一方案实现远程联调。
Dockerfile编写
我现在在/opt/english-learn
目录下准备好了我的程序包english-learn-backend-1.0-SNAPSHOT.jar
,下面我会把他打包进Docker镜像中。我们还需要Dockerfile文件,下面是我的Dockerfile文件示例:
# 使用官方的Java 8运行时作为父镜像
FROM openjdk:8-jre
# 将jar包添加到容器中
COPY ./*.jar /app.jar
# 设置工作目录
WORKDIR /
# 指定容器启动时执行的命令
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
这个Dockerfile定义了镜像制作步骤,首先下载openjdk:8-jre
基础镜像,然后将当前目录/opt/english-learn
下的*.jar
文件复制到容器/
根目录下,并且重新命名包名为app.jar
。设置工作目录为/
根目录,最后指定启动容器的命令。
镜像制作
Dockerfile编写完成后,我的/opt/english-learn
目录下就有两个文件:
root@root:/opt/english-learn# ls -l
total 48844
-rw-r--r-- 1 root root 276 May 4 02:59 Dockerfile
-rw-r--r-- 1 root root 50005065 May 4 16:51 english-learn-backend-1.0-SNAPSHOT.jar
接下来我们直接制作镜像:
docker build -t english-learn .
等待命令执行完成,这样我们就制作好了我们的english-learn
镜像。docker images
查看Dcoker镜像:
root@root:/opt/english-learn# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
english-learn latest 85499e063e25 About an hour ago 316MB
启动容器
在镜像制作好之后我们就可以启动应用容器了:
docker run --name english-learn -d -p 18080:8080 english-learn
我们运行english-learn:latest
镜像,指定容器名称为english-learn
,让容器在后台运行,将容器内的8080端口映射到虚机的18080。这样我们就可以使用ip:18080
访问服务了。
因为每次Jar包更新我们都需要重新重新执行上面的步骤,重新制作镜像->重启容器。我给出我的镜像重新构建的脚本rebuild.sh
,一键重构镜像并且运行容器去更新应用:
docker stop english-learn
docker rm english-learn
docker build -t english-learn .
docker run --name english-learn -d -p 19063:8080 english-learn
大家在使用过程中只要把english-learn
替换成自己的应用名称。这样的话每次更新我们只要更换目录下的Jar包,再执行rebuild.sh
脚本文件即可完成应用更新的发布。
公网访问
在我们使用Docker部署我们的应用之后,有时候我们远程联调需要把服务暴露到公网,这个时候就需要用到内网穿透的解决方案,frp是个不错的选择。
这需要我们有一台公网服务器,我们在服务器端配置frp服务端,在我们内网虚机中配置frp客户端,通过配置把我们的内网服务映射到公网。这里不做详细介绍。感兴趣的可私信留言,也可以参见本人往期博客《树莓派内网端口映射》。