docker部署前后端分离项目

docker部署前后端分离项目

前提,服务器环境是docker环境,如果服务器没有安装docker,可以先安装docker环境。
各个环境安装docker:
Ubuntu上安装Docker:
ubuntu离线安装docker:
CentOS7离线安装Docker:
CentOs7在线安装docker:
docker安装成功后,执行docker ps命令
在这里插入图片描述

一、打包一个前端项目

1.1 创建安装目录

  • 在自己安装的目录先创建三个文件夹
    mkdir config frontend logs
    在这里插入图片描述
  • 将打包好的前端项目dist,上传到frontend 目录下;
    在这里插入图片描述

1.2 编写Dockerfile

  • 编写一个Dockerfile文件放到frontend 目录下;
    Dockerfile:
FROM nginx:latest
COPY ./dist /opt/nginx/aiinspector-frontend3/frontend/dist
  • FROM nginx:latest 表示基于nginx镜像生成一个新镜像,因此前提是先拉去一个nginx:latest镜像
  • 拉取Nginx最新镜像,docker pull nginx
  • 查看拉取的镜像:docker images
    在这里插入图片描述
  • COPY ./dist /opt/nginx/aiinspector-frontend3/frontend/dist 表示复制宿主机中的项目到容器目录;
  • /opt/nginx/aiinspector-frontend3/frontend/dist 宿主机安装目录
  • ./dist 容器目录

1.3 配置nginx.conf

# 修改监听端口
listen 8000;
listen [::]:8000 default_server;
server_name localhost;

# 修改项目部署路径
root /opt/nginx/aiinspector-frontend3/frontend/dist;

# 修改后端代理路径
location /api {
            proxy_set_header Host $host;  #反向代理过程中可能会丢失Host头          
            proxy_pass http://192.168.124.11:3000;
            proxy_connect_timeout 60s;
            proxy_send_timeout 180s;
            proxy_read_timeout 180s;
            proxy_buffer_size 1M;
            proxy_buffers 8 1M;
            proxy_busy_buffers_size 1M;
}
  • nginx.conf配置如下
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format main
        '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 11m;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    fastcgi_intercept_errors on;
    proxy_intercept_errors on;

    gzip_vary on;
    gzip on;
    gzip_static on;
    gzip_buffers 16 8k;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types text/plain
        text/xml
        text/css
        application/x-javascript
        application/xml
        application/xml+rss
        application/javascript
        application/json;

    server {
        #root         /opt/nginx/aiinspector-frontend3/frontend/dist;
        listen 8000;
        listen [::]:8000 default_server;
        server_name localhost;
        #root         /usr/share/nginx/html;


        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;



        location / {
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 加这个是支持history的路由模式
            try_files $uri /index.html;
            root /opt/nginx/aiinspector-frontend3/frontend/dist;
            index index.html;
            error_page 404 /index.html;
            error_page 405 =200 $request_uri;
            # 跨域配置
            if ($request_method = OPTIONS ) {
                add_header Access-Control-Allow-Origin "*";
                add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
                add_header Access-Control-Max-Age "3600";
                add_header Access-Control-Allow-Headers
                    "Origin, X-Requested-With, Content-Type, Accept, Authorization";
                add_header Access-Control-Allow-Credentials "true";
                add_header Content-Length 0;
                add_header Content-Type text/plain;
                return 200;
            }
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
        }

       location /api {
            proxy_set_header Host $host;  #反向代理过程中可能会丢失Host头          
            proxy_pass http://192.168.124.11:3000;
            proxy_connect_timeout 60s;
            proxy_send_timeout 180s;
            proxy_read_timeout 180s;
            proxy_buffer_size 1M;
            proxy_buffers 8 1M;
            proxy_busy_buffers_size 1M;
        }

        error_page 404 /404.html;
        location = /404.html {
            root /opt/nginx/aiinspector-frontend3/frontend/dist/index.html;
        }

        # error_page 500 502 503 504 /50x.html;
        # location = /50x.html {
        # }
    }
}

