一、云服务器购买

1. 云服务器厂家选择

一般选择阿里云或者腾讯云即可,我选择的是阿里云,下面演示阿里云服务器购买配置

2.云服务器配置

按照图片依次点击选项,进入到云服务购买页面

在快速购买选项下可以按照我图所示的选项进行购买,选择2vCPU,2GB即可,系统选择乌班图,付费类型根据需要选择,如果只是为了学习部署,带宽计费方式和付费类型都可以选择按量计费,价格右下角可以参考,在不使用的时候将服务器关闭即可,否则会一直计费,请注意!!!地域则选择离自己所在地近一点的即可

购买成功之后点击个人账号旁边的控制台,找到云服务器选项,点击进入可以看到下面的信息,然后里面有公网ip等基础信息,可以浏览一下,然后点击重置密码,设置连接你服务器的密码,这点在后面连接服务器很重要,一定要记住!!!

下一步是配置安全组,选择安全组选项卡,你可以看到下面的界面,你需要开放对应端口的安全组,不然你的访问会被拦截,如果你需要使用DataGrip这种数据库连接查看数据库,则需要开放MySQL的3306端口,但是请把访问来源设置成本机,redis同理

点击新增规则之后进行下面配置

3.Docker和Dockercompose安装

1.远程工具选择

先选择一款远程连接工具如XShell,FinalShell等,可以实现本机操控远程服务器.我选择的是FinalShell,因为下方有文件夹可视化图且可以在window本机上直接拖动文件或者文件夹上传,左边有服务器资源监控图,相对方便轻量,但是是使用Java编写,所以有时候可能会卡顿

2. 远程工具配置

这一步需要连接上云服务器,下面看图操作

3. Docker和Dockercompose安装

我之前选择的Linux是乌班图,所以下面的命令都是乌班图下载的命令,如果是其他系统的需要去官网查看文档进行安装,官网网址:安装 |Docker 文档 --- Install | Docker Docshttps://docs.docker.com/engine/install/

由于操作固定,请直接无脑复制粘贴即可

# 执行以下命令卸载所有冲突包
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

# 更新
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加Docker官方仓库
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker CE
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 配置 Docker 镜像加速器(国内)随时间会进行变更,要及时更换镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 重启 Docker 服务
sudo systemctl restart docker

# 输出应该是刚刚配置的镜像源,如果不是,则配置失败
docker info

# 更新包索引
sudo apt update

# 安装 Docker Compose 插件
sudo apt-get install docker-compose-plugin

# 检查版本,应该输出Docker Compose version vx.xx.x,只要输出,说明安装成功
docker compose version

注意 : 如果途中安装失败,大概率是镜像问题,可以问ai有什么镜像源可以更替让其帮你生成对应命令执行即可

二、基础准备

1. 服务器准备(前端采用nginx反向代理)

建议项目文件夹存放路径 : /usr/local/项目文件夹(后续讲解基于此目录)

项目文件夹结构:

  • 项目名
    • nginx
      • conf
        • 放nginx的配置文件nginx.conf
      • html
        • 放vue项目执行build之后的dist文件夹下面所有东西,直接粘贴进来就行
    • mysql
      • conf
      • data
      • init
        • 放数据库导出来的sql脚本(.sql)
    • Dockerfile
    • docker-compose.yml
    • 后端项目jar包

2. 前端准备

  1. 前端项目build : 在终端执行build指令后,找到dist文件夹,将里面的全部文件上传到服务器的/usr/local/项目文件夹/nginx/html中
  2. 编写nginx.conf文件 : 根据项目中原来的vite.conf文件改写,将反向代理的请求路径中的localhost改为对应后端项目的容器名字,端口好也要对应改写

3. 后端准备

  1. pom文件修改 : 若为多模块项目,需要修改注意对应的pom文件中有没有下面的配置,没有要添加
<build>  
    <plugins>        
	    <plugin>            
		    <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
        </plugin>        
	    <plugin>            
		    <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <configuration>                
	            <source>9</source>  
                <target>9</target>  
            </configuration>        
        </plugin>    
    </plugins>
</build>
  1. application.yml修改 :若有多环境配置,再导出jar包之前应该将生效配置换好

    重新编写一个application-production.yml文件,并把其中需要到时候从服务器中环境变量读取的数据进行替换,换为${环境变量名},如MYSQL_ROOT_PASSWORD等,对应的连接的容器名也是,到时候编写docker-compose要对照该配置编写,一定要一一对应
  2. 导出jar包 : 先找到启动类所在的模块下,然后将测试环节禁用,使用maven打包,把启动类所在模块下的jar包上传到服务器(/usr/local/项目文件夹)下

4. 数据库准备

操作总览 : 导出对应数据库的sql脚本,并在其首行加入下面代码之后放入/usr/local/项目文件夹/mysql/init中

导出操作:选择对应要导出的数据库,右键选择以下选项

