Docker部署项目

作为资深Java后端,我给你一套可直接复制、生产可用 的Docker部署方案,用 Docker Compose 一键部署前后端+MySQL+Redis,全程无坑。


一、环境准备(服务器端)

1. 安装 Docker & Docker Compose(CentOS 7+)

bash 复制代码
# 1. 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 添加 Docker 源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3. 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io

# 4. 启动并开机自启
systemctl start docker
systemctl enable docker

# 5. 安装 Docker Compose(v2+)
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 验证
docker -v
docker-compose -v

2. 项目结构(服务器目录)

复制代码
/opt/ruoyi-docker/
├── docker-compose.yml       # 核心编排文件
├── mysql/
│   ├── init/                # 初始化SQL(若依脚本)
│   │   └── ry_2025xxxx.sql
│   └── data/                # 数据挂载(自动生成)
├── redis/
│   └── data/                # 数据挂载(自动生成)
├── ruoyi-admin/             # 后端
│   ├── Dockerfile
│   └── ruoyi-admin.jar      # 打包好的jar
└── ruoyi-ui/                # 前端
    ├── Dockerfile
    ├── nginx.conf
    └── dist/                # npm run build 产物

二、后端(ruoyi-admin)配置

1. 后端 Dockerfile(/opt/ruoyi-docker/ruoyi-admin/Dockerfile)

dockerfile 复制代码
FROM openjdk:8-jre-slim
MAINTAINER ruoyi

# 时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 端口
EXPOSE 8080

# 工作目录
WORKDIR /app

# 复制jar
COPY ruoyi-admin.jar app.jar

# 启动
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]

2. 后端配置修改(application-prod.yml)

关键:数据库/Redis 地址用 Docker 服务名

yaml 复制代码
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://ruoyi-mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root123456  # 与docker-compose一致
  redis:
    host: ruoyi-redis
    port: 6379
    password:  # 无密码

三、前端(ruoyi-ui)配置

1. 前端 Dockerfile(/opt/ruoyi-docker/ruoyi-ui/Dockerfile)

dockerfile 复制代码
FROM nginx:1.23-alpine
MAINTAINER ruoyi

# 时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 复制nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 复制前端dist
COPY dist /usr/share/nginx/html

# 端口
EXPOSE 80

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

2. Nginx 配置(/opt/ruoyi-docker/ruoyi-ui/nginx.conf)

nginx 复制代码
server {
    listen       80;
    server_name  localhost;

    # 前端静态资源
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    # 后端代理(关键:服务名 ruoyi-admin)
    location /prod-api/ {
        proxy_pass http://ruoyi-admin: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;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

四、核心:docker-compose.yml(一键启动)

yaml 复制代码
version: '3.8'

services:
  # 1. MySQL
  ruoyi-mysql:
    image: mysql:8.0.33
    container_name: ruoyi-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: ry-vue
      TZ: Asia/Shanghai
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d  # 初始化SQL
    restart: always
    networks:
      - ruoyi-net

  # 2. Redis
  ruoyi-redis:
    image: redis:7.0-alpine
    container_name: ruoyi-redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: always
    networks:
      - ruoyi-net

  # 3. 后端
  ruoyi-admin:
    build: ./ruoyi-admin
    container_name: ruoyi-admin
    ports:
      - "8080:8080"
    depends_on:
      - ruoyi-mysql
      - ruoyi-redis
    restart: always
    networks:
      - ruoyi-net

  # 4. 前端(Nginx)
  ruoyi-ui:
    build: ./ruoyi-ui
    container_name: ruoyi-ui
    ports:
      - "80:80"
    depends_on:
      - ruoyi-admin
    restart: always
    networks:
      - ruoyi-net

# 自定义网络(容器间互通)
networks:
  ruoyi-net:
    driver: bridge

五、部署执行步骤(服务器)

1. 准备文件

  • 把若依SQL脚本放入 mysql/init/
  • 后端打包 ruoyi-admin.jar 放入 ruoyi-admin/
  • 前端 npm run build 生成 dist 放入 ruoyi-ui/

2. 一键构建+启动

bash 复制代码
cd /opt/ruoyi-docker

# 构建镜像
docker-compose build

# 后台启动所有服务
docker-compose up -d

3. 验证

bash 复制代码
# 查看容器状态
docker-compose ps

# 查看日志(排查问题)
docker-compose logs -f ruoyi-admin
docker-compose logs -f ruoyi-ui

# 访问
http://服务器IP

六、常用运维命令

bash 复制代码
# 停止所有
docker-compose down

# 重启单个服务
docker-compose restart ruoyi-admin

# 查看所有日志
docker-compose logs -f

# 进入MySQL容器
docker exec -it ruoyi-mysql mysql -uroot -proot123456

七、生产环境优化(必做)

  1. MySQL :添加 command: --default-authentication-plugin=mysql_native_password 兼容旧驱动
  2. Redis:添加密码、开启持久化
  3. Nginx:配置 HTTPS、gzip、缓存
  4. 数据安全:关闭端口映射(仅内部网络访问)
  5. 日志:配置 ELK 或文件挂载

八、常见问题

  • 后端连不上MySQL :检查 application-prod.yml 中地址是 ruoyi-mysql,不是 localhost
  • 前端访问 404 :检查 Nginx 配置中 proxy_pass 指向 ruoyi-admin:8080
  • MySQL 初始化失败 :清空 mysql/data 目录,重新启动

相关推荐
jnrjian2 小时前
Offending ECDSA key in /home/oracle/.ssh/known_hosts:16
运维·ssh
yqzyy2 小时前
如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器
运维·服务器·ssh
janthinasnail2 小时前
使用Docker安装OpenClaw
docker·容器·openclaw
蜕变的小白2 小时前
Linux系统编程-->高效并发服务器:IO多路复用详解
linux·运维·服务器
Johnstons2 小时前
AnaTraf 网络流量分析免费版:给运维多一双“眼睛”
运维·服务器·网络
草莓熊Lotso2 小时前
手搓简易 Linux 进程池:从 0 到 1 实现基于管道的任务分发系统
linux·运维·服务器·数据库·c++·人工智能
YMWM_3 小时前
linux文件快速传windows
linux·运维·服务器
星竹晨L3 小时前
Linux开发工具入门(一):开发三板斧(包管理器,vim,gcc/g++) 以及入门理解动静态库
linux·运维·服务器
sunxunyong10 小时前
CGroup配置
linux·运维·服务器