二、编写启动文件

  • vim build-aiinspector-frontend3.sh
  • 将下面配置复制到build-aiinspector-frontend3.sh文件中
#!/bin/bash

echo "-----clear container start-----"
# 容器名称
rep=frontend3-react
# 判断容器是否存在,存在则先停止容器
if docker ps | grep "$rep";then
        docker stop $rep
fi
# 如果容器已经停止,则删除容器
if docker ps -a | grep "$rep";then
        docker rm $rep
fi
# 如果镜像存在,则删除镜像
if docker images -a | grep "$rep";then
        docker rmi $rep
fi

echo "----clear container end----"

echo "----build docker image satrt----"
# 制作镜像,目录必须是项目的安装路径,且与Dockerfile在同一个目录
docker build -t $rep /opt/nginx/aiinspector-frontend3/frontend || ! echo "build new image error" || exit
echo "----build docker image end----"

echo "----build nginx container start-----"
# 启动容器 
# -d 后台运行,
# -p 8000:8000 -p [宿主机端口:容器端口],蒋容器为8000的端口映射到宿主机为8000的端口,
# --restart=always,docker 服务重启时此容器自动重启,
# --name $rep 容器名称为 frontend3-react
# -e TZ=Asia/Shanghai ,容器时间为亚洲上海时间
# -v /opt/nginx/aiinspector-frontend3/config/nginx.conf:/etc/nginx/nginx.conf 映射宿主机目录文件nginx.conf到容器的目录文件中/etc/nginx/nginx.conf
docker run -d -p 8000:8000 \
--restart=always \
--name $rep \
-e TZ=Asia/Shanghai \
-v /opt/nginx/aiinspector-frontend3/config/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/aiinspector-frontend3/logs:/var/log/nginx $rep || ! echo "cannot run container:$rep,exit" || exit
echo "----build nginx container end-------"

  • 执行启动文件命令: sh build-aiinspector-frontend3.sh
    在这里插入图片描述

三、查看启动容器

  • docker ps
    在这里插入图片描述
  • 浏览器访问:http://localhost:port

四、总结

  • docker容器化部署前端项目,首先需要拉去一个nginx基础镜像;
  • 需要编写Dockerfile制作镜像;
  • 需要配置nginx.conf配置文件;
  • 需要编写一个启动容器项目的脚本;
  • 宿主机的端口不能被其他程序占用,否则启动失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件? 一般前端项目中,会有一个docker/nginx/nginx.conf文件,用于配置DockerFile配置等。 那么,如何给项目写好一个nginx.conf文件,以DockerFile为例: # 使用 Node.js …

【LeetCode】并查集OJ

目录 1.省份数量 2. 等式方程的可满足性 1.省份数量 题目地址: 547. 省份数量 - 力扣(LeetCode) 解题思路:对于该题我们直接使用并查集,将可以直接的城市都归类一个集合,最后统计数组中集合的总数就是…

Qt入门(一)Qt概述

Qt是什么? Qt是一个跨平台应用开发框架。 Qt既包括了一系列的Qt库,还包括诸多配套的开发工具如QtCreater,GUI Designer。Qt本身是由C开发的,但是也提供了其他编程语言的接口。 Qt的定位以及同类 学一种技术,最重要的是…

WordPress建站入门教程:忘记数据库名称、用户名和密码了怎么办?

有时候我们需要进入phpMyAdmin管理一些数据库,但是登录phpMyAdmin时却需要我们输入数据库的用户名和密码,但是我们不记得了应该怎么办呢? 其实,我们只需要进入WordPress网站根目录找到并打开wp-config.php文件,就可以…

FPGA- RGB_TFT显示屏原理及驱动逻辑

下图是TFT显示屏的显示效果 该显示屏共分为 2 个版本,4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同,接口脚位定义完全相同,接口时序完全相同,仅使用的显示屏 模组尺寸不同。设计两…

多线程相关面试题(2024大厂高频面试题系列)

