Appearance
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: