【Docker】 Docker 全平台部署(Linux / Windows / MacOS)与 前后端分离项目 容器化方案

文章目录

  • 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.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(推荐,开发环境首选)
  1. 开启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
  2. 升级WSL2内核并设置默认版本

    • 下载并安装WSL2 Linux内核更新包:官方下载地址

    • 管理员PowerShell执行命令,设置WSL2为默认版本:

      powershell 复制代码
      wsl --set-default-version 2
  3. 安装Docker Desktop

    • 从Docker官网下载Windows安装包:Docker Desktop
    • 双击安装,全程默认勾选Use WSL 2 instead of Hyper-V,安装完成后重启电脑。
  4. 基础配置

    • 打开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 安装步骤
  1. 下载安装包

    从Docker官网下载对应芯片版本的安装包:Docker Desktop for Mac

    • Intel芯片选择Mac with Intel Chip
    • Apple Silicon选择Mac with Apple Chip
  2. 安装与启动

    • 双击下载的.dmg文件,将Docker图标拖拽到Applications文件夹中完成安装
    • 从应用程序中打开Docker,首次启动会请求系统权限,授权后等待服务启动完成(菜单栏出现Docker运行图标)
  3. 基础配置

    • 镜像加速:打开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 前置准备
  1. 环境:所有部署节点已完成Docker+Docker Compose安装
  2. 项目规范:
    • 前端:完成开发,可通过build命令正常生成dist打包目录
    • 后端:完成开发,可正常打包生成可执行产物(jar包/源码等)
    • 配置解耦:所有环境相关配置(数据库地址、端口、密钥)均通过环境变量注入,禁止硬编码在代码中
  3. 端口规划:提前规划各服务端口,避免宿主机端口冲突

2.2 【 前端项目 】Docker化(Vue/React通用方案)

前端项目核心是通过多阶段构建分离打包与运行环境,最终仅保留Nginx与静态产物,镜像体积极小,性能最优。

2.2.1 项目预处理
  1. 调整API请求地址:将后端API的baseURL改为相对路径(如/api),后续通过Nginx反向代理转发到后端容器
  2. 本地打包验证:执行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 项目预处理
  1. 配置解耦:所有环境配置(数据库连接、Redis地址、端口等)均支持通过环境变量读取,例如Spring Boot的${DB_HOST:localhost}、Node.js的process.env.DB_HOST
  2. 本地打包验证:确保打包后的产物可正常运行,接口可正常访问
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搭建日志收集系统,实现多容器日志统一管理与检索

  • 为核心服务配置健康检查,确保服务正常就绪后才启动依赖服务,示例:

    yaml 复制代码
    services:
      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、本地日志等),减小镜像体积与构建时间
相关推荐
真心喜欢你吖2 小时前
CentOS 安装部署OpenClaw实战教程(SELinux+防火墙配置)
linux·运维·centos·大模型·智能体·openclaw·小龙虾
ShineWinsu2 小时前
对于Linux:进程地址空间(虚拟地址空间)的解析
linux·服务器·面试·笔试·内存·进程·虚拟空间
wuhui21002 小时前
Kali Linux 输入法问题排查与解决记录
linux·运维·服务器
L1624762 小时前
FreeFileSync使用教程(windows与windows,windows与linux)
linux·运维·服务器
java1234_小锋2 小时前
Java高频面试题:ElasticSearch如何做性能优化?
java·开发语言·elasticsearch·面试
软件测试很重要2 小时前
Linux VNC 入门手册
linux·运维·服务器
摸鱼仙人~2 小时前
简约而不简单:深度解析 Linux 哲学核心
linux·运维·服务器
武藤一雄2 小时前
深入拆解.NET内存管理:从GC机制到高性能内存优化
windows·microsoft·c#·.net·wpf·.netcore·内存管理
风静如云2 小时前
VirtualBox:Win11下开启VT-x
windows