1、聊一下并行和并发有什么区别? 并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程 2、说一下线程和进程的区别? 进程是正在运行程序的实例&#xff…

【Linux】常见指令1(ls指令、pwd指令、cd指令、touch指令、mkdir指令、rmdir指令、man指令、cp指令、mv指令、cat指令)

目录 01.ls指令与ll指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令 06.rmdir指令&&rm指令 07.man指令 08.cp指令 09.mv指令 10.cat指令 01.ls指令与ll指令 ls指令: 原型:list directory contents 语法:ls[选项][目录…

于建筑外窗遮阳系数测试的太阳光模拟器模拟太阳光照射房屋视频

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景,帮助建筑师和设计师更好地了解建筑外窗的遮阳性能,从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单,它通过使用高亮度的光源和精密…

【音视频开发好书推荐】RTC程序设计:实时音视频权威指南

目录 1、WebRTC概述2、好书推荐3、本书内容4、本书特色5、作者简介6、谁适合看这本书 1、WebRTC概述 WebRTC(Web Real-Time Communication)是一个由Google发起的实时音视频通讯C开源库,其提供了音视频采集、编码、网络传输,解码显…

【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1:【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程!全套200集!学不会退出IT界! 参考文章2:清华教授大力打造的Python高级核心技术!整整100集,强烈建议学习(Python3…

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法(Enseamable learning) 集成算法一般考虑树模型,KNN就不太适合 目的:让机器学习效果更好,单个不好,一起…

【力扣白嫖日记】626.换座位

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 626.换座位 表:Seat 列名类型idintstudentvarchar id 是该表的主键(唯一值&#xf…

Golang各版本的GC详解

go v1.3的标记清除法 清除的第一步:stw将可达对象标记删除未被标记对象 go v1.5三色标记法 从根节点出发,将下一个节点遍历为灰色,放入灰色集合中遍历灰色节点集合,把灰色能到达的节点标记为灰色,把自身标记为黑色&a…

UniSA: Unified Generative Framework for Sentiment Analysis

文章目录 UniSA:统一的情感分析生成框架文章信息研究目的研究内容研究方法1.总体架构图2.基准数据集SAEval3.Task-Specific Prompt4.Modal Mask Training5.Pre-training Tasks5.1Mask Context Modeling5.2Sentiment Polarity Prediction5.3Coarse-grained Label Con…

latex使用\rm将部分公式或者部分单词设置为正体

在LaTeX中,\rm 是用于设置文字为 “Roman” 字体的命令。这里的 “Roman” 字体通常指的是默认的文本字体,也就是没有特意设置为斜体或粗体的普通字体。然而,\rm 并不总是表示特定的字体样式,而是依赖于当前文档或环境的设置。 在…

TIA博途中安装和更新HSP硬件支持包的具体方法示例

TIA博途中安装和更新HSP硬件支持包的具体方法示例 下面介绍2种方法,大家可根据自己实际的情况来选择适合自己的方法。 方法1: 参考以下链接中的内容: 如何TIA博途中更新HSP硬件目录? 方法2:

力扣515. 在每个树行中找最大值(BFS,DFS)

Problem: 515. 在每个树行中找最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:BFS 套用BFS模板,直接在遍历树的某一层时将当前层的最大值存入数组中 思路2:DFS 回溯思想,在递归时不断更新可选列表(根据…

(C语言)深入理解指针2之野指针与传值与传址与assert断言

(C语言)深入理解指针1基础:http://t.csdnimg.cn/iGA3V 前面我们了解了指针的一些基础知识,下面我们进行进一步的指针学习 目录 1. 野指针 6.1 野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 6.2 如何…

基于JavaWEB SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

Git快速上手二

对Git命令的深入理解快速上手Git(包含提交至GitHub和Gitee)-CSDN博客 1.5 分支操作 1.5.1 分支原理 系统上线后,又要修改bug,又要开发新的功能。 由于新功能没有开发完,所以需要建立分支,一边修改bug,一边开发新功能,最终合并. 1.5.2 分支实操 创建…