微服务单容器部署
最近在看容器,跟同事沟通,他想把微服务放到单个容器里部署,以实现环境不变.这个只能是测试自己玩一下,生产环境中单容器部署微服务容易出现,容器运行正常,但是部分服务不可用的情况,应用的管理也很麻烦,这里简单做个记录吧
实际启动服务有三部分:
- 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带宽的阿里云服务器
参考示例: