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

news2024/12/29 16:04:59

背景

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

  • 个人网站(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.coloradmin.cn/o/1326902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp图片上传说明

目录 1.文件上传组件 2.单文件上传 3.多文件上传 4.图片的回显 5.注意点 1.文件上传组件 前端上传组件使用uni-file-picker,可以自行进行下载使用。默认上传到绑定的服务空间,配置属性auto-upload为false关闭自动上传,可以限定上传的是…

【JAVA基础】DeferredResult使用详解

简介 Servlet3.0提供了基于servlet的异步处理api,Spring MVC只是将这些api进行了一系列的封装,从而实现了DeferredResult。 DeferredResult字面意思是"延迟结果",它允许Spring MVC收到请求后,立即释放(归还)容器线程&…

OpenCV4工业缺陷检测的六种方法

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

【递归 回溯】LeetCode-17. 电话号码的字母组合

17. 电话号码的字母组合。 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digit…

轻量级web开发框架Flask本地部署及无公网ip远程访问界面

文章目录 前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,采用P…

JDBC常用API

在开发JDBC程序前,先了解一下JDBC常用的API。JDBC API主要位于java.sql包中,该包定义了一系列访问数据库的接口和类。 (1)Driver接口 Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需…

windows11下载GCC编译器

下载 1. 打开MinGW官网 2. 点击下载, 进入后选择下载在Window系统 3. 选择在github上面下载, 进入后下载下面两个即可, 一个是编译器, 一个是源码. 考虑跨平台性, 下载posix版本, 只在Windows下开发应用就下载win32, 不知道就下载前者. win11选择ucrt, 之前版本选择msvcrt. 配…

pr插件|特殊编码.mkv/mov/flv/webm/avi/wmv/vob等多种格式视频素材直接导入pr的插件 Influx v1.2.5

适用于Adobe的一体式原生导入器插件(Premiere Pro、After Effects和Media Encoder)。支持多种格式和编解码器。 主要特点 直接在Adobe CC Video中进行本机导入 不再需要通过外部转码软件!节省时间、磁盘空间和麻烦 在Premiere Pro中导入和编辑…

org.slf4j日志组件实现日志功能

slf4j 全称是Simple Logging Facade for Java。facade是一种设计模式。 slf4j 是一个抽象程度更高的日志组件,本身并不提供实际的日志功能。实际的日志功能是通过log4j等日志组件实现,而使用者只需要关心 slf4j 给出的API。 slf4j 仅仅是一个为Java程序提…

Redis BitMap(位图)

这里是小咸鱼的技术窝(CSDN板块),我又开卷了 之前经手的项目运行了10多年,基于重构,里面有要实现一些诸如签到的需求,以及日历图的展示,可以用将签到信息存到传统的关系型数据库(MyS…

基于SpringBoot的超市账单管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

JS模块化规范之ES6及UMD

JS模块化规范之ES6及总结 前言ES6模块化概念基本使用ES6实现 UMD(Universal Module Definition)总结 前言 ESM在模块之间的依赖关系是高度确定的,与运行状态无关,编译工具只需要对ESM模块做静态分析,就可以从代码字面中推断出哪些模块值未曾被…

快速排序(非递归)以及归并排序的递归与非递归

快速排序的非递归算法: 递归次数太多的缺陷:极端情况下(栈帧深度太深)会导致栈溢出,即使程序代码正确(递归的深度足够深时,空间不足,就会导致栈溢出),因此在…

hbase用shell命令新建表报错ERROR: KeeperErrorCode = NoNode for /hbase/master

或者HMster开启后几秒消失问题解决 报错如图: 首先jps命令查看当前运行的内容有没有HMaster,如果没有,开启一下hbase,稍微等一会儿,再看一下HMaster,如果仍和下图一样没有,就基本找到问题了 本人问题原因:hbase-site…

【深入使用】PHP的PDO 基本使用

前言: PDO:数据库抽象层 简介:PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,PDO解决了数据库连接不统一的问题。是PHP 5新加入的一个重大功能 【为什么要使用PDO】? PDO是PHP5新加入的一个重大功能&a…

hab_virtio hypervisor 虚拟化

Linux的 I / O 虚拟化 Virtio 框架 简而言之,virtio是半虚拟化管理程序中设备上的抽象层。virtio由Rusty Russell开发以支持他自己的虚拟化解决方案lguest。本文从准虚拟化和仿真设备的介绍开始,然后探讨的细节virtio。重点是virtio2.6.30内核发行版中的…

提前预判和确认再做 现货白银投资的两种思路

在现货白银投资中,对于交易的步骤长期有两种看法。一种是提前预判行情并提前布局。另外一种是等待行情启动再做布局。这种两种方法要怎么选呢?笔者将从自己的角度出发,对这个问题进行讨论。 我们来看一下前一种的投资者,他们喜欢提…

vulnhub-Tre(cms渗透)

靶机和kali都使用net网络,方便探测主机获取ip1.靶机探测 使用fping扫描net网段 靶机ip:192.168.66.130 2.端口扫描 扫描发现该靶机三个端口,ssh,还有两个web,使用的中间件也是不一样的,一个是apache&…

TortoiseGit通过SSH连接配置,生成SSH密钥方法

生成SSH密钥: Win环境下命令(git ssh key是可以自定义命名的): ssh-keygen -t ed25519 -C "git ssh key" && start "" "C:\Windows\notepad.exe" "C:\Users\%username%\.ssh\id_ed25519.pub" 打开cm…

指针---你真的会使用指针吗?

指针作为C语言中的一个部分,可以说指针是C语言的核心,那么它的难度肯定是不言而喻的,总是能把人给绕得找不到方向。 今天我就好好的说一说指针这个东西。 1、何为指针? 指针是C语言中用来存放地址的一个变量类型。我们可以将指针看…