当前位置: 首页 > news >正文

Docker 部署前后端分离项目

1.Docker 

1.1 什么是 Docker ?

Docker 是一种开源的 容器化平台,用于开发、部署和运行应用程序。它通过 容器(Container) 技术,将应用程序及其依赖项打包在一个轻量级、可移植的环境中,确保应用在不同计算环境中一致运行。

 1.2 Docker 核心概念

容器(Container)

类似于轻量级的虚拟机,但共享主机操作系统内核,启动更快、占用资源更少。每个容器运行一个独立的应用进程,与其他容器隔离。

镜像(Image)

容器的静态模板,包含运行应用所需的代码、库、环境变量和配置文件。

Dockerfile用于定义如何构建镜像的文本文件
Docker Hub官方的镜像仓库,提供大量预构建的镜像(如 MySQL、Python、Redis 等)
Docker Engine

Docker Daemon(后台服务)

Docker CLI(命令行工具)

REST API(用于交互)

2. Docker 基本命令

# 1.镜像
# 在线搜索镜像 可以不带版本号
docker search <镜像名称>:<版本号>
docker pull nginx:latest      # 拉取镜像 docker pull <镜像名>:<标签>
docker images                 # 查看本地所有镜像
docker rmi <镜像ID或镜像名>    # 删除本地镜像
docker build -t my-app:1.0 .  # 使用 Dockerfile 构建镜像 docker build -t <镜像名>:<标签> <Dockerfile路径># 2.容器
# 基于镜像启动一个新容器 docker run [选项] <镜像名>  -d:后台运行 -p:端口映射(主机端口:容器端口) --name:容器名
docker run -d -p 8080:80 --name my-nginx nginx 
docker exec -it <容器ID或容器名> /bin/bash  # 进入(运行的)容器
docker ps     # 查看正在运行的容器
docker ps -a  # 查看所有容器
docker stop <容器ID或容器名>     # 停止(运行的)容器
docker start <容器ID或容器名>    # 启动(停止的)容器
docker restart <容器ID或容器名>  # 重启(停止的)容器
docker rm <容器ID或容器名>       # 删除(停止的)容器
docker rm -f <容器ID或容器名>    # 强制删除(运行的)容器
docker logs <容器ID或容器名>     # 查看容器的日志# 3.网络
docker network ls              # 查看 Docker 网络
docker network create <网络名>  # 创建一个自定义网络
docker network connect <网络名> <容器ID或容器名>     # 将容器连接到指定网络
docker network disconnect <网络名> <容器ID或容器名>  # 断开容器与指定网络的连接# 3.数据卷(持久化数据存储)
docker volume create <卷名> # 创建一个数据卷
docker volume ls            # 查看所有数据卷
docker volume rm <卷名>     # 删除一个数据卷
docker run -v <卷名>:<容器内路径> <镜像名> # 启动容器时挂载数据卷(容器内外同步指定的目录和文件)# 4.其他命令
docker version # 查看 Docker 客户端和服务端版本
docker info    # 查看 Docker 的系统信息
docker system prune     # 清理未使用的镜像、容器、网络和数据卷
docker system prune -a  # 强制清理所有未使用的资源

3. 下载 Docker Desktop(Windows | Docker Docs)

4. Docker Desktop 拉取镜像、创建并启动容器 

4.1 拉取镜像仓库的镜像

4.2 根据镜像创建并启动容器

 5. Dockerfile 定义如何构建镜像 

# 使用官方 OpenJDK 镜像作为基础镜像
FROM openjdk:25-jdk# 设置工作目录
WORKDIR /app# 将当前目录的 springboot3-vue3-0.0.1-SNAPSHOT.jar 复制到容器 /app/app.jar
COPY springboot3-vue3-0.0.1-SNAPSHOT.jar app.jar# 暴露 Spring Boot 默认端口(根据 application.yml 调整)
EXPOSE 8080# 启动 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "app.jar"]

6. docker-compose(推荐)

docker-compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml 文件,您可以配置应用程序的服务、网络和卷等信息,然后使用一条命令来启动所有服务。(Docker Desktop 内置了 docker-compose)

