将springboot项目构建为docker镜像

Posted 5ycode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将springboot项目构建为docker镜像相关的知识,希望对你有一定的参考价值。

创建eureka-server项目

主要看下配置文件

server:
  port: 8765
  # 开启优雅停机kill -2 可以优雅停机
  shutdown: GRACEFUL
eureka:
  #此处设置会改变eureka控制台System Status的显示
  datacenter: cloud
  #此处设置会改变eureka控制台System Status的显示
  environment: dev
  instance:
    appname: eureka-server
    lease-renewal-interval-in-seconds: 5 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 #如果现在超过了5秒的间隔(默认是90秒
    instance-id: $spring.cloud.client.ip-address:$server.port # 在eureka中显示ip和端口
    prefer-ip-address: true # 访问的路径变为 IP 地址
    hostname: 127.0.0.1
  client:
    fetch-registry: true # 不通过eureka获取注册信息
    register-with-eureka: true # 不注册该服务到eureka上
    service-url:
      # 默认向 http://localhost:8761/eureka 发发请求 EurekaClientConfigBean中
#      defaultZone: http://$spring.cloud.client.ip-address:$server.port/eureka/
      defaultZone: http://127.0.0.1:$server.port/eureka/
  server:
    eviction-interval-timer-in-ms: 10000  #及时踢出已关停的节点,间隔时间
    enable-self-preservation: false # 关闭自我保护机制

具体查看:https://github.com/yxkong/ddd-framework/tree/main/ddd-parent/eureka-server

编写Dockerfile文件

参考了nacos

在根目录下创建Dockerfile

FROM centos:7.5.1804
MAINTAINER pader "5ycode@sina.com"

# set environment
ENV BASE_DIR="/home/appuser" \\
    CLASSPATH=".:/home/appuser/conf:$CLASSPATH" \\
    JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \\
    USER="appuser" \\
    JAVA="/usr/lib/jvm/java-1.8.0-openjdk/bin/java" \\
    JVM_XMS="256m" \\
    JVM_XMX="256m" \\
    JVM_XMN="78m" \\
    JVM_MS="128m" \\
    JVM_MMS="256m" \\
    REMOTE_DEBUG="n" \\
    TOMCAT_ACCESSLOG_ENABLED="false" \\
    APPNAME="eureka-server" \\
    PORT=8765 \\
    TIME_ZONE="Asia/Shanghai"

ARG EUREKA_VERSION=0.1
ARG HOT_FIX_FLAG=""

WORKDIR $BASE_DIR

RUN set -x \\
#     && yum update -y \\
    && yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
#     libcurl nc iputils wget vim
# RUN wget  https://maven.aliyun.com/nexus/content/groups/public/com/yxkong/eureka-server/$EUREKA_VERSION/eureka-server-$EUREKA_VERSION.jar -P /home/appuser
# 修改远程下载为本地下载
ADD target/eureka-server.jar /home/appuser/

# RUN yum autoremove -y wget \\
RUN  ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \\
    && yum clean all


ADD bin/docker-startup.sh bin/docker-startup.sh


# set startup log dir
RUN mkdir -p logs \\
  && cd logs \\
  && touch start.out \\
  && ln -sf /dev/stdout start.out \\
  && ln -sf /dev/stderr start.out
RUN chmod +x bin/docker-startup.sh

EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]

在根目录下创建bin/docker-startup.sh

#!/bin/bash
set -x
export CUSTOM_SEARCH_LOCATIONS=file:$BASE_DIR/conf/
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="$JAVA_OPT -server -Xms$JVM_XMS -Xmx$JVM_XMX -Xmn$JVM_XMN -XX:MetaspaceSize=$JVM_MS -XX:MaxMetaspaceSize=$JVM_MMS"
if [[ "$REMOTE_DEBUG" == "y" ]]; then
  JAVA_OPT="$JAVA_OPT -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
fi
JAVA_OPT="$JAVA_OPT -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$BASE_DIR/logs/java_heapdump.hprof"
JAVA_OPT="$JAVA_OPT -XX:-UseLargePages"

#===========================================================================================
# Setting system properties,覆盖配置文件的中的系统属性
#===========================================================================================

if [[ ! -z "$APPNAME" ]]; then
  JAVA_OPT="$JAVA_OPT -Deureka.instance.appname=$APPNAME"
fi

if [[ ! -z "$PORT" ]]; then
  JAVA_OPT="$JAVA_OPT -Dserver.port=$PORT"
fi


JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\\1/p')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]]; then
  JAVA_OPT="$JAVA_OPT -Xlog:gc*:file=$BASE_DIR/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
else
  JAVA_OPT="$JAVA_OPT -Xloggc:$BASE_DIR/logs/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi


JAVA_OPT="$JAVA_OPT -jar $BASE_DIR/eureka-server.jar"
# 自定义配置文件,从外面加载配置文件
#JAVA_OPT="$JAVA_OPT --spring.config.additional-location=$CUSTOM_SEARCH_LOCATIONS"
JAVA_OPT="$JAVA_OPT --spring.config.name=$CUSTOM_SEARCH_NAMES"
JAVA_OPT="$JAVA_OPT --server.max-http-header-size=524288"

echo "eureka is starting, you can docker logs your container"
exec $JAVA $JAVA_OPT

构建镜像并启动容器

# 构建
docker build -t 5ycode/eureka:0.1 .

# 运行容器
docker run -d --name eureka-server -p 8765:8765 5ycode/eureka:0.1 


添加到docker-compose中

  eureka-server:
    image: 5ycode/eureka:0.1
    container_name: eureka-server_dev
    restart: always
    environment: # 可以配置自定义的变量
      - "/etc/localtime:/etc/localtime"
      - JVM_XMS=312m
      - JVM_XMX=312m
      - REMOTE_DEBUG=y
    ports:
      - "8765:8765"
    volumes:
      - ./logs/eureka-server:/logs

Dockerfile指令说明

  • && 符号连接命令,执行结束只会创建一层镜像,否则一个RUN一层

  • FROM 定制的镜像是基于from的镜像

  • RUN 执行后面跟着的命令

  • COPY 复制指令,从上下文目录中复制文件或目录到容器里指定位置

  • ADD 和copy类似

  • 优点:在copy为 tar、gzip、bip2、xz的情况下会自动复制并解压到目标领

  • 缺点:无法复制tar压缩文件

  • CMD 类似于RUN指令,用于运行程序

  • CMD在 docker run时运行

  • RUN在docker build时运行

  • ENV 定义环境变量,在后续可以用这些环境变量 $变量名

  • ARG 与ENV作用一致,ARG 仅对Dockerfile内有效

  • VOLUME 定义匿名数据券,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷

  • EXPOSE 声明端口

  • WORKDIR 指定工作目录

  • USER 用于指定执行后续命令的用户和用户组(用户和用户组必须提前存在)

  • HEALTHCHECK 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

  • ONBUILD 用于延迟构建命令的执行

  • LABEL 用于给镜像添加一些元数据

参考
https://github.com/nacos-group/nacos-docker

https://www.runoob.com/docker/docker-dockerfile.html

以上是关于将springboot项目构建为docker镜像的主要内容,如果未能解决你的问题,请参考以下文章

使用Dockerfile为SpringBoot应用构建Docker镜像

docker部署springboot

DOCKER06_SpringBoot微服务项目打包成Docker镜像详解

DOCKER06_SpringBoot微服务项目打包成Docker镜像详解

springboot项目构建docker image镜像

springboot项目构建docker image镜像