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

原文地址: luoliangDSGA's blog
博客地址: luoliangdsga.github.io
歡迎轉載,轉載請註明做者及出處,謝謝!java

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

Docker在平常開發中愈來愈火,工做中後端不少項目都須要使用Docker進行容器化,SpringBoot+Docker被稱爲「原生雲應用」,SpringBoot應用和Docker結合很是容易。可是對於Dubbo和Docker結合就不是那麼的順利,因爲Dubbo官方中止維護許久,同時Dubbo官方在不久前纔開始積極支持SpringBoot。我在踩了不少坑以後,用本篇博客記錄使用Docker容器化Dubbo應用的方法,接個人上一篇SpringBoot+Dubbo的博客git

要解決的問題

  • Dubbo Provider在Docker container中進行服務註冊,在zookeeper中的註冊IP是容器IP,這樣外部的Dubbo Consumer是沒法調用的。

開始

咱們須要準備好一個SpringBoot+Dubbo的項目(我直接使用的我上一篇博客的項目),同時本機須要安裝Docker。github

  • 新建一個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,若是消費者去消費服務,是不會成功的。docker

  • 啓動消費者會直接報錯

這種狀況網上不少解決辦法都是經過固定容器IP來解決,這樣的話移植性不是很好。Dubbo在從新維護後,在新版本中添加了兩個環境變量,用於支持Docker容器。能夠查看官方的issue.apache

  • 修改上面的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。bash

使用maven插件構建鏡像

上面咱們都是經過手動構建的鏡像,爲了提升效率,同時也能讓SpringBoot+Dubbo這樣的項目能更好的融入像Jenkins這樣的CI系統中,構建出全自動的pipeline。app

  • 在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都在其中,源碼在這裏,文章是我的學習的實踐總結,會有不完善的地方,如有更好的作法,歡迎你們指出,謝謝!dom

相關文章
相關標籤/搜索