大学生学习记录,非干货知识
DockerFile
# AS builder - 这只是给构建阶段命名
FROM maven:3.8.5-openjdk-17 AS builder
# ↑
# 这不是容器名,是构建阶段名
# --from=builder - 这是从构建阶段复制
COPY --from=builder /app/target/*.jar app.jar
# ↑
# 引用构建阶段,不是容器名
Docker镜像层的缓存机制
Docker的分层缓存特性 Dockerfile中每一条指令都会生成一个独立的镜像层,且 Docker 会缓存每一层的结果
- 如果某一层的【输入内容】没有变化(比如复制的文件,执行的命令),Docker会直接复用之前缓存的层,跳过重新构建
- 一旦某一层的输入变了,该层及之后所有层都会重新执行,无法复用缓存。
例子:
❶ 不好的写法:直接 COPY . . 再装依赖
FROM node:18-alpine
WORKDIR /app
# 一步复制所有文件(代码+依赖配置)
COPY . .
# 每次代码改动,这一步都会重新执行(哪怕依赖没改)
RUN npm install
CMD ["npm", "start"]
问题:哪怕你只改了一行业务代码,COPY . . 这一层的输入就变了,后面的 npm install 会重新下载所有依赖(哪怕依赖完全没变化),而 npm install 通常是构建中最耗时的步骤之一。
❷ 推荐的写法:先复制依赖配置,再装依赖,最后复制代码
FROM node:18-alpine
WORKDIR /app
# 第一步:只复制依赖配置文件(改动极少)
COPY package*.json ./
# 第二步:安装依赖(这一层会被缓存,除非 package*.json 改动)
RUN npm install
# 第三步:复制所有源代码(频繁改动,但只影响这一层)
COPY . .
CMD ["npm", "start"]
优势:
- 只要
package*.json没改,npm install这一层就会复用缓存,哪怕你改了 100 行业务代码,构建时也只会重新执行最后一步COPY . .,几毫秒就能完成; - 只有当你新增 / 删除依赖(改了
package*.json),才会重新执行npm install,完全符合实际开发的改动规律。
Docker-compose.yml
build: ./biji构建后端镜像的「上下文目录」:当前目录下的 biji 文件夹(里面必须有 Dockerfile)
ports: "8081:80"宿主机 8081 端口 ↔ 容器 80 端口(nginx 默认端口)
depends_on: - backend启动顺序:先启动 backend,再启动 frontend(仅保证顺序,不保证 backend 完全就绪)
networks: blog-network定义自定义桥接网络(替代默认网络,隔离性更好)
部署脚本 deploy.sh
#!/bin/bash
echo "========================================="
echo " 个人博客系统 - Docker部署脚本"
echo "========================================="
# 停止并删除旧容器
echo "1. 停止旧容器..."
docker-compose down
# 删除旧镜像(可选)
echo "2. 清理旧镜像..."
docker rmi blog-backend blog-frontend 2>/dev/null || true
# 构建新镜像
echo "3. 构建Docker镜像..."
docker-compose build --no-cache
# 启动容器
echo "4. 启动容器..."
docker-compose up -d
# 查看容器状态
echo "5. 查看容器状态..."
docker-compose ps
echo ""
echo "========================================="
echo " 部署完成!"
echo " 前端访问: http://你的服务器IP"
echo " 后端API: http://你的服务器IP:8080/api"
echo "========================================="
echo ""
echo "查看日志命令:"
echo " docker-compose logs -f backend"
echo " docker-compose logs -f frontend"
docker-compose build --no-cache 是 Docker Compose 的镜像构建命令,核心作用是:强制重新构建 docker-compose.yml 中定义的所有(或指定)服务镜像,完全不使用 Docker 镜像层的缓存,确保每一层都是全新构建的。