docker部署学习笔记

7 阅读3分钟

大学生学习记录,非干货知识

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 镜像层的缓存,确保每一层都是全新构建的