Docker在日常开发中越来越火,工作中后端很多项目都需要使用Docker进行容器化,SpringBoot+Docker被称为“原生云应用”,SpringBoot应用和Docker结合非常容易。但是对于Dubbo和Docker结合就不是那么的顺利,由于Dubbo官方停止维护许久,同时Dubbo官方在不久前才开始积极支持SpringBoot。我在踩了很多坑之后,用本篇博客记录使用Docker容器化Dubbo应用的方法,接我的上一篇SpringBoot+Dubbo的博客。
我们需要准备好一个SpringBoot+Dubbo的项目(我直接使用的我上一篇博客的项目),同时本机需要安装Docker。
vi Dockerfile
FROM openjdk:8-jre-alpine MAINTAINER luoliang ADD target/dubbo-provider.jar app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app.jar"] EXPOSE 12345
docker build -t dubbo-provider .
docker run -d -p 12345:12345 --name dubbo-provider dubbo-provider
可以看到日志输出的current host: 172.17.0.2,这个IP就是容器内的IP,同时可以看到服务注册的IP也是172.17.0.2,此时我的本地IP是192.168.1.7,如果消费者去消费服务,是不会成功的。
这种情况网上很多解决办法都是通过固定容器IP来解决,这样的话移植性不是很好。Dubbo在重新维护后,在新版本中添加了两个环境变量,用于支持Docker容器。可以查看官方的 issue .
修改上面的Dockerfile,添加env
DUBBO_IP_TO_REGISTRY 填写在zookeeper中注册的IP
FROM openjdk:8-jre-alpine MAINTAINER luoliang ENV DUBBO_IP_TO_REGISTRY 192.168.1.7 ENV DUBBO_PORT_TO_REGISTRY 12345 ADD target/dubbo-provider.jar app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app.jar"] EXPOSE 12345
重新build之后重新启动一个容器,可以看到服务注册地址已经变成了指定的IP,消费者可以成功的进行调用。
docker run -d -p 12345:12345 -e DUBBO_IP_TO_REGISTRY=192.168.1.7 -e DUBBO_PORT_TO_REGISTRY=12345 --name dubbo-provider dubbo-provider
这时候虽然current host还是172.17.0.2,但服务的注册地址已经变成了192.168.1.7。
上面我们都是通过手动构建的镜像,为了提高效率,同时也能让SpringBoot+Dubbo这样的项目能更好的融入像Jenkins这样的CI系统中,构建出全自动的pipeline。
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>dubbo-provider</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
project/ Dockerfile pom.xml
mvn package 或者 mvn dockerfile:build
本文到这里就结束了,我在上一篇博客的源码中进行了一些改动,文中用到的Dockfile都在其中,源码在 这里 ,文章是个人学习的实践总结,会有不完善的地方,若有更好的做法,欢迎大家指出,谢谢!