如何在Docker中部署一個可以被外部訪問的Apollo配置中心


  攜程Apollo是一個基於Java開發的強大配置中心,提供了基於Docker的快速部署方案:https://github.com/ctripcorp/apollo/wiki/Apollo-Quick-Start-Docker%E9%83%A8%E7%BD%B2

  但是通過官方部署方案部署完成之后,我們會發現,通過瀏覽器可以訪問授權中心8070、8080端口,但是只有在同一網橋內部的程序可以成功獲取Apollo中的配置信息,其他服務器或者網橋以外的程序無法成功獲取配置需信息。

  通過觀察,我發現問題原因如下:Apollo配置中心通過8080端口提供配置獲取接口,其接口依賴Spring Eureka,默認情況下,Eureka使用的是網橋中該節點的IP地址端口號,以其他IP地址訪問是不被允許的。

  依據該情況,我首先對Apollo提供的docker-compose文件做如下改動:

  1. 為apollo-quick-start容器增加環境變量,配置實例地址為容器所在宿主機IP地址。
  2. 對8090端口做映射,后面會用到。
  3. 為保證容器銷毀后數據不丟失,為apollo-db節點增加目錄映射,將數據庫路徑映射到宿主機中

  修改后docker-compose文件如下,高亮部分為個人增加部分:

version: '2'

services:
  apollo-quick-start:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-quick-start
   
 environment: EUREKA_INSTANCE_IP_ADDRESS: '192.168.10.151'
    depends_on:
      - apollo-db
    ports:
      - "8090:8090"
      - "8080:8080"
      - "8070:8070"
    links:
      - apollo-db

  apollo-db:
    image: mysql:5.7
    container_name: apollo-db
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    depends_on:
      - apollo-dbdata
    ports:
      - "13306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
      - ./data:/var/lib/mysql
    volumes_from:
      - apollo-dbdata

  apollo-dbdata:
    image: alpine:latest
    container_name: apollo-dbdata
    volumes:
      - /var/lib/mysql

  修改完成后通過docker-compose啟動容器,我們打開,8080端口,會發現此處顯示宿主機IP地址,則修改成功:

 

  但是我們通過8070端口,訪問Apollo配置中心界面,進入項目配置會發現報錯。此時查看管理員工具->系統信息:發現Meta serve,Config Services,Admin Service信息配置不正確。

  這里我們需要通過連接Apollo數據庫,修改其中的配置項。修改內容如下:講數據庫ApolloConfigDB中ServerConfig表的Key=eureka.service.url的數據項的Value值改為http://【宿主機IP】:8080/eureka/,將數據庫ApolloPortalDB的ServerConfig表中Key=apollo.portal.meta.servers項中value改為{"DEV":"http://【宿主機IP】:8080"}

  修改后,我們通過docker-compose重建Apollo容器,再次打開8070端口,我們會發現一下配置項均為以宿主機IP為根的正確地址:(這里我們可以看到8090端口也必須是宿主機IP,所以前面我把8090端口映射出來)

 

   查看Apollo中所有項目及配置,可正常呈現。則所有配置成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM