docker部署微服务

微服务单容器部署

最近在看容器,跟同事沟通,他想把微服务放到单个容器里部署,以实现环境不变.这个只能是测试自己玩一下,生产环境中单容器部署微服务容易出现,容器运行正常,但是部分服务不可用的情况,应用的管理也很麻烦,这里简单做个记录吧

实际启动服务有三部分:

  1. nacos注册中心
  2. redis缓存服务,实际后端服务还有mysql,这里它没有容器化
  3. 多个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带宽的阿里云服务器

参考示例:

https://github.com/liulei3/bidclear.git

原文地址:https://www.cnblogs.com/chengmuyu/p/13099433.html