📚目录
docker-compose.override.yml (开发环境)
1. Docker单独部署后端项目
1.1 环境准备
前置条件
- 已安装Docker
- Java 8/11/17开发环境
- Maven或Gradle构建工具
- Spring Boot项目
检查Docker是否安装成功
docker --version
docker-compose --version
1.2 Spring Boot项目准备
项目结构示例
my-spring-app/
├── src/
│ └── main/
│ ├── java/
│ └── resources/
│ └── application.yml
├── Dockerfile
├── pom.xml
└── target/
└── my-app-1.0.0.jar
application.yml配置
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://mysql-db:3306/mydb
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
management:
endpoints:
web:
exposure:
include: health,info
1.3 创建Dockerfile
基础版Dockerfile
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim
# 设置维护者信息
LABEL maintainer="your-email@example.com"
# 设置工作目录
WORKDIR /app
# 复制jar包到容器中
COPY target/my-app-1.0.0.jar app.jar
# 暴露端口
EXPOSE 8080
# 运行应用
ENTRYPOINT ["java", "-jar", "app.jar"]
优化版Dockerfile
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim
# 设置维护者信息
LABEL maintainer="your-email@example.com"
# 安装必要的工具
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
# 创建非root用户
RUN addgroup --system spring && adduser --system spring --ingroup spring
# 设置工作目录
WORKDIR /app
# 复制jar包到容器中
COPY target/my-app-1.0.0.jar app.jar
# 修改文件所有者
RUN chown spring:spring app.jar
# 切换到非root用户
USER spring
# 设置JVM参数
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD curl -f http://localhost:8080/actuator/health || exit 1
# 运行应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
1.4 构建Docker镜像
1. 打包Spring Boot应用
# 使用Maven打包
mvn clean package -DskipTests
# 或使用Gradle打包
./gradlew clean build
2. 构建Docker镜像
# 基本构建命令
docker build -t my-spring-app:latest .
# 带标签的构建
docker build -t my-spring-app:v1.0 .
# 查看构建的镜像
docker images
3. 镜像优化技巧
# 多阶段构建Dockerfile
FROM maven:3.8.4-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/my-app-1.0.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
1.5 运行Docker容器
基本运行命令
# 基本运行
docker run -d --name my-spring-container -p 8080:8080 my-spring-app:latest
# 带环境变量运行
docker run -d --name my-spring-container \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e JAVA_OPTS="-Xmx1g" \
my-spring-app:latest
容器管理命令
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs my-spring-container
# 实时查看日志
docker logs -f my-spring-container
# 进入容器
docker exec -it my-spring-container /bin/bash
# 停止容器
docker stop my-spring-container
# 删除容器
docker rm my-spring-container
1.6 数据持久化
挂载卷示例
# 挂载配置文件
docker run -d --name my-spring-container \
-p 8080:8080 \
-v /host/config:/app/config \
-v /host/logs:/app/logs \
my-spring-app:latest
2. Docker单独部署前端项目
2.1 前端项目准备
Vue.js项目结构示例
my-vue-app/
├── src/
├── public/
├── package.json
├── vue.config.js
├── Dockerfile
├── nginx.conf
└── dist/
Vue配置文件(vue.config.js)
module.exports = {
publicPath: '/',
outputDir: 'dist',
devServer: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
2.2 创建前端Dockerfile
多阶段构建Dockerfile
# 第一阶段:构建应用
FROM node:16-alpine AS builder
# 设置工作目录
WORKDIR /app
# 复制package文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源代码
COPY . .
# 构建应用
RUN npm run build
# 第二阶段:运行应用
FROM nginx:alpine
# 复制自定义nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
# 从构建阶段复制dist文件
COPY --from=builder /app/dist /usr/share/nginx/html
# 暴露端口
EXPOSE 80
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
2.3 Nginx配置文件
nginx.conf配置
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/x-javascript application/xml+rss
application/javascript application/json;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
# 处理Vue路由
location / {
try_files $uri $uri/ /index.html;
}
# API代理
location /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
}
2.4 构建和运行前端容器
构建镜像
# 构建前端镜像
docker build -t my-vue-app:latest .
# 查看镜像
docker images
运行容器
# 运行前端容器
docker run -d --name my-vue-container -p 80:80 my-vue-app:latest
# 测试访问
curl http://localhost
3. Docker Compose介绍
3.1 什么是Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务,然后使用单个命令创建并启动所有服务。
3.2 Docker Compose的优势
- 简化部署:一个命令启动整个应用栈
- 环境隔离