攜程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文件做如下改動:
- 為apollo-quick-start容器增加環境變量,配置實例地址為容器所在宿主機IP地址。
- 對8090端口做映射,后面會用到。
- 為保證容器銷毀后數據不丟失,為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中所有項目及配置,可正常呈現。則所有配置成功。