docker-常用应用部署dockerfile模板
文章目录
- 概述
- Springboot
- -Djava.security.egd=file:/dev/./urandom参数说明
- vue应用部署
- nginx.conf配置
- Dockerfile
概述
本文列举了Java开发中常用如SpringBoot、Vue前端等类型的应用Docker部署所需的DockerFile
Springboot
FROM anapsix/alpine-java:8_server-jre_unlimited
# 下面是JDK17镜像
# FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
MAINTAINER xxx作者
#定义参数(build构建时使用)
ARG VERSION
ARG SERVICE_NAME
ARG SERVICE_PORT
# 系统编码
#设置环境变量(程序运行时使用)
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
ENV PARAMS="--spring.profiles.active=prod"
ENV VERSION=$VERSION
ENV SERVICE_NAME=$SERVICE_NAME
ENV SERVICE_PORT=$SERVICE_PORT
#工作目录
WORKDIR /usr/local/
# 声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME ["/usr/local/logs"]
# 应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD ./target/${SERVICE_NAME}-${VERSION}.jar app.jar
# 声明运行时端口
EXPOSE ${SERVICE_PORT}
# 健康检查参数设置,每5秒检查一次,接口超时时间2秒,连续10次返回1就判定该容器不健康
HEALTHCHECK --interval=5s \
--timeout=3s \
--retries=10 \
CMD curl -fs http://localhost:${SERVICE_PORT}/actuator/health || exit 1
# 启动容器时的进程
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar $PARAMS"]
构建命令
docker build --build-arg VERSION=1.0.0 SERVICE_NAME=MyApp SERVICE_PORT=8080 -t my-springboot-app .
启动命令
docker run -d -p 8080:8080 --name my-springboot-container my-springboot-app
-Djava.security.egd=file:/dev/./urandom参数说明
在 Docker 容器中运行 Java 应用时,你可能会遇到由于熵池不足导致的 SSL/TLS 握手延迟问题。这是因为 Java 默认使用 /dev/random
作为其安全随机数生成器(SecureRandom)的来源,而 /dev/random
在熵池耗尽时会阻塞等待更多的熵输入,这在某些情况下(特别是容器化环境中)可能导致显著的性能瓶颈。为了缓解这个问题,可以通过设置 JVM 参数 security.egd
来指定使用 /dev/urandom
作为熵源。/dev/urandom
不会因为熵池不足而阻塞,因此可以提高应用启动速度和响应时间
vue应用部署
nginx.conf配置
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Dockerfile
# 第一阶段:构建Vue应用
FROM node:18-alpine AS build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 第二阶段:使用Nginx服务静态文件
FROM nginx:alpine AS production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建命令
docker build -t my-vue-app .
启动命令
docker run -d -p 80:80 --name my-vue-container my-vue-app