原文地址: luoliangDSGA`s blog
部落格地址: luoliangdsga.github.io
歡迎轉載,轉載請註明作者及出處,謝謝!
使用Docker容器化SpringBoot+Dubbo應用的實踐
Docker在日常開發中越來越火,工作中後端很多專案都需要使用Docker進行容器化,SpringBoot+Docker被稱為“原生雲應用”,SpringBoot應用和Docker結合非常容易。但是對於Dubbo和Docker結合就不是那麼的順利,由於Dubbo官方停止維護許久,同時Dubbo官方在不久前才開始積極支援SpringBoot。我在踩了很多坑之後,用本篇部落格記錄使用Docker容器化Dubbo應用的方法,接我的上一篇SpringBoot+Dubbo的部落格。
要解決的問題
- Dubbo Provider在Docker container中進行服務註冊,在zookeeper中的註冊IP是容器IP,這樣外部的Dubbo Consumer是無法呼叫的。
開始
我們需要準備好一個SpringBoot+Dubbo的專案(我直接使用的我上一篇部落格的專案),同時本機需要安裝Docker。
- 新建一個Dockerfile
vi Dockerfile
複製程式碼
- 編寫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 .
複製程式碼
- 執行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,消費者可以成功的進行呼叫。
- 也可以不修改Dockerfile,通過run命令傳入引數
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
複製程式碼
- 此時服務提供者的log如下
這時候雖然current host還是172.17.0.2,但服務的註冊地址已經變成了192.168.1.7。
使用maven外掛構建映象
上面我們都是通過手動構建的映象,為了提高效率,同時也能讓SpringBoot+Dubbo這樣的專案能更好的融入像Jenkins這樣的CI系統中,構建出全自動的pipeline。
- 在pom中加入外掛的依賴
<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>
複製程式碼
- 把dockerfile放在和pom.xml同級的目錄下
project/
Dockerfile
pom.xml
複製程式碼
- 使用maven命令進行打包
mvn package 或者 mvn dockerfile:build
複製程式碼
- 命令執行完成,可以使用docker images檢視映象,剩餘步驟同上。
經測試,容器執行正常
End
本文到這裡就結束了,我在上一篇部落格的原始碼中進行了一些改動,文中用到的Dockfile都在其中,原始碼在這裡,文章是個人學習的實踐總結,會有不完善的地方,若有更好的做法,歡迎大家指出,謝謝!