6.1 docker-compose 命令(在 docker-compose.yml 目录执行以下命令

# 构建并以前台模式启动所有服务或某个服务(根据 docker-compose.yml 文件)
docker-compose up 
docker-compose up mysql
# 构建并以后台模式启动所有服务或某个服务
docker-compose up -d
docker-compose up -d mysql# 查看当前正在运行的服务的状态
docker-compose ps# 停止所有服务但不移除容器
docker-compose stop# 停止并移除所有服务以及它们的网络
docker-compose down# 构建或重新构建服务(不启动服务)
docker-compose build  # 用于当 Dockerfile 发生变化时重新构建镜像# 实时查看所有服务的日志输出
docker-compose logs -f # 重启所有服务
docker-compose restart# 重启特定服务,例如 'web'
docker-compose restart web=# 扩展某个服务的实例数量,比如将 'web' 服务扩展到 3 个实例
docker-compose up --scale web=3 -d# 在某个服务的容器内执行命令,例如在 'web' 服务中执行 'bash'
docker-compose exec web bash# 验证 docker-compose.yml 文件的配置是否正确
docker-compose config

6.2 docker-compose 定义和运行多容器

 6.2.1 拉取 minio、redis、nginx、mysql 镜像

6.2.2 服务目录结构

├── docker/
│   ├── backend/
│   │   ├── Dockerfile
│   │   └── springboot3-vue3-0.0.1-SNAPSHOT.jar(后端打的包)
│   ├── frontend/
│   │   ├── dist/                              (前端打的包)
│   │   └── nginx.conf                         (nginx 配置文件)
│   ├── minio/
│   │   └── data/                              (minio 持久化数据的文件夹)
│   ├── mysql/
│   │   ├── data/                              (mysql 持久化数据的文件夹)
│   │   └── springboot3_vue3_satoken.sql       (sql 文件按)
│   ├── redis/
│   │   └── redis.conf                         (redis 配置文件)
│   ├── docker-compose.yml                     (docker-compose 配置文件)
6.2.2.1 docker 目录 
6.2.2.2 backend 目录 
6.2.2.3 frontend 目录  
6.2.2.4 minio目录   
6.2.2.5 mysql 目录
6.2.2.6 redis目录   

6.2.2.7 (很重要!!!)docker-compose.yml
name: my-project
services:backend:# 构建镜像(在当前目录的 backend 目录下,根据 Dockerfile 构建镜像)build: context: ./backenddockerfile: Dockerfileimage: springboot-image:latestcontainer_name: springboot-containerports:- "8080:8080"depends_on:- redis- mysql- minioenvironment:# MySQL 数据库配置(容器内的 mysql 服务和端口)- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/springboot3_vue3_satoken- SPRING_DATASOURCE_USERNAME=***- SPRING_DATASOURCE_PASSWORD=***# Redis 配置- SPRING_REDIS_HOST=redis- SPRING_REDIS_PORT=6379- SPRING_REDIS_PASSWORD=    # 如果没有密码则留空- SPRING_REDIS_DATABASE=1   # 默认使用0号数据库# MinIO 配置(Spring Boot 应用访问 MinIO 的配置)- SPRING_MINIO_ENDPOINT=http://minio:9000- SPRING_MINIO_ACCESS_KEY=minioadmin- SPRING_MINIO_SECRET_KEY=minioadminrestart: unless-stoppedredis:image: redis:latestcontainer_name: redis-containerports:- "6379:6379"volumes:- ./redis/redis.conf:/usr/local/etc/redis/redis.conf# 启动 Redis 使用这个配置文件command: ["redis-server", "/usr/local/etc/redis/redis.conf"]restart: unless-stoppedmysql:image: mysql:latestcontainer_name: mysql-containerports:- "13306:3306"environment:MYSQL_ROOT_PASSWORD: ***MYSQL_DATABASE: springboot3_vue3_satokenvolumes:# 将容器内的 MySQL 数据目录 (/var/lib/mysql) 持久化到 ./mysql/data- ./mysql/data:/var/lib/mysql# MySQL 容器首次启动时,会自动执行 /docker-entrypoint-initdb.d/ 目录下的 .sql- ./mysql/springboot3_vue3_satoken.sql:/docker-entrypoint-initdb.d/springboot3_vue3_satoken.sqlrestart: unless-stoppednginx:image: nginx:latestcontainer_name: nginx-containerports:- "5173:80" volumes:- ./frontend/nginx.conf:/etc/nginx/nginx.conf- ./frontend/dist:/usr/share/nginx/html depends_on:- backendrestart: unless-stoppedminio:image: minio/minio:latestcontainer_name: minio-containerports:- "9000:9000"  # API 端口- "9001:9001"  # 控制台端口volumes:- ./minio/data:/data  # 持久化存储environment:MINIO_ROOT_USER: minioadminMINIO_ROOT_PASSWORD: minioadmin# 指定数据目录、API 端口、控制台端口command: ["server", "/data", "--address", ":9000", "--console-address", ":9001"]restart: unless-stopped

6.3 启动所有服务

6.3.1 cmd 启动所有服务和查看所有服务 

6.3.2 Docker Desktop 启动和查看所有服务 

6.4 进入容器内部

 6.5 访问 http://localhost:5173(Docker 部署前后端分离项目成功!!!)

http://www.xdnf.cn/news/792397.html

相关文章:

  • 中英混合编码解码全解析
  • 飞牛fnNAS使用群辉DSM系统
  • C#基础语法
  • DMA-BUF与mmap共享内存对比分析
  • 辩证唯物主义精要
  • 【Golang】使用gin框架导出excel和csv文件
  • 基于Python协同过滤的电影推荐系统研究
  • DDR信号线走线关键点
  • Vert.x学习笔记-EventLoop与Handler的关系
  • WebTracing:一站式前端埋点监控解决方案
  • 多线程编程中的重要概念
  • CSP模式下如何保证不抖动
  • 查询去重使用 DISTINCT 的性能分析
  • Ubuntu安装Docker命令清单(以20.04为例)
  • 文件批量重命名
  • Tiktok App 登录账号、密码、验证码 XOR 加密算法
  • C++指针加减法详解:深入理解指针运算的本质
  • ES6 Promise 状态机
  • 外贸建站平台推荐
  • shell脚本的常用命令
  • 2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序
  • Linux 命令全讲解:从基础操作到高级运维的实战指南
  • 人脸识别技术应用备案系统已开启!
  • Python趣学篇:Pygame重现《黑客帝国》数字雨
  • ArcGIS Pro 3.4 二次开发 - 地图创作 2
  • 车规级BMS芯片国产化!精准电量监测延长电池寿命
  • JS语法笔记
  • PyTorch——非线性激活(5)
  • Linux系统下Google浏览器无法使用中文输入的临时解决方案
  • AIGC学习笔记(9)——AI大模型开发工程师