微服務單容器部署
最近在看容器,跟同事溝通,他想把微服務放到單個容器里部署,以實現環境不變.這個只能是測試自己玩一下,生產環境中單容器部署微服務容易出現,容器運行正常,但是部分服務不可用的情況,應用的管理也很麻煩,這里簡單做個記錄吧
實際啟動服務有三部分:
- nacos注冊中心
- redis緩存服務,實際后端服務還有mysql,這里它沒有容器化
- 多個springboot服務
這三部分各自運行在自己的容器中
FROM adoptopenjdk/openjdk8-openj9:alpine-jre
LABEL liulei getobjects@sina.com
ENV BASE_DIR="/opt/bidclear" \
BASE_CODING="UTF-8" \
BASE_XMS="-Xms128m" \
BASE_XMX="-Xmx512m" \
ACTIVE_PROFILE="test" \
REDIS_HOST="redis" \
REDIS_PORT="6379" \
NACOS_HOST="nacos"
WORKDIR /$BASE_DIR
COPY ./jar/*.jar ./jar/
COPY ./start.sh ./start.sh
RUN chmod +x ./start.sh
EXPOSE 9961
ENTRYPOINT ["/opt/bidclear/start.sh"]
服務啟動:
docker-compose up -d
服務核心是ENTRYPOINT ["/opt/bidclear/start.sh"],將多個微服務的啟動腳本放到了一起.
執行腳本start.sh內容:
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-report-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-report.log 2>&1 &
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-user-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-user.log 2>&1 &
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-bidclear.log 2>&1 &
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-gateway-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-gateway.log 2>&1 &
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-log-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-log.log 2>&1 &
nohup java ${JAVA_OPT} -jar ${BASE_DIR}/jar/bidding-clearing-message-service-1.0.0.jar ${PRO_OPT} > ${BASE_DIR}/log/nohup-message.log 2>&1
容器內部運行情況,因為通過dockerfile的entrypoint啟動了運行腳本,容器會把該腳本作為pid=1的進程,其內運行的服務都是它的子進程.
這里要說的是容器的退出,我腳本中啟動了6個服務,但是最后一個服務沒有加"&"(后台運行標識),因為容器內部全部是后台進程的話,容器會因為監聽不到服務運行而退出.
同時容器內部只能有一個前台進程與容器交互,所以這種寫法只能測試中玩一下,因為如果容器內的前台進程掛掉,整個容器就會退出,也就是所有該容器內的服務都會退出.
問題:
nacos服務進行服務注冊時會占用大量cpu,可能存在服務掛掉的情況
服務器配置:2核4g,1m帶寬的阿里雲服務器
參考示例: