文章目录
- Docker全平台部署与前后端分离项目容器化方案
-
- 一、三大操作系统Docker部署方案
-
- [1.1 【 Linux系统 】Docker部署(生产环境核心方案)](#1.1 【 Linux系统 】Docker部署(生产环境核心方案))
-
- [1.1.1 前置条件](#1.1.1 前置条件)
- [1.1.2 主流发行版官方安装步骤](#1.1.2 主流发行版官方安装步骤)
-
- [(1)Ubuntu/Debian 系列(apt包管理器)](#(1)Ubuntu/Debian 系列(apt包管理器))
- [(2)CentOS/RHEL 系列(yum/dnf包管理器)](#(2)CentOS/RHEL 系列(yum/dnf包管理器))
- [(3)Fedora 系列](#(3)Fedora 系列)
- [1.1.3 安装后必备配置(生产环境必做)](#1.1.3 安装后必备配置(生产环境必做))
- [1.1.4 安装验证](#1.1.4 安装验证)
- [1.2 【 Windows系统 】Docker部署(开发环境专属)](#1.2 【 Windows系统 】Docker部署(开发环境专属))
-
- [1.2.1 前置条件](#1.2.1 前置条件)
- [1.2.2 方案一:Docker Desktop(推荐,开发环境首选)](#1.2.2 方案一:Docker Desktop(推荐,开发环境首选))
- [1.2.3 方案二:WSL2内直接安装Docker Engine](#1.2.3 方案二:WSL2内直接安装Docker Engine)
- [1.2.4 安装验证](#1.2.4 安装验证)
- [1.3 【 MacOS系统 】Docker部署(开发环境专属)](#1.3 【 MacOS系统 】Docker部署(开发环境专属))
-
- [1.3.1 前置条件](#1.3.1 前置条件)
- [1.3.2 安装步骤](#1.3.2 安装步骤)
- [1.3.3 安装验证](#1.3.3 安装验证)
- 二、Docker部署前后端分离项目全流程
-
- [2.1 核心架构与前置准备](#2.1 核心架构与前置准备)
-
- [2.1.1 标准部署架构](#2.1.1 标准部署架构)
- [2.1.2 前置准备](#2.1.2 前置准备)
- [2.2 【 前端项目 】Docker化(Vue/React通用方案)](#2.2 【 前端项目 】Docker化(Vue/React通用方案))
-
- [2.2.1 项目预处理](#2.2.1 项目预处理)
- [2.2.2 核心文件编写](#2.2.2 核心文件编写)
- [2.2.3 本地镜像构建与测试](#2.2.3 本地镜像构建与测试)
- [2.3 【 后端项目 】Docker化(主流技术栈通用模板)](#2.3 【 后端项目 】Docker化(主流技术栈通用模板))
-
- [2.3.1 项目预处理](#2.3.1 项目预处理)
- [2.3.2 主流技术栈Dockerfile模板](#2.3.2 主流技术栈Dockerfile模板)
-
- [(1)Java Spring Boot 项目(多阶段构建)](#(1)Java Spring Boot 项目(多阶段构建))
- [(2)Node.js Express/Koa 项目](#(2)Node.js Express/Koa 项目)
- [(3)Python FastAPI/Flask 项目](#(3)Python FastAPI/Flask 项目)
- [2.3.3 本地镜像构建与测试](#2.3.3 本地镜像构建与测试)
- [2.4 【 多容器一体化 】编排部署(Docker Compose)](#2.4 【 多容器一体化 】编排部署(Docker Compose))
-
- [2.4.1 目录结构规范](#2.4.1 目录结构规范)
- [2.4.2 docker-compose.yml 完整通用模板](#2.4.2 docker-compose.yml 完整通用模板)
- [2.4.3 环境变量配置文件(.env)](#2.4.3 环境变量配置文件(.env))
- [2.4.4 核心编排命令](#2.4.4 核心编排命令)
- [2.5 生产环境部署进阶与最佳实践](#2.5 生产环境部署进阶与最佳实践)
-
- [2.5.1 配置与安全隔离](#2.5.1 配置与安全隔离)
- [2.5.2 数据持久化与备份](#2.5.2 数据持久化与备份)
- [2.5.3 HTTPS与域名配置](#2.5.3 HTTPS与域名配置)
- [2.5.4 可观测性与运维](#2.5.4 可观测性与运维)
- [2.5.5 镜像优化](#2.5.5 镜像优化)
Docker全平台部署与前后端分离项目容器化方案
本文将结构化、全维度覆盖Linux / Windows / MacOS 三大系统的Docker部署方案 ,同时完整讲解基于Docker的前后端分离项目从容器化到生产级部署的全流程,兼顾开发环境易用性与生产环境稳定性。
一、三大操作系统Docker部署方案
Docker分为两大发行形态:
- Docker Engine(CLI核心引擎,无GUI,Linux服务器生产环境首选)
- Docker Desktop(带GUI桌面端,内置Engine/Compose,Windows/MacOS开发环境首选,同时支持Linux桌面版)。
1.1 【 Linux系统 】Docker部署(生产环境核心方案)
Linux是Docker原生支持的系统,也是生产环境唯一推荐的运行环境,以下为官方标准安装步骤,覆盖主流发行版。
1.1.1 前置条件
- 64位操作系统,内核版本≥3.10(主流发行版均默认满足)
- 已开启cgroup/namespace内核功能(系统默认开启)
- 具备管理员(sudo)权限,网络可访问软件源
1.1.2 主流发行版官方安装步骤
(1)Ubuntu/Debian 系列(apt包管理器)
bash
# 1. 卸载系统自带的旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc -y
# 2. 更新apt索引,安装依赖工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release -y
# 3. 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4. 配置Docker官方稳定版软件源(Debian将ubuntu替换为debian即可)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装Docker核心组件(含Compose插件)
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 6. 启动Docker服务
sudo systemctl start docker
(2)CentOS/RHEL 系列(yum/dnf包管理器)
bash
# 1. 卸载旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine -y
# 2. 安装依赖工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 配置Docker官方软件源(RHEL将centos替换为rhel即可)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装Docker核心组件
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 5. 启动Docker服务
sudo systemctl start docker
(3)Fedora 系列
将上述yum命令替换为dnf,其余步骤与CentOS完全一致。
1.1.3 安装后必备配置(生产环境必做)
bash
# 1. 配置开机自启
sudo systemctl enable docker
sudo systemctl enable containerd
# 2. 非root用户免sudo执行docker(执行后重新登录终端生效)
sudo usermod -aG docker $USER
newgrp docker # 临时生效,无需重启
# 3. 配置国内镜像加速+日志限制(解决镜像拉取慢、日志占满磁盘问题)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 4. 重启Docker使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 5. 开启IPv4转发(解决容器网络通信异常)
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
1.1.4 安装验证
bash
# 查看版本信息
docker --version
docker compose version
# 运行测试容器,正常输出hello-world信息即安装成功
docker run --rm hello-world
1.2 【 Windows系统 】Docker部署(开发环境专属)
Windows系统仅推荐用于开发环境,生产环境不建议使用。提供两种部署方案,Docker Desktop为首选,性能与兼容性最优。
1.2.1 前置条件
- 系统版本:Windows 10 2004及以上 / Windows 11 全版本
- 已在BIOS开启CPU虚拟化(Intel VT-x/AMD-V)
- 具备管理员权限
1.2.2 方案一:Docker Desktop(推荐,开发环境首选)
-
开启WSL2与虚拟机平台
以管理员身份打开PowerShell,执行以下命令,执行完成后重启电脑:
powershell# 开启WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 开启虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart -
升级WSL2内核并设置默认版本
-
下载并安装WSL2 Linux内核更新包:官方下载地址
-
管理员PowerShell执行命令,设置WSL2为默认版本:
powershellwsl --set-default-version 2
-
-
安装Docker Desktop
- 从Docker官网下载Windows安装包:Docker Desktop
- 双击安装,全程默认勾选
Use WSL 2 instead of Hyper-V,安装完成后重启电脑。
-
基础配置
- 打开Docker Desktop,等待服务启动完成(状态栏Docker图标变为运行状态)
- 镜像加速:打开
Settings -> Docker Engine,在json配置中添加上述Linux同款registry-mirrors加速地址,点击Apply & Restart生效 - WSL集成:打开
Settings -> Resources -> WSL Integration,开启你使用的WSL发行版(如Ubuntu)的集成,即可在WSL终端直接使用docker命令
1.2.3 方案二:WSL2内直接安装Docker Engine
若无需GUI界面,仅需CLI命令行,可直接在WSL2的Linux发行版中,按照上述1.1节Linux系统的Docker Engine安装步骤操作,与原生Linux安装完全一致。
1.2.4 安装验证
打开Windows CMD/PowerShell或WSL终端,执行:
bash
docker --version
docker run --rm hello-world
正常输出hello-world信息即安装成功。
1.3 【 MacOS系统 】Docker部署(开发环境专属)
MacOS仅支持Docker Desktop安装方式,原生适配Intel芯片与Apple Silicon(M1/M2/M3)芯片。
1.3.1 前置条件
- Intel芯片:MacOS 11.0 (Big Sur)及以上版本
- Apple Silicon芯片:MacOS 11.0及以上版本,建议安装Rosetta 2(兼容x86架构镜像),执行命令:
softwareupdate --install-rosetta - 具备管理员权限
1.3.2 安装步骤
-
下载安装包
从Docker官网下载对应芯片版本的安装包:Docker Desktop for Mac
- Intel芯片选择
Mac with Intel Chip - Apple Silicon选择
Mac with Apple Chip
- Intel芯片选择
-
安装与启动
- 双击下载的.dmg文件,将Docker图标拖拽到Applications文件夹中完成安装
- 从应用程序中打开Docker,首次启动会请求系统权限,授权后等待服务启动完成(菜单栏出现Docker运行图标)
-
基础配置
- 镜像加速:打开
Docker Desktop -> Settings -> Docker Engine,添加上述Linux同款registry-mirrors加速地址,点击Apply & Restart生效 - 资源配置:打开
Settings -> Resources,可调整分配给Docker的CPU、内存、磁盘空间,根据Mac硬件配置调整
- 镜像加速:打开
1.3.3 安装验证
打开Mac终端,执行:
bash
docker --version
docker compose version
docker run --rm hello-world
正常输出hello-world信息即安装成功。
二、Docker部署前后端分离项目全流程
前后端分离项目的核心架构:
- 前端静态资源通过Nginx容器托管,同时Nginx作为反向代理转发API请求到后端容器;
- 后端服务提供接口,连接数据库/缓存等中间件;
- 所有服务通过Docker Compose统一编排,实现环境一致性与一键部署。
2.1 核心架构与前置准备
2.1.1 标准部署架构
| 容器角色 | 核心功能 | 网络暴露策略 |
|---|---|---|
| 前端容器 | Nginx托管前端打包产物、反向代理API、解决跨域 | 对外暴露80/443端口(唯一对外入口) |
| 后端容器 | 运行后端服务、提供RESTful接口、处理业务逻辑 | 仅容器内部网络访问,不对外暴露 |
| 数据库容器 | 持久化存储业务数据(MySQL/PostgreSQL) | 仅容器内部网络访问,生产环境不对外暴露 |
| 缓存容器 | 提供缓存能力(Redis) | 仅容器内部网络访问,生产环境不对外暴露 |
核心优势:所有容器加入同一自定义Docker网络,通过服务名直接通信,无需固定IP,Docker内置DNS自动解析;仅前端端口对外暴露,极大提升安全性。
2.1.2 前置准备
- 环境:所有部署节点已完成Docker+Docker Compose安装
- 项目规范:
- 前端:完成开发,可通过build命令正常生成dist打包目录
- 后端:完成开发,可正常打包生成可执行产物(jar包/源码等)
- 配置解耦:所有环境相关配置(数据库地址、端口、密钥)均通过环境变量注入,禁止硬编码在代码中
- 端口规划:提前规划各服务端口,避免宿主机端口冲突
2.2 【 前端项目 】Docker化(Vue/React通用方案)
前端项目核心是通过多阶段构建分离打包与运行环境,最终仅保留Nginx与静态产物,镜像体积极小,性能最优。
2.2.1 项目预处理
- 调整API请求地址:将后端API的baseURL改为相对路径(如
/api),后续通过Nginx反向代理转发到后端容器 - 本地打包验证:执行
npm run build,确保正常生成dist目录,无打包报错
2.2.2 核心文件编写
在前端项目根目录创建以下2个核心文件:
(1)Dockerfile(多阶段构建模板)
dockerfile
# 第一阶段:构建前端产物(Node环境)
FROM node:18-alpine AS builder
# 设置工作目录
WORKDIR /app
# 先复制依赖文件,利用Docker缓存,避免每次构建都重新安装依赖
COPY package*.json ./
# 安装依赖(使用国内镜像源加速)
RUN npm install --registry=https://registry.npmmirror.com
# 复制所有项目源码
COPY . .
# 执行打包命令,生成dist目录
RUN npm run build
# 第二阶段:运行环境(Nginx轻量镜像,仅保留打包产物)
FROM nginx:alpine
# 复制打包产物到Nginx静态资源目录
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制自定义Nginx配置,覆盖默认配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露80端口
EXPOSE 80
# 前台启动Nginx,保证容器不退出
CMD ["nginx", "-g", "daemon off;"]
(2)nginx.conf(核心配置)
实现静态资源托管、前端路由兼容、API反向代理三大核心能力:
nginx
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
# 解决Vue/React history路由模式刷新404问题
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端API:将/api请求转发到后端容器
# 此处backend为后端服务的服务名,Docker网络内可直接通过服务名访问
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 7d;
add_header Cache-Control "public, max-age=604800";
}
}
2.2.3 本地镜像构建与测试
bash
# 1. 构建前端镜像
docker build -t frontend-app:v1 .
# 2. 本地测试运行
docker run -d -p 80:80 --name frontend-test frontend-app:v1
# 3. 访问http://localhost,正常打开前端页面即构建成功
2.3 【 后端项目 】Docker化(主流技术栈通用模板)
后端项目核心是保证配置可通过环境变量注入,镜像可移植,以下提供3种主流后端技术栈的通用Dockerfile模板。
2.3.1 项目预处理
- 配置解耦:所有环境配置(数据库连接、Redis地址、端口等)均支持通过环境变量读取,例如Spring Boot的
${DB_HOST:localhost}、Node.js的process.env.DB_HOST - 本地打包验证:确保打包后的产物可正常运行,接口可正常访问
2.3.2 主流技术栈Dockerfile模板
(1)Java Spring Boot 项目(多阶段构建)
dockerfile
# 第一阶段:构建jar包(Maven环境)
FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
# 复制pom.xml,利用Docker缓存依赖
COPY pom.xml .
RUN mvn dependency:go-offline -B
# 复制源码并打包
COPY src ./src
RUN mvn package -DskipTests
# 第二阶段:运行环境(精简JRE镜像)
FROM openjdk:17-jdk-slim
WORKDIR /app
# 复制构建好的jar包
COPY --from=builder /app/target/*.jar app.jar
# 暴露后端服务端口
EXPOSE 8080
# 启动命令,支持JVM参数注入
ENTRYPOINT ["java", "-jar", "app.jar"]
(2)Node.js Express/Koa 项目
dockerfile
FROM node:18-alpine
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
# 安装依赖
RUN npm install --registry=https://registry.npmmirror.com
# 复制项目源码
COPY . .
# 暴露服务端口
EXPOSE 3000
# 启动命令
CMD ["node", "app.js"]
(3)Python FastAPI/Flask 项目
dockerfile
FROM python:3.11-slim
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制项目源码
COPY . .
# 暴露服务端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
2.3.3 本地镜像构建与测试
bash
# 1. 构建后端镜像
docker build -t backend-app:v1 .
# 2. 本地测试运行(需提前准备好数据库等依赖)
docker run -d -p 8080:8080 --name backend-test backend-app:v1
# 3. 访问http://localhost:8080/api/health,接口正常返回即构建成功
2.4 【 多容器一体化 】编排部署(Docker Compose)
Docker Compose是前后端分离项目部署的核心工具,可一键管理前端、后端、数据库、缓存等所有服务,实现**「一次编写、随处运行」**,避免手动逐个启动容器的繁琐操作。
2.4.1 目录结构规范
建议采用以下统一目录结构,便于管理:
project-root/
├── frontend/ # 前端项目目录(含Dockerfile、nginx.conf)
├── backend/ # 后端项目目录(含Dockerfile)
├── sql/ # 可选:数据库初始化SQL脚本
├── .env # 环境变量配置文件(生产环境必用,隔离敏感配置)
└── docker-compose.yml # 核心编排文件
2.4.2 docker-compose.yml 完整通用模板
以下模板包含前端、后端、MySQL、Redis四大核心服务,覆盖生产环境必备的网络、数据持久化、重启策略、环境变量注入等能力:
yaml
version: '3.8'
# 1. 自定义网桥网络:所有服务加入该网络,实现容器间互通
networks:
app-network:
driver: bridge
# 2. 数据卷:实现数据持久化,避免容器删除后数据丢失
volumes:
mysql-data: # MySQL数据卷
redis-data: # Redis数据卷
# 3. 服务定义
services:
# 前端服务
frontend:
build: ./frontend # 前端Dockerfile所在目录
image: frontend-app:v1
ports:
- "80:80" # 宿主机80端口映射到容器80端口(生产环境可改为443)
depends_on:
- backend # 先启动后端,再启动前端
networks:
- app-network
restart: unless-stopped # 异常自动重启,手动停止才会终止
# 后端服务
backend:
build: ./backend # 后端Dockerfile所在目录
image: backend-app:v1
# 生产环境注释掉端口映射,仅内部网络访问,提升安全性
# ports:
# - "8080:8080"
# 环境变量注入:所有配置通过环境变量管理,无需修改代码
environment:
# 数据库配置:host直接写服务名mysql,Docker网络自动解析
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/app_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=${MYSQL_ROOT_USER:-root}
- SPRING_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}
# Redis配置
- SPRING_REDIS_HOST=redis
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_PASSWORD=${REDIS_PASSWORD}
depends_on:
- mysql
- redis
networks:
- app-network
restart: unless-stopped
# 生产环境可选:资源限制,避免单容器占用所有服务器资源
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
# MySQL数据库服务
mysql:
image: mysql:8.0 # 固定版本,禁止使用latest标签
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=app_db # 容器首次启动自动创建该数据库
# 生产环境注释掉端口映射,仅内部网络访问
ports:
- "3306:3306"
# 数据持久化:将容器内数据目录挂载到宿主机数据卷
volumes:
- mysql-data:/var/lib/mysql
# 可选:挂载初始化SQL脚本,容器首次启动自动执行
# - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app-network
restart: unless-stopped
# 字符集与认证插件配置
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# Redis缓存服务
redis:
image: redis:7-alpine # 轻量镜像
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
# 生产环境注释掉端口映射,仅内部网络访问
ports:
- "6379:6379"
# 数据持久化
volumes:
- redis-data:/data
networks:
- app-network
restart: unless-stopped
# 开启密码认证与AOF持久化
command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
2.4.3 环境变量配置文件(.env)
在docker-compose.yml同目录创建.env文件,管理所有敏感配置,docker-compose会自动读取该文件,避免敏感信息硬编码在yml文件中:
env
# 数据库配置
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=Root@123456
# Redis配置
REDIS_PASSWORD=Redis@123456
2.4.4 核心编排命令
在docker-compose.yml所在目录执行以下命令,实现全生命周期管理:
bash
# 1. 一键构建镜像并后台启动所有服务(更新代码后必须加--build)
docker compose up -d --build
# 2. 查看所有服务运行状态
docker compose ps
# 3. 实时查看服务日志(排查问题必备)
docker compose logs -f # 查看所有服务日志
docker compose logs -f backend # 仅查看后端服务日志
# 4. 停止所有服务(不删除容器)
docker compose stop
# 5. 停止并删除所有容器、网络(保留数据卷,数据不丢失)
docker compose down
# 6. 慎用!停止并删除所有容器、网络、数据卷(会清空所有数据库数据)
docker compose down -v
2.5 生产环境部署进阶与最佳实践
2.5.1 配置与安全隔离
- 所有敏感配置(密码、密钥、Token)必须通过.env文件或环境变量注入,禁止打包到镜像中
- 不同环境(开发/测试/生产)使用不同的.env文件,实现配置与镜像解耦
- 容器禁止以root用户运行,在Dockerfile中创建普通用户,使用普通用户启动服务
- 生产环境仅暴露前端80/443端口,后端、数据库、Redis等服务一律不映射端口到宿主机
2.5.2 数据持久化与备份
- 所有有状态服务(MySQL、Redis等)必须使用Docker数据卷挂载数据目录,严禁将数据存储在容器内可写层
- 定期对数据卷进行备份,避免数据丢失
- 数据库容器禁止直接修改配置,所有配置通过command或配置文件挂载实现
2.5.3 HTTPS与域名配置
- 生产环境必须配置HTTPS,使用Certbot自动申请并续期Let's Encrypt免费SSL证书
- 在Nginx中配置SSL证书,将80端口请求重定向到443端口
- 配置域名解析,将域名指向服务器IP,通过Nginx的server_name匹配域名,支持多站点部署
2.5.4 可观测性与运维
-
配置Docker日志驱动,限制单容器日志大小与数量,避免日志占满磁盘
-
生产环境建议使用ELK/Loki+Promtail搭建日志收集系统,实现多容器日志统一管理与检索
-
为核心服务配置健康检查,确保服务正常就绪后才启动依赖服务,示例:
yamlservices: backend: image: backend-app:v1 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s
2.5.5 镜像优化
- 所有镜像必须使用多阶段构建,减小镜像体积,减少攻击面
- 基础镜像优先选择alpine/slim精简版本,避免使用臃肿的全量镜像
- 禁止使用latest标签,所有镜像必须指定固定版本号,避免版本更新导致兼容性问题
- 构建镜像前通过
.dockerignore文件排除无用文件(node_modules、.git、本地日志等),减小镜像体积与构建时间