从零部署苍穹外卖:Docker Compose前后端完整指南(含Dockerfile详解)
一、云服务器购买
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 Docs
https://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文件夹下面所有东西,直接粘贴进来就行
- conf
- mysql
- conf
- 空
- data
- 空
- init
- 放数据库导出来的sql脚本(.sql)
- conf
- Dockerfile
- docker-compose.yml
- 后端项目jar包
- nginx
2. 前端准备
- 前端项目build : 在终端执行build指令后,找到dist文件夹,将里面的全部文件上传到服务器的/usr/local/项目文件夹/nginx/html中
- 编写nginx.conf文件 : 根据项目中原来的vite.conf文件改写,将反向代理的请求路径中的localhost改为对应后端项目的容器名字,端口好也要对应改写
3. 后端准备
- 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>
- application.yml修改 :若有多环境配置,再导出jar包之前应该将生效配置换好
重新编写一个application-production.yml文件,并把其中需要到时候从服务器中环境变量读取的数据进行替换,换为${环境变量名},如MYSQL_ROOT_PASSWORD等,对应的连接的容器名也是,到时候编写docker-compose要对照该配置编写,一定要一一对应

- 导出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设置运行时环境变量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.(可选)设置环境变量/用户/时区等 | 适配运行环境 | 按需配置,但常见 |
代码示例
# 直接使用 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的名字
- image需要去官网查询对应的版本,然后使用
container_name:来指定容器名字,方便后续联通port:指定端口映射command:如果要自定义镜像启动命令,就要该命令,使用具体参数官网查找- 下面配置数据卷
volumes:,查找官网找到对应的参数,实现映射之后,在主机对应的映射位置放入文件,可以实现数据库初始化,nginx静态资源替换,nginx配置,mysql数据持久化等等 network:指定加入网络实现容器互通depends_on:告知构建顺序,避免构建错误,比如后端必须依赖mysql和redis构建
- 指定该服务使用的镜像image或者build(要自己编写dockerfile)
- 编写对应的容器服务名,如redis,mysql等
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
更多推荐

所有评论(0)