本文概览:本文从零开始完整演示苍穹外卖项目的云端部署流程,涵盖云服务器购买与配置、Docker环境搭建、Dockerfile编写详解,以及使用Docker Compose一键编排前后端服务的全链路实战


一、云服务器购买

1. 云服务器厂家选择

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

2.云服务器配置

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

进入云服务器购买页面

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

云服务器配置选择

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

重置服务器密码

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

配置安全组规则

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

新增安全组规则

3.Docker和Dockercompose安装

1.远程工具选择

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

2. 远程工具配置

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

远程连接配置1

远程连接配置2

3. Docker和Dockercompose安装

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 执行以下命令卸载所有冲突包
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/项目文件夹(后续讲解基于此目录)

项目文件夹结构:

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

2. 前端准备

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

3. 后端准备

  1. pom文件修改: 若为多模块项目,需要修改注意对应的pom文件中有没有下面的配置,没有要添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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要对照该配置编写,一定要一一对应

application.yml环境变量配置

docker-compose与application.yml对照

  1. 导出jar包: 先找到启动类所在的模块下,然后将测试环节禁用,使用maven打包,把启动类所在模块下的jar包上传到服务器(/usr/local/项目文件夹)下

4. 数据库准备

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

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

导出数据库操作

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

mysqldump导出配置

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

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

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 直接使用 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: 对应镜像名字buildcontext:来指定上下文位置,这样子Docker 在构建镜像时,会把整个 context 目录的内容(包括子目录)打包发送给 Docker 引擎(daemon);这个上下文就是 Dockerfile 中所有 COPY、ADD 指令的“文件来源范围”dockerfile:则是指定使用Dockerfile的名字container_name:来指定容器名字,方便后续联通port:指定端口映射command:如果要自定义镜像启动命令,就要该命令,使用具体参数官网查找下面配置数据卷volumes:,查找官网找到对应的参数,实现映射之后,在主机对应的映射位置放入文件,可以实现数据库初始化,nginx静态资源替换,nginx配置,mysql数据持久化等等network:指定加入网络实现容器互通depends_on:告知构建顺序,避免构建错误,比如后端必须依赖mysql和redis构建
  • network:定义你这个项目共用的网络

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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: my
- 开始端口映射配置
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 完全就绪
- my
- 作用:定义名为 "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

版权声明:本文为CSDN博主「青山木」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LI_124301012/article/details/159738414