然后选择以下配置,如果Path to executable是空的,且你的mysql是默认安装位置的,则可以按着图片所示路径寻找,如果是自定义的,可以使用everything工具查找mysqldump.exe,把对应路径粘贴进去即可

sql脚本导出之后是默认没有创建数据库的,所以需要在首行添加以下代码,请注意,数据库名字一定要和你java代码中的application中配置的数据库名一样

-- 设置字符集和外键检查
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS `数据库名` 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE `数据库名`;

三、Dockerfile以及dockercompose.yml文件编写

1. Dockerfile编写

  • FROM 选择基础镜像选择
  • ENV 设置运行时环境变量
  • RUN WORKDIR 创建应用目录
  • COPY 复制应用文件
  • EXPOSE 声明服务端口
  • ENTRYPOINT 定义启动命令基础编写思路
步骤 目的 是否通用
1. 选择基础镜像
FROM eclipse-temurin:xxopenjdk:xx
提供 Java 运行环境 几乎所有 Java 镜像都如此
2. 设置工作目录
WORKDIR /app
隔离应用文件,避免污染根目录 强烈推荐,已成为惯例
3. 复制应用制品
COPY app.jar app.jar
将编译好的 JAR 放入容器 核心操作,必不可少
4. 声明端口
EXPOSE 8080
文档化服务端口 虽非强制,但广泛使用
5. 定义启动命令
ENTRYPOINT ["java", "-jar", "..."]
指定容器主进程 必须有,形式略有差异
6.(可选)设置环境变量/用户/时区等 适配运行环境 按需配置,但常见

代码示例

# 直接使用 Eclipse Temurin 提供的官方 JDK 21 镜像(基于 Ubuntu/Alpine)
# 使用自己的项目JDK版本
FROM eclipse-temurin:21-jre

#设置你在后端程序中需要读取的环境变量
ENV OSS_ACCESS_KEY_ID=your_id
ENV OSS_ACCESS_KEY_SECRET=your_secret
ENV MYSQL_ROOT_PASSWORD=your_root_password
ENV REDIS_PASSWORD=your_password

#统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# 创建应用目录
# 在镜像中创建一个名为 `/sky` 的目录(自由填写)
RUN mkdir -p /sky
# 将 `/sky` 目录设置为工作目录 
# 此后的所有指令(如 `RUN`、`COPY`、`ADD`、`CMD`、`ENTRYPOINT` 等)都会在这个目录下执行
WORKDIR /sky

# 复制应用 JAR 文件到容器
COPY  sky-server.jar  sky-server.jar

# 暴露端口
EXPOSE 8080

# 运行命令
ENTRYPOINT ["java","-jar","/sky/sky-server.jar"]

2. docker-compose.yml编写

重点 :

  • 每个服务必须有 image 或 build
  • 多服务架构必须配置 networks 实现通信
  • 数据库必须配置 environment 和 volumes
  • Web 应用必须配置 ports 暴露服务
  • 反向代理必须配置 volumes 挂载配置文件
    通用思路 :
  • services:顶级关键字,作用是:定义一组需要协同运行的容器化服务(即应用组件)。
    • 编写对应的容器服务名,如redis,mysql等
      • 指定该服务使用的镜像image或者build(要自己编写dockerfile)
        • image需要去官网查询对应的版本,然后使用image: 对应镜像名字
        • build
          • context:来指定上下文位置,这样子Docker 在构建镜像时,会把整个 context 目录的内容(包括子目录)打包发送给 Docker 引擎(daemon);这个上下文就是 Dockerfile 中所有 COPY、ADD 指令的“文件来源范围”
          • dockerfile:则是指定使用Dockerfile的名字
      • container_name:来指定容器名字,方便后续联通
      • port:指定端口映射
      • command:如果要自定义镜像启动命令,就要该命令,使用具体参数官网查找
      • 下面配置数据卷volumes:,查找官网找到对应的参数,实现映射之后,在主机对应的映射位置放入文件,可以实现数据库初始化,nginx静态资源替换,nginx配置,mysql数据持久化等等
      • network:指定加入网络实现容器互通
      • depends_on:告知构建顺序,避免构建错误,比如后端必须依赖mysql和redis构建
  • network:定义你这个项目共用的网络

代码示例

services:

