docker部署个人网站项目记录(前后端分离)

背景

项目是前后端分离,前端有三部分,分别是

  • 个人网站(blog)
  • 网站后台管理系统(admin)
  • 数据大屏(datascreen)

后端是基于nodejs写的后台服务

  • 后台接口服务(todo-nodejs-api)

另外,数据库使用了mysql,nginx做转发代理

之前采用常规部署,近期更换了个服务器,用docker方案重新部署,记录一下

目录结构

如下结构
在这里插入图片描述

docker配置

todo-nodejs-api 中的 Dockerfile如下

FROM node:14.18.1
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]

docker-compose.yml 配置如下

MYSQL_ROOT_PASSWORD 和 MYSQL_DATABASE 分别是数据库密码和数据库名称

version: '3'
services:
  mysql:
    image: mysql:8.0.35
    container_name: mysql-container
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxx
      MYSQL_DATABASE: xxxxxx
    ports:
      - '3307:3306'
    volumes:
      - /var/lib/mysql:/var/lib/mysql # mysql数据卷挂载

  todo-nodejs-api:
    build: ./todo-nodejs-api
    container_name: todo-nodejs-api-container
    restart: unless-stopped
    ports:
      - '8888:8888'
    depends_on:
      - mysql

  nginx:
    image: nginx:latest
    container_name: nginx-container
    ports:
      - '80:80'
      - '443:443' 
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/cert:/etc/nginx/cert:ro
      - ./web/admin:/usr/share/nginx/html/admin:ro
      - ./web/blog:/usr/share/nginx/html/blog:ro
      - ./web/datascreen:/usr/share/nginx/html/datascreen:ro
    depends_on:
      - todo-nodejs-api


nginx配置

