使用Docker容器化SpringBoot+Dubbo應用的實踐

逗貓攻城獅發表於2019-03-01

原文地址: 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
複製程式碼
  • 檢視容器的啟動日誌
    使用Docker容器化SpringBoot+Dubbo應用的實踐

可以看到日誌輸出的current host: 172.17.0.2,這個IP就是容器內的IP,同時可以看到服務註冊的IP也是172.17.0.2,此時我的本地IP是192.168.1.7,如果消費者去消費服務,是不會成功的。

  • 啟動消費者會直接報錯
    使用Docker容器化SpringBoot+Dubbo應用的實踐

這種情況網上很多解決辦法都是通過固定容器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如下
    使用Docker容器化SpringBoot+Dubbo應用的實踐

這時候雖然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檢視映象,剩餘步驟同上。
    經測試,容器執行正常
使用Docker容器化SpringBoot+Dubbo應用的實踐

End

本文到這裡就結束了,我在上一篇部落格的原始碼中進行了一些改動,文中用到的Dockfile都在其中,原始碼在這裡,文章是個人學習的實踐總結,會有不完善的地方,若有更好的做法,歡迎大家指出,謝謝!

相關文章