Linux系统中使用docker搭建前后端分离的项目

这里我用的是springboot作为后端服务+Vue3写前端服务+MySQL

准备Linux服务器/虚拟机-centos7.9

文章参考:

20-项目部署(Docker) - 飞书云文档 (feishu.cn)

安装docker

卸载已有的docker(不管有没有都执行一下)

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux 

配置docker的yum库

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

等待执行完毕

安装成功后,执行命令,配置Docker的yum源(阿里云源)

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

sudo yum makecache fast

安装docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

等待执行完毕

启动和校验

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

配置镜像加速(直接全部复制过去执行就行了)

# 创建目录
rm -f /etc/docker/daemon.json

# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://mirrors.sohu.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.m.daocloud.io",
        "https://docker.awsl9527.cn"
    ]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

至此,docker安装完毕

部署前端(nginx)

示例:

# 第1步,去DockerHub查看nginx镜像仓库及相关信息

# 第2步,拉取Nginx镜像 (比较耗时)
docker pull nginx:1.20.2
# 第3步,查看镜像
docker images
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

 示例中只挂载了html数据卷,但是使用nginx一般还需要挂载conf配置文件

我按照上面的配置配置好后出现的问题是启动nginx后,进入项目页面后刷新页面会出现404,需要配置一下nginx.conf文件

参考:

Nginx部署的前端项目刷新404问题

解决方案:

docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html -v conf.d:/etc/nginx/conf.d nginx:1.20.2

这样进行数据挂载后,在  /var/lib/docker/volumes 这个路径下出现了两个文件

我们把前端打包好的项目放到html里面_data目录下,在conf.c文件夹中_data文件夹有一个default文件

在这个文件中添加一行,然后保存,再让nginx重启或重新加载配置文件

try_files $uri $uri/ /index.html;
docker exec nginx nginx -s reload

重新加载配置文件

当然,这里可以进行添加网络,我最开始忘了添加网络,导致最后测试不同,所以可以在原来的命令中添加

--network 网络名

我这里在最后添加

至此,nginx就安装完成,可以在外部网络通过Ip:80进行访问

部署MySQL

  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)

docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8

在 /root/mysql 这个目录下分别创建三个文件夹,data、init、conf文件夹即可,执行命令后会进行自动挂载

此时,我们的数据库就已经安装完成并且数据挂载好了,然后在我打算用本地DataGrip连接远程的MySQL时又遇见新的问题

问题:远程无法连接,然后连接上又无法进行增删改查操作

解决方案:继续来服务器这里配置:

参考:

https://www.cnblogs.com/diamondhehua/p/15260708.html

https://blog.youkuaiyun.com/weixin_62524256/article/details/144243676

https://blog.youkuaiyun.com/m0_74825409/article/details/144299081

执行:

docker exec -it mysql bash

进入MySQL容器内部 

mysql -uroot -p

然后输入我们的密码 

123456

进入MySQL的服务

继续执行:

use mysql;
update user set host='%' where user='root' and host='localhost';

执行这句sql后出现了Error

 查询:

select host,user from user where user='root';

发现存在这个用户,但是修改不知道为什么会失败

再次进入MySQL服务,然后执行添加用户的操作

create USER 'root1' identified by '123456';

这里可以看到受影响的行数为0,这里我问chatGPT,他回答的是,这里不会返回受影响的条数,只要没有报错就是执行成功。

GRANT ALL PRIVILEGES ON *.* TO 'root1'@'%' WITH GRANT OPTION;

继续执行这段代码进行授权

然后执行

FLUSH PRIVILEGES;

最后退出

后续,发现,还是没有增删改查的权限

再次进入MySQL服务,查询有这条数据

SELECT User, Host FROM mysql.user WHERE User = 'root';

然后再次授权

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

然后重复面的刷新操作

FLUSH PRIVILEGES;

然后再次退出

这次,我重启了MySQL(服务)容器

docker restart mysql

然后就好了,可以在本地连接和操作远程数据库

这里也需要将mysql添加到固定的网络中,我同样也是在最后添加