- Redis 服务配置
  redis:
  
    - 使用官方 Redis 7 版本镜像作为容器基础
    image: redis:7
    
	- 指定启动后的容器名称为 "redis"
    container_name: redis
    
	- 开始端口映射配置块
    ports:
    
	- 将主机的 6379 端口映射到容器的 6379 端口
      - "6379:6379"
        
    - 作用:覆盖镜像默认启动命令,设置 Redis 访问密码
		参数说明:
		redis-server:Redis 启动命令
		--requirepass:设置密码参数
		123456 :实际密码值
    command: ["redis-server","--requirepass","123456"]
    
	- 开始数据卷挂载配置块
    volumes:
    
	  - 将主机目录 /usr/local/sky/redis/data 挂载到容器的 /data 目录
      - "/usr/local/sky/redis/data:/data"
	- 开始网络配置块
    networks:
	  - 将 Redis 服务加入名为 "sky-net" 的自定义网络
      - sky-net

  - 定义名为 "mysql" 的服务块开始
  mysql:
  
    - 使用官方 MySQL 8 版本镜像
    image: mysql:8
	
	- 指定容器名称为 "mysql"
    container_name: mysql
	
	- 开始端口映射配置
    ports:
	  
	  - 映射 MySQL 默认端口 3306,外部可通过 localhost:3306 连接数据库
      - "3306:3306"

    - 开始环境变量配置块
    environment:
	  
	  - 设置容器时区为上海时区,避免时间显示问题
      TZ: Asia/Shanghai
	  
	  - 作用:设置 MySQL root 用户密码为 "123456"
	  - 重要性:这是 MySQL 镜像必需的环境变量,否则容器无法启动
      MYSQL_ROOT_PASSWORD: 123456
      
	- 开始数据卷挂载配置(三个挂载点,必须挂载)
    volumes:
    
	  - 作用:挂载自定义 MySQL 配置目录
	  - 用途:可在主机的 conf 目录放置 .cnf 文件来自定义 MySQL 配置
      - "/usr/local/sky/mysql/conf:/etc/mysql/conf.d"
	  
	  - 作用:挂载 MySQL 数据存储目录
	  - 重要性:MySQL 实际数据存储在此目录,挂载后实现数据持久化
      - "/usr/local/sky/mysql/data:/var/lib/mysql"
	  
	  - 作用:挂载数据库初始化脚本目录
	  - 功能:容器首次启动时,自动执行此目录下的 .sql 或 .sh 脚本,用于创建数据库、表结构等
      - "/usr/local/sky/mysql/init:/docker-entrypoint-initdb.d"
	
	- 网络配置
    networks:
	  
	  - 加入 "sky-net" 自定义网络
      - sky-net

  - 定义名为 "sky" 的自定义应用服务块开始
  sky:
	- 作用:开始镜像构建配置块
    build:
    
	  - 作用:指定构建上下文为当前目录(. 表示当前目录)
	  - 说明:Docker 构建时会将此目录下的文件发送到 Docker daemon
      context: .
	  
	  - 作用:指定使用的 Dockerfile 文件名
	  - 说明:从当前目录的 Dockerfile 构建自定义镜像
      dockerfile: Dockerfile
	
	- 作用:指定容器名称为 "sky-server"
    container_name: sky-server
	
	- 作用:端口映射配置
    ports:
	  
	  - 作用:映射应用端口,假设 Spring Boot 应用运行在 8080 端口
      - "8080:8080"
	
	- 作用:网络配置
    networks:
	  
	  - 作用:加入 "sky-net" 网络
      - sky-net
	
	- 作用:开始依赖关系配置
    depends_on:
	  
	  - 作用:声明依赖 MySQL 服务
	  - 效果:确保 MySQL 容器先于 Sky 应用启动
	  - 注意:仅控制启动顺序,不等待 MySQL 完全就绪
      - mysql
  
  - 作用:定义名为 "nginx" 的反向代理服务块开始
  nginx:
  
	- 作用:使用指定版本的 Nginx 镜像(1.20.2 版本)
    image: nginx:1.20.2
	
	- 作用:指定容器名称为 "nginx-sky"
    container_name: nginx-sky
  
	- 作用:端口映射配置
    ports:
	  
	  - 作用:映射 HTTP 默认端口 80,外部可通过 localhost:80 或直接域名访问
      - "80:80"
	
	- 作用:数据卷挂载配置(两个挂载点)
    volumes:
	  
	  - 作用:挂载自定义 Nginx 配置文件
	  - 说明:完全替换容器内的默认 nginx.conf 配置
      - "/usr/local/sky/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
	  - 作用:挂载静态文件目录
	  - 说明:Nginx 默认从此目录提供静态网页文件
      - "/usr/local/sky/nginx/html/sky:/usr/share/nginx/html"
	
	- 作用:依赖关系配置
    depends_on:
	  
	  - 作用:声明依赖 Sky 应用服务
	  - 效果:确保 Sky 应用先启动,再启动 Nginx
      - sky
  
    - 作用:网络配置
    networks:
	  
	  - 作用:加入 "sky-net" 网络
      - sky-net

- 作用:开始网络定义块
networks:

  - 作用:定义名为 "sky-net" 的网络配置
  sky-net:
  
    - 作用:指定实际创建的 Docker 网络名称为 "Li-sky"
	  优势:
		服务间可通过服务名直接通信(如 Sky 应用连接 mysql:3306)
		与默认 bridge 网络隔离,提高安全性
		支持自动 DNS 解析
    name: Li-sky
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