nginx.conf

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

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 4096;

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

  include /etc/nginx/conf.d/*.conf;
  upstream server_api {
    server 123.57.193.148:8888 weight=1;
  }

  server {
    listen 80;
    listen [::]:80;
    server_name www.liuzepeng.com;
    root /usr/share/nginx/html;

    error_page 404 /404.html;
    location = /404.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    return 301 https://$host$request_uri;
  }

  server {
    listen 443 ssl;
    server_name www.liuzepeng.com;

    ssl_certificate /etc/nginx/cert/liuzepeng.pem;
    ssl_certificate_key /etc/nginx/cert/liuzepeng.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location /api/ {
      proxy_pass http://server_api/;
      proxy_set_header Host $http_host;
      proxy_set_header x-real-ip $remote_addr;
      proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }

    location /admin {
      root /usr/share/nginx/html;
      index index.html index.htm;
      try_files $uri $uri/ /admin/index.html;
    }

    location /datascreen {
      root /usr/share/nginx/html;
      index index.html index.htm;
      try_files $uri $uri/ /datascreen/index.html;
    }

    location / {
      root /usr/share/nginx/html/blog;
      index index.html index.htm;
      try_files $uri $uri/ /index.html;
    }
  }
}

问题记录

记录部署过程中遇到的一些问题

COPY 文件不生效

一开始我在web下创建了一个Dockerfile文件,想把web下的目录复制到容器中

#将文件复制到 Nginx 默认的静态文件目录中
COPY admin /usr/share/nginx/html/admin/
COPY blog /usr/share/nginx/html/blog/
COPY datascreen /usr/share/nginx/html/datascreen/

进入nginx容器查看 /usr/share/nginx/html/ 目录下
在这里插入图片描述
发现并没有copy过去,没有这三个目录

后来发现,进错了容器,web里面启动的这个容器内 /usr/share/nginx/html/ 路径下确实有这三个文件

Dockerfile 只用在了 web 这个 service 里面,而nginx使用的是官网提供的镜像 nginx:latest ,两个不同的容器,不能直接在nginx容器中去访问web容器服务中的目录!!!

后面修改了一下,直接在nginx配置中把目录挂载到nginx容器内,去掉了web下的Dockerfile

 nginx:
    image: nginx:latest
    container_name: nginx-container
    ports:
      - '80:80'
      - '443:443' 
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/cert:/etc/nginx/cert:ro
      - ./web/admin:/usr/share/nginx/html/admin:ro
      - ./web/blog:/usr/share/nginx/html/blog:ro
      - ./web/datascreen:/usr/share/nginx/html/datascreen:ro
    depends_on:
      - todo-nodejs-api

docker运行的mysql本地无法链接

  • 先看一下mysql容器是否启动了

    docker ps
    

    在这里插入图片描述

  • 发现启动了,进入mysql容器

    docker exec -it mysql-container /bin/bash
    
  • 进入mysql

    mysql -uroot -p
    Enter password:xxxxxxx
    

    在这里插入图片描述

  • 查看host和user

    select host,user from mysql.user;
    

    在这里插入图片描述
    确保 root 的 host 为 % 即代表可以远程连接

  • 切换到mysql

    use mysql;
    
  • 给root分配远程访问权限

    GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH GRANT OPTION;
    
    • GRANT:赋权命令

    • ALL PRIVILEGES:当前用户的所有权限

    • ON:介词

    • .:当前用户对所有数据库和表的相应操作权限

    • TO:介词

    • ‘root’@’%’:权限赋给 root 用户,所有 ip 都能连接

    • WITH GRANT OPTION:允许级联赋权

  • 强制刷新权限

    FLUSH PRIVILEGES;
    

    在这里插入图片描述

  • 注意记得去开放对应的端口,这里映射的是3307

  • navicat连接就可以了
    在这里插入图片描述

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

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

相关文章

表情识别-情感分析-人脸识别(代码+教程)

表情识别是计算机视觉领域中的一个重要研究方向,它的目标是通过分析人脸表情来判断人的情绪状态。表情识别在很多领域都有广泛的应用,如情感分析、人机交互、智能驾驶等。本文将从以下几个方面来阐述表情识别的相关内容。 一、表情识别的基本原理 表情识…

面试 Java 算法高频题五问五答第二期

面试 Java 算法高频题五问五答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 寻找峰值: 主要思想:二分查找,利用get函数&#xff0…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”,于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结:一个信号量对应一种资源。信号量的值这种资源的剩余数量(信号量的值如果小于…

Python实现广义最小二乘法线性回归模型(GLS算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义最小二乘法(Generalized Least Squares)是一种回归分析方法,适…

NLP论文阅读记录 - | 文本生成的动量校准

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法3.1 神经文本生成3.2 动量校准 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 消融实验 五 总结 前言 Momentum Calibration for Text Generat…

MyBatis 关联查询

目录 一、一对一查询(sqlMapper配置文件) 1、需求: 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询(sqlMapper配置文件) 1、需求:…

2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供,危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术,工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical,ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power,ULP)无线技术&…

7ADC模数转换器

一.模数转换原理 ADC模拟-数字转换器可以将引脚上连续变化的模拟电压转换成内存中存储的数字变量,建立模拟电路到数字电路的桥梁。另外一种是DAC既是与前面相反,如PWM波,由于PWM电路简单且没有额外的功率损耗,更适用于惯性系统的…

Protobuf 编码规则及c++使用详解

Protobuf 编码规则及c使用详解 Protobuf 介绍 Protocol Buffers (a.k.a., protobuf) are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data Protocol Buffers(简称为protobuf)是谷歌的语言无关、…

云服务器2核4g能干什么?

​  对于许多个人和企业来说,云服务器的硬件配置是至关重要的。其中,常见的有2核4G配置。 谈到2核4g配置,它是指云服务器拥有2个CPU核心和4GB的内存。2核指的是处理器(CPU)的核心数量,而4G则是指内存的大小。这个配置通常对于中…

RetinaNet:Focal Loss for Dense Object Detection(CVPR2018)

文章目录 Abstract北京发现问题并给出方法成果 IntroductionRelated WorkRobust 评估 Focal LossBalanced Cross EntropyFocal Loss DefinitionClass Imbalance and Model InitializationClass Imbalance and Two-stage Detectors RetinaNet DetectorExperimentsConclusion hh …

服务器加装了14T硬盘,显示不出来,戴尔R730阵列卡配置阵列RAID0

戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili 然后依据下面的视频进行操作,ctrlr,选raid0 戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili

超级逼真人脸生成,Stable Diffusion的3个关键技巧

大家好,你是否曾想过,为什么别人可以使用AI图像生成技术生成如此逼真的人脸,而自己的尝试却充满了错误和瑕疵,让人一眼看出是假的。尝试过调整提示和设置,但似乎仍无法与他人的质量相匹配。 本文将带大家了解使用Stab…

第一部分 数理逻辑

目录 什么是命题 注意: 例1 下列句子中那些是命题? 联结词 例2 将下列命题符号化. 注意: 例4 设 p:天冷,q:小王穿羽绒服,将下列命题符号化 例5 求下列复合命题的真值 例如 真值表: 例&#xff1…

活动回顾 (上) | 2023 Meet TVM 系列活动完美收官

作者:xixi 编辑:三羊、李宝珠 2023 Meet TVM 年终聚会于 12 月 16 日在上海圆满落幕,本次 meetup 不仅邀请到了 4 位 AI 编译器专家为大家带来了精彩的分享,还新增了圆桌讨论环节,以更多元的视角和各位共同讨论大模型…

SICP :讨论分层及封装性的又一极好例子。

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void Draw_Element(QPainter *p, QPoint…

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中&#xff0c;同样遵循着分层的架构设计理念&#xff0c;在降低系统耦合度的同时&#xff0c;也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层&#xff0c;由上往下依次是 …

融资项目——vue之数据绑定

如上图&#xff0c;当变量{{title}}不在标签内的时候&#xff0c;vue可以正常渲染&#xff0c;点击链接后可正常跳转到百度。但如下图&#xff0c;如果{{title}}在标签内&#xff0c;则此时会产生错误&#xff0c;点击链接后并没有如愿跳转到百度页面。 此时&#xff0c;需要使…

加密算法学习

最近在写一些加密的东西。所以就整理一下常见的加密算法。 欢迎帮助纠错&#xff0c;谢谢。 废话不多直接上图&#xff1a; 加密学习一级介绍描述常见算法常见算法细分非对称加密解释 非对称加密需要两个密钥&#xff1a;公钥 (publickey) 和私钥 (privatekey)。公钥和私钥是…