使用docker、docker-compose部署、发布spring boot项目,并通过外网访问

说起Docker,大家并不陌生。是目前在开源社区比较火爆的一个东东。它是一个开源的应用引擎,可以为应用系统创建一个可移植的独立的自主容器。容器运行在Linux上,相当于一个虚拟机。但是它与传统的虚拟机有区别。Docker启动速度快,占用资源少,所以非常适合来发布微服务。
如我们的spring boot项目,就十分适合部署在docker上。我想这是未来的一种趋势。


一个周末,终于搞明白了如何在docker上发布spring boot项目。由于本人水平有限,还是折腾了一下,文中描述的都是自己一步一步探索出来,经过验证通过。可能有的比描述的更简便,或者是描述的并不恰当,望大家多多指点一下,让小弟也学习一下,更进一步。谢谢。


  • 关于使用spring boot快速构建Restful API接口,在这里不在讲述,spring boot官方文档就是一个很好的例子。
  • 关于Restful API接口的设计指南,下面这篇文章讲解比较好。
    http://www.ruanyifeng.com/blog/2014/05/restful_api.html

  • 下面我们就开始吧

  • 说明:docker和docker-compose的安装,在此不再讲述,请查阅相关资料。

  • 本次我使用的是安装在VituralBox 中的centos7.2

1、创建Dockerfile

Dockerfile是一个文本文件。

  • 登录Linux系统,在根目录创建一个文件夹。
[root@rainbow /]# mkdir web
[root@rainbow /]# cd web/
[root@rainbow web]# 
  • 创建Dockerfile
[root@rainbow web]# vi Dockerfile
  • Dockerfile文件内容如下:
FROM java:8
ADD rainbow-api-user-0.0.1-SNAPSHOT.jar rainbow-api-user.jar
RUN bash -c 'touch /rainbow-api-user.jar'
EXPOSE 8085
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/rainbow-api-user.jar"]
  • 保存退出。
  • 关于Dockerfile文件命令请查看相关文档

2、打包、上传spring boot项目的jar文件

  • 打包
    点击如下图:
image.png
  • 然后输入命令:
image.png
  • 说明:关于数据库连接的配置
  • 由于我的mongodb数据库是安装在Linux中的,项目部署后,是去访问Linux中的mongodb,虽然docker也是安装在Linux上的,但是数据库连接不能配置为127.0.0.1,因为127.0.0.1是指向docker容器自己。因为Linux与物理机共用IP,所以查看一下宿主机的IP是多少,那就把数据库配置连接中的IP写成多少,如我的宿主机IP是192.168.31.88,那配置如下:
image.png
  • 如果配置为127.0.0.1,那从物理机可以访问到Linux中的mongodb,但是如果spring boot部署到docker容器中,就无法访问了,因为127.0.0.1指向的是容器本身。这点我也是踩了个坑。

  • 待项目打包完成后,在项目的target路径下,会有两个jar包,我们需要如下的:

image.png
  • 上传项目,使用sftp 工具,将jar文件上传到Linux服务器。
    我们在刚刚创建的web目录下,再创建一个webapp文件夹,并把Dockerfile文件移动到webapp文件夹下:
[root@rainbow web]# mkdir webapp
[root@rainbow web]# mv Dockerfile webapp/

将jar文件上传到webapp目录下。此时,webpp下有如下两个文件:

image.png

现在,我们可以使用docker来构建项目了。由于我们本次的目的是使用docker-compose构建,所以只写出构建命令
在webapp路径下执行:

docker build -t spring .
  • 注意:命令最后的那个点,不能少,表示的是当前路径,因为Dockerfile在当前路径下。spring是构建的镜像名,可以自己取。

3、使用docker-compose构建

首先,新建一个docker-compose.yml文件。由于这是个yaml文件,所以格式、缩进很重要。为了不出错,所以在spring boot项目的resources目录下新建一个docker-compose.yml文件,配置好相关项之后,再上传到服务器。内容如下:

spring:
  build: ./webapp
  ports:
   - "80:8085"
  • 这个脚本表示,从当前路径的webapp目录中创建镜像,并将镜像命名为:web,然后使用宿主的80端口映射容器的8085端口。当然,webapp中存放有项目的jar和Dockerfile脚本。

  • 说明:容器的8085端口,因为我自己的项目是跑在8085端口上的,所以要将容器的8085端口映射出来,才能访问。

  • 将docker-compose.yml文件上传到服务器的web目录下:

  • 此时,web的目录结构如下:

image.png
  • 最后,我们就可以使用docker-compose up -d 命令来构建运行了。-d表示在后台运行。注意,要在web路径下执行。

  • 构建成功之后,会与如下的提示:

[root@rainbow web]# docker-compose up -d
Building spring
Step 1 : FROM java:8
 ---> d23bdf5b1b1b
Step 2 : ADD rainbow-api-user-0.0.1-SNAPSHOT.jar rainbow-api-user.jar
 ---> e2d71b21b18d
Removing intermediate container a67714060589
Step 3 : RUN bash -c 'touch /rainbow-api-user.jar'
 ---> Running in 80373f7f206f
 ---> 00e9ab13963d
Removing intermediate container 80373f7f206f
Step 4 : EXPOSE 8085
 ---> Running in a161e595c79c
 ---> b77fe6b6f8e3
Removing intermediate container a161e595c79c
Step 5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /rainbow-api-user.jar
 ---> Running in e25617bae6a2
 ---> a5a04f6f82a1
Removing intermediate container e25617bae6a2
Successfully built a5a04f6f82a1
WARNING: Image for service spring was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating web_spring_1 ... 
Creating web_spring_1 ... done
[root@rainbow web]# 
  • 到此,容器已经构建运行完成。spring boot项目已经完成发布了。

  • 查看运行的容器

docker-compose ps
  • 可以看到,我们的容器已经正在运行了。
[root@rainbow web]# docker-compose ps
    Name                  Command               State          Ports         
web_spring_1   java -Djava.security.egd=f ...   Up      0.0.0.0:80->8085/tcp 
[root@rainbow web]# 
  • 查看容器的日志信息:
    docker-compose logs -f [容器名]
docker-compose logs -f spring
image.png
  • 停止容器
docker-compose stop spring
  • 启动容器
docker-compose start spring
  • 访问spring boot项目。现在,可以访问容器了。spring boot项目的端口号是8085,我们把容器的8085端口映射到了宿主机的80端口,所以可以直接使用80端口访问项目。
  • 如下,可以正常访问,到此,我们的spring boot项目部署成功
image.png

4、使用外网能够访问docker容器中的spring boot项目

企业一般应该是使用VPN工具来映射IP地址,然后就可以通过外网访问了。由于我们没有公网IP,所以我在此使用了花生壳这个工具,将宿主机的IP和端口映射到花生壳,就可以使用域名从外网访问docker容器中的spring boot项目了。

  • 花生壳的使用不再介绍。

花生壳中有个内网映射功能。映射之前要先开通花生壳的内网穿透功能。我把我宿主机的IP:192.168.31.88,因为spring boot项目的端口是8085,但是经过docker容器映射到了宿主机的80端口,所以我们只需要映射宿主机的80端口即可。

image.png
  • 使用域名访问docker容器中的spring boot。
image.png

到此,spring boot项目在docker容器中的部署已完成。由于本人水平有心,不足支持网大家多多指导一下小弟,谢谢!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容