乐趣区

Springboot整合MongoDB的Docker开发其它应用也类似

1 前言

Docker是容器开发的事实标准,而 SpringbootJava微服务常用框架,二者必然是会走到一起的。本文将讲解如何开发 Springboot 项目,把它做成 Docker 镜像,并运行起来。

2 把 Springboot 打包成 Docker 镜像

SpringbootWeb 开发非常简单,本次使用之前讲解过的 Springboot 整合 MongoDB 的项目,请参考

实例讲解 Springboot 整合 MongoDB 进行 CRUD 操作的两种方式,文章中有源码;MongoDB的安装请参考:用 Docker 安装一个 MongoDB 最新版玩玩。

2.1 修改配置文件,让容器内部连接宿主机服务

修改 Springboot 的配置文件,主要是 MongoDB 的连接信息:

server.port=8080

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.username=user
spring.data.mongodb.password=123456
spring.data.mongodb.host=host.docker.internal
spring.data.mongodb.port=27017

MongoDBhost 需要修改为 host.docker.internal,而不能是localhost 或者 127.0.0.1。因为Springboot 是运行在 Docker 容器里面的,有网络隔离。查看 Dockernetwork,有以下三个,默认使用 bridge,这时就无法通过localhost 访问。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8560aacda859        bridge              bridge              local
2a276c0230a3        host                host                local
0eeb101bcf52        none                null                local

对于 Linuxnetwork 可以切换成 host 模式,这可以直接使用localhost,但不建议这样做,这相当于容器与宿主机共享网络,会有风险。

对于 MacWindows,如果 Docker 版本在 v18.03 或以上,就可以使用host.docker.internal。建议使用新版本,就不用考虑更早版本的方案了,哈哈。

2.2 通过 Dockerfile 生成镜像

通过 Dockerfile 来生成镜像是很常用的方式,必须要掌握的,文件具体内容如下:

FROM adoptopenjdk/openjdk8-openj9
VOLUME /tmp

ARG JAR_FILE=target/springboot-mongo-0.0.1-SNAPSHOT.jar
ARG PORT=8080
ARG TIME_ZONE=Asia/Shanghai

ENV TZ=${TIME_ZONE}
ENV JAVA_OPTS="-Xms64m -Xmx256m"

COPY ${JAR_FILE} pkslow.jar

EXPOSE ${PORT}

ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
  • FROM:指明我们基于某个镜像来打包,因为需要启动 Java 应用,所以我们找了一个带 JDK 环境的镜像。这就非常灵活了,有非常多带 Java 环境的镜像,即使没有合适的,也可以自己做一个;
  • ARGDockerfile构建时的参数;
  • ENV:环境变量;
  • COPY:把文件复制到新的镜像内;
  • EXPOSE:暴露端口,这样外部才能访问;
  • ENTRYPOINT:启动命令。

准备好了 Dockerfile 后,就可以开始打包了:

$ mvn clean package
$ docker build -t pkslow/springboot-mongo:0.0.3 .
Sending build context to Docker daemon  23.43MB
Step 1/10 : FROM adoptopenjdk/openjdk8-openj9
 ......
Step 10/10 : ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
 ---> Running in a1274810851f
Removing intermediate container a1274810851f
 ---> 4a56d8e1a93e
Successfully built 4a56d8e1a93e
Successfully tagged pkslow/springboot-mongo:0.0.3

先用 mavenSpringboot打成 jar 包,然后把 jar 包放到镜像里,打成新的镜像。

成功后查看镜像列表:

$ docker image ls pkslow/springboot-mongo
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
pkslow/springboot-mongo   0.0.3               4a56d8e1a93e        46 minutes ago      346MB
pkslow/springboot-mongo   0.0.2               3699f9106567        3 hours ago         346MB
pkslow/springboot-mongo   0.0.1               37a35d2af376        3 hours ago         346MB

3 启动应用

应用 Springboot 前请先确保已经成功启动了 MongoDB 并创建好了相关用户。

启动应用如下:

$ docker run -d --name pkslow-springboot -p 8080:8080 pkslow/springboot-mongo:0.0.3
ee479efc132b7839cf4973c5b78164554485f733489835f8888dcc726d2e1c3f

会返回一个容器 ID,可以查看其信息。

查看 Docker 容器运行状态,说明它正常运行:

$ docker ps -f name=pkslow*
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
ee479efc132b        pkslow/springboot-mongo:0.0.3   "/bin/sh -c'java ${…"   51 minutes ago      Up 51 minutes       0.0.0.0:8080->8080/tcp   pkslow-springboot

查看容器日志命令为:docker logs 容器 ID,如下:

说明 Springboot 应用已经正常启动,并成功连接MongoDB

Postman 做一个简单的测试,成功插入一条数据:

4 总结

虽然案例讲的是 SpringbootDocker开发,但其它应用也是类似的。

这是微软关于 Docker 微服务的开发流程图,大体就是 应用代码 ——Dockerfile—— 生成镜像 —— 容器编排服务 —— 运行 —— 测试 —— 提交,前面几步都一样的,后面的我们将会采用Kubernetes,后续再讲解。


欢迎访问南瓜慢说 www.pkslow.com 获取更多精彩文章!

欢迎关注微信公众号 <南瓜慢说>,将持续为你更新 …

多读书,多分享;多写作,多整理。

退出移动版