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.35container_name: mysql-containerrestart: unless-stoppedenvironment:MYSQL_ROOT_PASSWORD: xxxxxxMYSQL_DATABASE: xxxxxxports:- '3307:3306'volumes:- /var/lib/mysql:/var/lib/mysql # mysql数据卷挂载todo-nodejs-api:build: ./todo-nodejs-apicontainer_name: todo-nodejs-api-containerrestart: unless-stoppedports:- '8888:8888'depends_on:- mysqlnginx:image: nginx:latestcontainer_name: nginx-containerports:- '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:rodepends_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:latestcontainer_name: nginx-containerports:- '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:rodepends_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.hqwc.cn/news/292331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TKEStack容器管理平台实战之部署wordpress应用

TKEStack容器管理平台实战之部署wordpress应用 一、TKEStack介绍1.1 TKEStack简介1.2 TKEStack特点1.3 TKEStack架构图 二、kubernetes集群介绍2.1 k8s简介2.2 k8s架构图 三、本次实践介绍3.1 实践环境要求3.2 本次实践环境规划3.3 本次实践简介 四、安装容器管理平台4.1 安装T…

centos如何下载chrome

【环境配置】centos安装chrome浏览器_centos chrome-CSDN博客https://blog.csdn.net/tyty2211/article/details/134511154亲测有效:

云轴科技ZStack 英特尔联合成立云系统解决方案创新中心

近日,云轴科技ZStack 与英特尔联合成立云系统解决方案创新中心,并完成揭牌仪式。双方将基于多年合作基础进一步加快研发下一代创新技术和解决方案,为客户和合作伙伴提供更高效、安全的云基础设施解决方案。 左三:云轴科技ZStack 联合创始人兼…

基于ssm游戏美术外包管理信息系统源码和论文

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,线下管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

【论文笔记】NeuRAD: Neural Rendering for Autonomous Driving

原文链接:https://arxiv.org/abs/2311.15260 1. 引言 神经辐射场(NeRF)应用在自动驾驶中,可以创建可编辑的场景数字克隆(可自由编辑视角和场景物体),以进行仿真。但目前的方法或者需要大量的训…

第二证券:多家国有大行再度调降存款利率

时隔三个多月,国有大行存款利率再迎调降。12月22日起,多家国有大行再次下调存款挂牌利率,不同期限的定期存款及大额存单利率下调崎岖不等,存款期限涵盖一年期到五年期。 12月21日下午,工商银行发布《调整人民币储蓄存…

【实施】制作系统盘

文章目录 一、老毛桃装机重启前准备1.1 进入U盘启动盘1.1.1 U盘启动快捷键1.1.2 BIOS启动 1.2 具体操作1.3 实操演示 二、ultrasio制作U盘2.1 安装2.2 打开UltralSO.exe2.3 实操 一、老毛桃装机 重启前准备 准备一个16G以上的老毛桃U盘启动盘下载系统镜像文件,如在…

基于ssm房屋租赁平台的设计与开发论文

摘 要 目前对于在外的人员来说租赁房屋是最基本的问题。对于房屋的租赁可以选择直接找房东、找专业的房屋租赁公司和自己在网上找房屋。自己找房东的问题在于需要时间,而且对于需要提前租赁房屋的需要多次跑到小区,找中介租赁房屋的问题在于费用问题&am…

JavaGUI(但期末速成版)之容器和控件

点击返回标题->JavaGUI期末速成版-CSDN博客 前言 依旧先声明,本篇记录的JavaGUI编程都是十分精简的,内容只取常用的、套路的、应付期末考试的。 在学习本篇之前,很有必要先弄清楚Java基于swing包下的图形化编程的层次逻辑。 在前一篇中&a…

esp32-s3训练自己的数据进行目标检测、图像分类

esp32-s3训练自己的数据进行目标检测、图像分类 一、下载项目二、环境三、训练和导出模型四、部署模型五、存在的问题 esp-idf的安装参考我前面的文章: esp32cam和esp32-s3烧录human_face_detect实现人脸识别 一、下载项目 训练、转换模型:ModelAssist…

钓鱼篇(下)

选择水域 比较常用方式如传统的邮箱打点、dns劫持欺骗等方式 其实生活中有非常多攻击点(主要是人们总是自信地认为黑客不会在他们的身边) 班级群里面、教师群等社交关系群里面,本身具备了高信任的特点,所以制作点热点话题,打开一个URL并不…

什么是伦敦金的假突破?假突破为何有效?

部分投资者做伦敦金交易的时候喜欢追逐那些强势的行情,也就是我们所说的突破行情。但是突破行情会带来两种结果,一种是突破成功,而另一种是出现假突破。什么是伦敦金中的假突破呢?为什么假突破会有效呢?下面我们就来讨…