原文地址: 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