原文地址: luoliangDSGA's blog
博客地址: luoliangdsga.github.io
欢迎转载,转载请注明做者及出处,谢谢!java
Docker在平常开发中愈来愈火,工做中后端不少项目都须要使用Docker进行容器化,SpringBoot+Docker被称为“原生云应用”,SpringBoot应用和Docker结合很是容易。可是对于Dubbo和Docker结合就不是那么的顺利,因为Dubbo官方中止维护许久,同时Dubbo官方在不久前才开始积极支持SpringBoot。我在踩了不少坑以后,用本篇博客记录使用Docker容器化Dubbo应用的方法,接个人上一篇SpringBoot+Dubbo的博客。git
咱们须要准备好一个SpringBoot+Dubbo的项目(我直接使用的我上一篇博客的项目),同时本机须要安装Docker。github
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,若是消费者去消费服务,是不会成功的。docker
这种状况网上不少解决办法都是经过固定容器IP来解决,这样的话移植性不是很好。Dubbo在从新维护后,在新版本中添加了两个环境变量,用于支持Docker容器。能够查看官方的issue.apache
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。bash
上面咱们都是经过手动构建的镜像,为了提升效率,同时也能让SpringBoot+Dubbo这样的项目能更好的融入像Jenkins这样的CI系统中,构建出全自动的pipeline。app
<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都在其中,源码在这里,文章是我的学习的实践总结,会有不完善的地方,如有更好的作法,欢迎你们指出,谢谢!dom