部署jdk以及后端服务

将数据库的数据源配置成docker中mysql的服务名即可,密码也修改成对应的密码

然后运行maven的打包插件,打成一个jar包

然后找到下载jdk17

然后准备一个Dockerfile

内容:

# 使用 CentOS 7 作为基础镜像
FROM centos:7

# 设置维护者信息
LABEL maintainer="wangjunwei"

# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz

# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH

# 创建应用目录
RUN mkdir -p /pfms
WORKDIR /pfms

# 复制应用 JAR 文件到容器
COPY  pfms-0.0.1-SNAPSHOT.jar  pfms-0.0.1-SNAPSHOT.jar

# 暴露端口
EXPOSE 8080

# 运行命令
ENTRYPOINT ["java","-jar","/pfms/pfms-0.0.1-SNAPSHOT.jar"]

然后将准备好的三个文件上传到服务器的:/root/pfms目录下,

然后开始构建项目镜像

docker build -t pfms:2.0 .

构建好后通过:docker images可以查看到刚创建的pfms

启动容器

docker run -d --name pfms-server  -p 8080:8080  pfms:2.0

这样项目就部署成功了

> 补充 :挂载日志

docker run -d --name pfms -v /utils/docker/pfms/log:/var/log -p 8081:8081 pfms:2.4

可以通过这个命令查看日志

docker logs -f 容器名

全部启动成功后,联调会发现上面的网络问题,由于没有添加到同一个网络中,所以,容器之间无法通信,

docker network create pfms-sys

docker network connect pfms-sys nginx

docker network connect pfms-sys pfms-server

docker network connect pfms-sys mysql

将三个容器添加到同一个网络后,再次联调没有问题了,另外,除了容器内部端口要开放外,还要在安全组中选择端口开放,要开放服务器的端口而不是容器内部端口。

项目链接:个人理财管理系统

到这里本文就进入尾声了,后续会发现问题还会持续更新...

### 使用阿里云 Docker 部署前后端分离项目 #### 环境准备 为了在阿里云上使用 Docker 部署包含前端和后端的项目,首先需要准备好相应的环境。这包括获取一台合适的云服务器并完成必要的软件安装。 对于云服务器的选择,可以考虑使用阿里云轻量级应用服务器作为部署平台[^1]。一旦选择了适合的实例规格,在创建完成后即可以通过 SSH 远程登录到该服务器进行后续操作。 #### 安装 Docker 及其依赖项 确保操作系统是最新的状态之后,通过以下命令来配置 Docker 的 YUM 源至阿里云镜像仓库,并安装最新版本的 Docker: ```bash sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io -y ``` 上述命令会将官方源替换为更快速稳定的国内镜像站点,从而加速下载过程;接着执行 `yum` 命令完成实际的安装工作[^3]。 #### 启动与管理 Docker 服务 安装完毕后应当立即启用 Docker 自启功能以便于未来维护更加便捷高效: ```bash sudo systemctl start docker sudo systemctl enable docker ``` 这样即使重启机器也不必担心容器化应用程序无法正常运行了。 #### 构建或拉取所需镜像 针对具体的业务需求分别构建或者从公共注册表中拉取对应的前端、后端以及数据库组件所需的 Docker 镜像文件。例如 Spring Boot 应用程序通常会被打包成 JAR 文件并通过官方 Java Base Image 来启动;而 MySQL 数据库则可以直接利用官方提供的稳定版镜像来进行初始化设置。 #### 编写 Compose 文件实现多容器编排 考虑到前后端分离架构的特点,推荐采用 Docker Compose 工具简化多个关联服务之间的协调运作关系。编写一份描述清晰合理的 YAML 格式的 compose 文件能够帮助自动化整个项目搭建流程,减少人为干预带来的不确定性因素影响最终效果[^2]。 #### 测试验证部署成果 最后一步就是仔细检查各个部分是否按照预期那样协同合作良好地运转起来了——访问指定域名下的网页界面查看是否存在加载异常情况;尝试提交一些简单的交互请求确认后台逻辑处理无误等等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值