文档章节

docker - 部署一个复杂的springboot服务

细肉云吞
 细肉云吞
发布于 2018/12/26 23:11
字数 1048
阅读 243
收藏 10

    在文章 docker容器网络 - 同一个host下的容器间通信 中,我们已经了解怎么在同一个host中容器间互相通信,本文将会利用学会的知识,部署一个“复杂”的springboot应用。该应用实现一个计数服务,springboot应用暴露服务接口,通过redis实现计数功能。该应用在docker里的部署图如下图所示:

我们先看下应用的代码,初步了解下应用提供什么服务。

在配置文件中配置了一个redis。redis地址将会在容器启动的时候通过设置环境变量修改

spring.application.name=springboot-redis
server.port=8080
logging.file=app.log

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

应用通过rest的方式提供了计数的服务

    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping("/count")
    public Long count() {
        ValueOperations<String, Long> valueOperations = redisTemplate.opsForValue();
        Long next = valueOperations.increment("counter", 1);
        System.out.println("get next counter, value=" + next);
        return next;
    }

要成功部署该服务,共需要三步:1、创建网络;2、部署redis;3、部署app。

创建网络

为了能够通过容器名访问其它容器,这里需要创建一个bridge网络,名字为my_bridge

[root@localhost data]# docker network create --driver bridge my_bridge
6067b2b842be2daf748bd8300eff2d63cbb9cb15746a4fd540621010e684daf6

部署redis

redis的官方镜像可以在 链接 中查看,里面有详细的配置信息和启动说明。本文将会采用redis 4.0.11版本。

(1) 拉取redis镜像

docker pull redis:4.0.11

(2)运行redis容器

[root@localhost data]# docker run --name redis --network my_bridge -v /data/redis:/data -d redis:4.0.11 redis-server --appendonly yes
68334422af05dba03d87ec1dafbc1dc0bb85302389b0e7f04722405f80074d95
  • --name:容器名为redis
  • --network:redis容器连接到my_bridge网络
  • -v:redis的持久化数据默认存放在容器的/data目录,这里把/data目录映射到宿主主机的/data/redis数据卷中
  • -d:后台运行
  • --appendonly yes:redis数据持久化

(3)验证redis是否运行正常

因为redis容器在启动的时候没有暴露端口到宿主主机,所以我们需要进入到redis容器中,并通过redis-cli操作redis验证是否正常工作。

交互方式进入容器:

[root@localhost data]# docker exec -it redis bash
root@68334422af05:/data#

运行redis-cli客户端,与redis交互

root@68334422af05:/# redis-cli

127.0.0.1:6379> set 123 123
OK
127.0.0.1:6379> get 123
"123"

OK,redis运行正常。

部署应用

springboot-redis的dockerfile如下,如果对dockerfile不熟悉,可以通过 构建一个简单的docker镜像  、 Dockerfile常用指令 dockerfile构建一个简单的springboot应用镜像 熟悉。

FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD springboot-redis-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

创建springboot-redis:1.0镜像

[root@localhost springboot-redis]# docker build -t springboot-redis:1.0 .

Sending build context to Docker daemon  25.47MB
Step 1/7 : FROM openjdk:8u181-jdk-alpine
 ---> 97bc1352afde
Step 2/7 : ARG workdir=/app
 ---> Running in 65e48ea3ccf6
Removing intermediate container 65e48ea3ccf6
 ---> 15ef3bac3e17
Step 3/7 : VOLUME ${workdir}
 ---> Running in 0b5421f1827d
Removing intermediate container 0b5421f1827d
 ---> ce5e62a86355
Step 4/7 : WORKDIR ${workdir}
Removing intermediate container 9009b9ac08e6
 ---> 2e50c02c2f88
Step 5/7 : ADD springboot-redis-1.0.jar app.jar
 ---> 20e46c2d3b76
Step 6/7 : EXPOSE 8080
 ---> Running in c58cf2d973ee
Removing intermediate container c58cf2d973ee
 ---> bc5cb5e87d27
Step 7/7 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
 ---> Running in b66b3e2ecf6e
Removing intermediate container b66b3e2ecf6e
 ---> 05de26e57ed3
Successfully built 05de26e57ed3
Successfully tagged springboot-redis:1.0

运行springboot-redis容器。

[root@localhost ~]# docker run -p 8080:8080  -d --name springboot-redis --network my_bridge --env spring.redis.host=redis springboot-redis:1.0

因为设置了容器的网络是前面定义的my_bridge,所以在springboot-redis容器中,可以通过redis容器名访问到容器。所以,可以通过--env参数设置redis的地址是 redis 。

通过下面的命令可以实时查看日志输出

[root@localhost ~]# docker logs -f springboot-redis

在浏览器上验证一下服务是否正常。192.168.88.30是我的宿主机IP。

总结

有时,一个应用需要很多个服务同时部署,如果都按照上面的方式进行部署,将是一个很吃力的事情。那么,有什么样的方式可以简化我们的部署呢?docker-compose是docker官方提供的服务编排工具,通过docker-compose脚本可以批量启动我们的服务。

 

文章收录于:

容器技术系列汇总

© 著作权归作者所有

细肉云吞
粉丝 118
博文 231
码字总数 170386
作品 0
其它
高级程序员
私信 提问
springboot docker jenkins 部署 对比 tomcat

---------------------------------------------------------------------------------------------------------------- springboot 详解 (一) helloworld 下载demo springboot 详解 (二)......

curiousby
2018/06/26
0
0
springboot 详解 (六)servlet & scheduled & listener

---------------------------------------------------------------------------------------------------------------- springboot 详解 (一) helloworld 下载demo springboot 详解 (二)......

curiousby
2016/11/17
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
2018/05/28
0
0
docker(三):使用maven 插件构建docker镜像

---layout: blogistop: truetitle: "使用maven 插件构建docker镜像"date: 2018-09-11category: dockertags: docker --- 介绍 作为一个java后端开发人员,docker如何与Maven 工程相结合是我们......

开心的哈士奇
2018/10/17
164
0
springboot整合docker部署(两种构建Docker镜像方式)

在docker开始部署springBoot项目(方法一) Dockerfile 文件 1.在centos7 ~ 创建一个文件夹docker 里面放置 上面的Dockerfile 和 springBoot 打包的项目dockerspringboot.jar 在该docker文件下...

时刻在奔跑
2018/12/05
422
0

没有更多内容

加载失败,请刷新页面

加载更多

 介绍一款优秀的通用管理权限快速开发框架

这是一套以权限管理为主的轻量化快速开发框架,配置有流程、专业表单、权限、app、企业微信等基础功能模块,在开发通用软件的效率上很有优势。 软件平台常用研发需求分析 《那些年我们一起做...

我想造火箭
24分钟前
7
0
ElasticDL:蚂蚁金服开源基于 TensorFlow 的弹性分布式深度学习系统

9 月 11 日,蚂蚁金服在2019谷歌开发者大会上海站上开源了 ElasticDL 项目,这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统。 开源地址为:https://github.com/sql-machine-learni...

SOFAStack
32分钟前
4
0
CSS--渐变

一、什么是渐变 多种颜色平缓变化的一种显示效果 二、渐变的主要元素 色标:一种颜色,以及出现的位置,一个渐变至少两种色标 三、渐变的分类 1、线性渐变 以直线的方式来填充渐变色 backgr...

wytao1995
47分钟前
12
0
Java通过模板生成PDF再转换为图片

1、添加maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version></dependency><dependency> <g......

醉美閑聖
53分钟前
5
0
SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部