Skip to content

Docker案例汇总

1. 部署静态网站

场景:前端团队完成静态构建后,需要将打包结果放到轻量级服务器,

dockerfile
FROM nginx:alpine

# 复制网站文件到默认目录
COPY ./dist/ /usr/share/nginx/html/

# 暴露 HTTP 端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

2. 前端资源预构建与生产部署

场景:在 Docker 中完成前端项目构建,并在生产环境中仅保留构建产物。

dockerfile
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3.Spring Boot 服务上线

场景:使用 Maven 打包 Spring Boot 应用后,部署标准化 JAR 至生产容器。

dockerfile
# 构建阶段:使用带 Maven 的 JDK 镜像进行编译
FROM maven:3.9-jdk-17 AS builder  

# 设置工作目录为 /app
WORKDIR /app  

# 复制项目描述文件到工作目录,用于下载依赖
COPY pom.xml .  

# 复制源码目录到容器内
COPY src ./src  

# 执行 Maven 打包,跳过单元测试
RUN mvn clean package -DskipTests  

---

# 运行阶段:使用轻量级 JRE 镜像运行应用
FROM eclipse-temurin:17-jre  

# 设置工作目录为 /app
WORKDIR /app  

# 从 builder 阶段复制打包好的 JAR(target 目录下)到当前目录,并命名为 app.jar
COPY --from=builder /app/target/*.jar app.jar  

# 暴露应用监听端口
EXPOSE 8080  

# 容器启动时执行的命令:运行 JAR 包
ENTRYPOINT ["java","-jar","app.jar"]

4. Java 应用容器化

场景:将一个打包好的 Java 可执行 JAR(例如 app.jar)快速容器化,用于简单服务或脚本运行。

dockerfile
# 选择官方 OpenJDK 运行时镜像
FROM openjdk:11-jre-slim

# 设置工作目录
WORKDIR /app

# 将本地打包好的 JAR 拷贝到镜像中
COPY app.jar .

# 暴露应用监听端口(可根据实际情况调整或省略)
EXPOSE 8080

# 指定容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

5.Docker 实现 MySQL 一主两从 主从同步

主 my.cnf

properties
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db

从 my.cnf

properties
[mysqld]
server-id=2
#从3 server-id=3
relay-log=relay-log
log-bin=mysql-bin
read_only=1

Docker-compose

properties
services:
  master:
    image: mysql:8.0  # 使用官方 MySQL 8.0 镜像作为主库
    container_name: mysql-master  # 容器名称为 mysql-master
    restart: always  # 容器异常退出会自动重启
    environment:
      MYSQL_ROOT_PASSWORD: root123  # 设置 root 用户的密码
    ports:
      - "3307:3306"  # 映射主机的 3307 端口到容器的 3306 端口
    volumes:
      - ./master/my.cnf:/etc/mysql/my.cnf  # 使用自定义的配置文件
      - master-data:/var/lib/mysql  # 持久化主库的数据

  slave1:
    image: mysql:8.0  # 同样使用 MySQL 8.0 镜像
    container_name: mysql-slave1  # 第一个从库容器名
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123  # root 密码要和主库一致,方便管理
    ports:
      - "3308:3306"  # 映射为不同端口,避免冲突
    volumes:
      - ./slave1/my.cnf:/etc/mysql/my.cnf  # 使用对应从库的配置
      - slave1-data:/var/lib/mysql  # 持久化从库的数据

  slave2:
    image: mysql:8.0
    container_name: mysql-slave2  # 第二个从库
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123
    ports:
      - "3309:3306"
    volumes:
      - ./slave2/my.cnf:/etc/mysql/my.cnf
      - slave2-data:/var/lib/mysql

# 定义持久化数据卷
volumes:
  master-data:
  slave1-data:
  slave2-data:

感谢阅读,欢迎交流!