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

张开发
2026/5/16 23:04:18 15 分钟阅读
【Docker】 Docker 全平台部署(Linux / Windows / MacOS)与 前后端分离项目 容器化方案
文章目录Docker全平台部署与前后端分离项目容器化方案一、三大操作系统Docker部署方案1.1 【 Linux系统 】Docker部署生产环境核心方案1.1.1 前置条件1.1.2 主流发行版官方安装步骤1Ubuntu/Debian 系列apt包管理器2CentOS/RHEL 系列yum/dnf包管理器3Fedora 系列1.1.3 安装后必备配置生产环境必做1.1.4 安装验证1.2 【 Windows系统 】Docker部署开发环境专属1.2.1 前置条件1.2.2 方案一Docker Desktop推荐开发环境首选1.2.3 方案二WSL2内直接安装Docker Engine1.2.4 安装验证1.3 【 MacOS系统 】Docker部署开发环境专属1.3.1 前置条件1.3.2 安装步骤1.3.3 安装验证二、Docker部署前后端分离项目全流程2.1 核心架构与前置准备2.1.1 标准部署架构2.1.2 前置准备2.2 【 前端项目 】Docker化Vue/React通用方案2.2.1 项目预处理2.2.2 核心文件编写1Dockerfile多阶段构建模板2nginx.conf核心配置2.2.3 本地镜像构建与测试2.3 【 后端项目 】Docker化主流技术栈通用模板2.3.1 项目预处理2.3.2 主流技术栈Dockerfile模板1Java Spring Boot 项目多阶段构建2Node.js Express/Koa 项目3Python FastAPI/Flask 项目2.3.3 本地镜像构建与测试2.4 【 多容器一体化 】编排部署Docker Compose2.4.1 目录结构规范2.4.2 docker-compose.yml 完整通用模板2.4.3 环境变量配置文件.env2.4.4 核心编排命令2.5 生产环境部署进阶与最佳实践2.5.1 配置与安全隔离2.5.2 数据持久化与备份2.5.3 HTTPS与域名配置2.5.4 可观测性与运维2.5.5 镜像优化Docker全平台部署与前后端分离项目容器化方案本文将结构化、全维度覆盖Linux / Windows / MacOS三大系统的Docker部署方案同时完整讲解基于Docker的前后端分离项目从容器化到生产级部署的全流程兼顾开发环境易用性与生产环境稳定性。一、三大操作系统Docker部署方案Docker分为两大发行形态Docker EngineCLI核心引擎无GUILinux服务器生产环境首选Docker Desktop带GUI桌面端内置Engine/ComposeWindows/MacOS开发环境首选同时支持Linux桌面版。1.1 【 Linux系统 】Docker部署生产环境核心方案Linux是Docker原生支持的系统也是生产环境唯一推荐的运行环境以下为官方标准安装步骤覆盖主流发行版。1.1.1 前置条件64位操作系统内核版本≥3.10主流发行版均默认满足已开启cgroup/namespace内核功能系统默认开启具备管理员sudo权限网络可访问软件源1.1.2 主流发行版官方安装步骤1Ubuntu/Debian 系列apt包管理器# 1. 卸载系统自带的旧版本如有sudoapt-getremovedockerdocker-engine docker.io containerd runc-y# 2. 更新apt索引安装依赖工具sudoapt-getupdatesudoapt-getinstallca-certificatescurlgnupg lsb-release-y# 3. 添加Docker官方GPG密钥sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudogpg--dearmor-o/etc/apt/keyrings/docker.gpg# 4. 配置Docker官方稳定版软件源Debian将ubuntu替换为debian即可echodeb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu$(lsb_release-cs)stable|sudotee/etc/apt/sources.list.d/docker.list/dev/null# 5. 安装Docker核心组件含Compose插件sudoapt-getupdatesudoapt-getinstalldocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin-y# 6. 启动Docker服务sudosystemctl startdocker2CentOS/RHEL 系列yum/dnf包管理器# 1. 卸载旧版本sudoyum removedockerdocker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine-y# 2. 安装依赖工具sudoyuminstall-yyum-utils device-mapper-persistent-data lvm2# 3. 配置Docker官方软件源RHEL将centos替换为rhel即可sudoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 4. 安装Docker核心组件sudoyuminstalldocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin-y# 5. 启动Docker服务sudosystemctl startdocker3Fedora 系列将上述yum命令替换为dnf其余步骤与CentOS完全一致。1.1.3 安装后必备配置生产环境必做# 1. 配置开机自启sudosystemctlenabledockersudosystemctlenablecontainerd# 2. 非root用户免sudo执行docker执行后重新登录终端生效sudousermod-aGdocker$USERnewgrpdocker# 临时生效无需重启# 3. 配置国内镜像加速日志限制解决镜像拉取慢、日志占满磁盘问题sudomkdir-p/etc/dockersudotee/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使配置生效sudosystemctl daemon-reloadsudosystemctl restartdocker# 5. 开启IPv4转发解决容器网络通信异常echonet.ipv4.ip_forward1|sudotee-a/etc/sysctl.confsudosysctl-p1.1.4 安装验证# 查看版本信息docker--versiondockercompose version# 运行测试容器正常输出hello-world信息即安装成功dockerrun--rmhello-world1.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执行以下命令执行完成后重启电脑# 开启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为默认版本wsl--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终端执行docker--versiondockerrun--rmhello-world正常输出hello-world信息即安装成功。1.3 【 MacOS系统 】Docker部署开发环境专属MacOS仅支持Docker Desktop安装方式原生适配Intel芯片与Apple SiliconM1/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 MacIntel芯片选择Mac with Intel ChipApple Silicon选择Mac with Apple Chip安装与启动双击下载的.dmg文件将Docker图标拖拽到Applications文件夹中完成安装从应用程序中打开Docker首次启动会请求系统权限授权后等待服务启动完成菜单栏出现Docker运行图标基础配置镜像加速打开Docker Desktop - Settings - Docker Engine添加上述Linux同款registry-mirrors加速地址点击Apply Restart生效资源配置打开Settings - Resources可调整分配给Docker的CPU、内存、磁盘空间根据Mac硬件配置调整1.3.3 安装验证打开Mac终端执行docker--versiondockercompose versiondockerrun--rmhello-world正常输出hello-world信息即安装成功。二、Docker部署前后端分离项目全流程前后端分离项目的核心架构前端静态资源通过Nginx容器托管同时Nginx作为反向代理转发API请求到后端容器后端服务提供接口连接数据库/缓存等中间件所有服务通过Docker Compose统一编排实现环境一致性与一键部署。2.1 核心架构与前置准备2.1.1 标准部署架构容器角色核心功能网络暴露策略前端容器Nginx托管前端打包产物、反向代理API、解决跨域对外暴露80/443端口唯一对外入口后端容器运行后端服务、提供RESTful接口、处理业务逻辑仅容器内部网络访问不对外暴露数据库容器持久化存储业务数据MySQL/PostgreSQL仅容器内部网络访问生产环境不对外暴露缓存容器提供缓存能力Redis仅容器内部网络访问生产环境不对外暴露核心优势所有容器加入同一自定义Docker网络通过服务名直接通信无需固定IPDocker内置DNS自动解析仅前端端口对外暴露极大提升安全性。2.1.2 前置准备环境所有部署节点已完成DockerDocker 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个核心文件1Dockerfile多阶段构建模板# 第一阶段构建前端产物Node环境 FROM node:18-alpine AS builder # 设置工作目录 WORKDIR /app # 先复制依赖文件利用Docker缓存避免每次构建都重新安装依赖 COPY package*.json ./ # 安装依赖使用国内镜像源加速 RUN npm install --registryhttps://registry.npmmirror.com # 复制所有项目源码 COPY . . # 执行打包命令生成dist目录 RUN npm run build # 第二阶段运行环境Nginx轻量镜像仅保留打包产物 FROM nginx:alpine # 复制打包产物到Nginx静态资源目录 COPY --frombuilder /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;]2nginx.conf核心配置实现静态资源托管、前端路由兼容、API反向代理三大核心能力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-age604800; } }2.2.3 本地镜像构建与测试# 1. 构建前端镜像dockerbuild-tfrontend-app:v1.# 2. 本地测试运行dockerrun-d-p80:80--namefrontend-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模板1Java Spring Boot 项目多阶段构建# 第一阶段构建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 --frombuilder /app/target/*.jar app.jar # 暴露后端服务端口 EXPOSE 8080 # 启动命令支持JVM参数注入 ENTRYPOINT [java, -jar, app.jar]2Node.js Express/Koa 项目FROM node:18-alpine WORKDIR /app # 复制依赖文件 COPY package*.json ./ # 安装依赖 RUN npm install --registryhttps://registry.npmmirror.com # 复制项目源码 COPY . . # 暴露服务端口 EXPOSE 3000 # 启动命令 CMD [node, app.js]3Python FastAPI/Flask 项目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 本地镜像构建与测试# 1. 构建后端镜像dockerbuild-tbackend-app:v1.# 2. 本地测试运行需提前准备好数据库等依赖dockerrun-d-p8080:8080--namebackend-test backend-app:v1# 3. 访问http://localhost:8080/api/health接口正常返回即构建成功2.4 【 多容器一体化 】编排部署Docker ComposeDocker 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四大核心服务覆盖生产环境必备的网络、数据持久化、重启策略、环境变量注入等能力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:v1ports:-80:80# 宿主机80端口映射到容器80端口生产环境可改为443depends_on:-backend# 先启动后端再启动前端networks:-app-networkrestart:unless-stopped# 异常自动重启手动停止才会终止# 后端服务backend:build:./backend# 后端Dockerfile所在目录image:backend-app:v1# 生产环境注释掉端口映射仅内部网络访问提升安全性# ports:# - 8080:8080# 环境变量注入所有配置通过环境变量管理无需修改代码environment:# 数据库配置host直接写服务名mysqlDocker网络自动解析-SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/app_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue-SPRING_DATASOURCE_USERNAME${MYSQL_ROOT_USER:-root}-SPRING_DATASOURCE_PASSWORD${MYSQL_ROOT_PASSWORD}# Redis配置-SPRING_REDIS_HOSTredis-SPRING_REDIS_PORT6379-SPRING_REDIS_PASSWORD${REDIS_PASSWORD}depends_on:-mysql-redisnetworks:-app-networkrestart:unless-stopped# 生产环境可选资源限制避免单容器占用所有服务器资源deploy:resources:limits:cpus:1memory:1Greservations:cpus:0.5memory:512M# MySQL数据库服务mysql:image:mysql:8.0# 固定版本禁止使用latest标签environment:-MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD}-MYSQL_DATABASEapp_db# 容器首次启动自动创建该数据库# 生产环境注释掉端口映射仅内部网络访问ports:-3306:3306# 数据持久化将容器内数据目录挂载到宿主机数据卷volumes:-mysql-data:/var/lib/mysql# 可选挂载初始化SQL脚本容器首次启动自动执行# - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:-app-networkrestart:unless-stopped# 字符集与认证插件配置command:--default-authentication-pluginmysql_native_password--character-set-serverutf8mb4--collation-serverutf8mb4_unicode_ci# Redis缓存服务redis:image:redis:7-alpine# 轻量镜像environment:-REDIS_PASSWORD${REDIS_PASSWORD}# 生产环境注释掉端口映射仅内部网络访问ports:-6379:6379# 数据持久化volumes:-redis-data:/datanetworks:-app-networkrestart:unless-stopped# 开启密码认证与AOF持久化command:redis-server--requirepass ${REDIS_PASSWORD}--appendonly yes2.4.3 环境变量配置文件.env在docker-compose.yml同目录创建.env文件管理所有敏感配置docker-compose会自动读取该文件避免敏感信息硬编码在yml文件中# 数据库配置 MYSQL_ROOT_USERroot MYSQL_ROOT_PASSWORDRoot123456 # Redis配置 REDIS_PASSWORDRedis1234562.4.4 核心编排命令在docker-compose.yml所在目录执行以下命令实现全生命周期管理# 1. 一键构建镜像并后台启动所有服务更新代码后必须加--builddockercompose up-d--build# 2. 查看所有服务运行状态dockercomposeps# 3. 实时查看服务日志排查问题必备dockercompose logs-f# 查看所有服务日志dockercompose logs-fbackend# 仅查看后端服务日志# 4. 停止所有服务不删除容器dockercompose stop# 5. 停止并删除所有容器、网络保留数据卷数据不丢失dockercompose down# 6. 慎用停止并删除所有容器、网络、数据卷会清空所有数据库数据dockercompose down-v2.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/LokiPromtail搭建日志收集系统实现多容器日志统一管理与检索为核心服务配置健康检查确保服务正常就绪后才启动依赖服务示例services:backend:image:backend-app:v1healthcheck:test:[CMD,curl,-f,http://localhost:8080/api/health]interval:30stimeout:10sretries:3start_period:60s2.5.5 镜像优化所有镜像必须使用多阶段构建减小镜像体积减少攻击面基础镜像优先选择alpine/slim精简版本避免使用臃肿的全量镜像禁止使用latest标签所有镜像必须指定固定版本号避免版本更新导致兼容性问题构建镜像前通过.dockerignore文件排除无用文件node_modules、.git、本地日志等减小镜像体积与构建时间

更多文章