docker-compose 简单部署Flask + Redis + Nginx环境搭建网站
主博客目录:《从零开始学习搭建量化平台笔记》

主项目计划需要搭建一个 Flask + Redis + Nginx环境 来制作一个可视化的网站,为了避免搭完就忘,因此就有了这个博客。
任务:搭建一个内网通信且只有由Nginx代理发放的网页端显示环境。
- 默认已经安装好了 Docker 与 docker-compose。若未安装,可点击链接。
- 拉取 Flask, Redis, Nginx 所需镜像:
# 拉取 Flask 依赖镜像 Python
sudo docker pull python# 拉取 Redis
sudo docker pull redis# 拉取 Nginx
sudo docker pull nginx
- 生成Flask 初始化所需文件与文件夹:
mkdir code
touch requirements.txt
touch code/runserver.py
touch Dockerfile
requirements.txt 内写需要依赖的库:
# 环境依赖包
redis
flask
gevent# SQL 依赖包
flask-sqlalchemy
pymysql
cryptography
编写 Flask 运行脚本 code/runserver.py:
"""
此脚本使用pywsgi代理
"""
import time
from gevent import pywsgi
from flask import Flaskapp = Flask(__name__)# 编写网页 主页与home
@app.route("/")
@app.route("/home")
def home():return "Hello World\n"# 运行模式为发布模式
server = pywsgi.WSGIServer(("0.0.0.0", 5000), app)
server.serve_forever()# 此为开发模式
# app.run(debug=True, host="0.0.0.0", port=5000)
编写 Flask 部署 Dockerfile 文件:
# 使用 Python 最新版本镜像作为基础镜像
FROM python# 设置工作目录
COPY "./code" "/code"
WORKDIR /code# 设置默认开始脚本
ENV FLASK_APP=runserver.py
ENV FLASK_RUN_HOST=0.0.0.0
EXPOSE 5000# 安装依赖 加速使用清华源
RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple/
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/# 默认运行命令
CMD ["flask", "run"]
- 生成 Nginx 初始化所需文件与文件夹:
# 创建文件夹
mkdir cert html logs www
# 赋予权限
chmod 777 -R cert html logs www
# 生成配置文件
touch nginx.conf
Nginx 配置文件 nginx.conf:
worker_processes 1;
events {worker_connections 1024;
}
http {include /etc/nginx/mime.types;server {listen 80;server_name localhost;location / {# 代理内网proxy_pass http://171.171.0.12:5000;proxy_redirect off;proxy_set_header Host $host:80;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;## 如果是静态网站这么写#root /usr/share/nginx/html;#index index.html index.htm;}}access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;
}
- 创建网桥 bridge,内网桥接各个dockers,并指定网关
# 列出已有docker网络
sudo docker network ls
# 添加网桥 名称 my-bridge 网关 171.171.0.1 掩码 171.171.0.0/24
sudo docker network create --driver bridge --subnet=171.171.0.0/24 --gateway 171.171.0.1 my-bridge
# 查看是否添加成功
sudo docker network ls
# 查看细节
sudo docker network inspect my-bridge
- 编写 docker-compose.yml, 需注意缩进。
version: '3'networks:my-bridge:external: trueservices:nginx:image: nginxcontainer_name: nginxports:- "80:80"volumes:- /Nginx/html:/usr/share/nginx/html- /Nginx/www:/var/www- /Nginx/logs:/var/log/nginx# 有可能会出现不能挂载,这个时候用手动拷贝配置文件就行- /Nginx/nginx.conf/:/etc/nginx/nginx.conf- /Nginx/cert:/etc/nginx/cert- /Nginx/conf.d:/etc/nginx/conf.dprivileged: trueenvironment:- NGINX_PORT=80- TZ=Asia/Shanghairestart: alwayslogging:driver: json-fileoptions:max-size: "20m" # 单个文件大小为20mmax-file: "2" # 最多2个文件networks:my-bridge:ipv4_address: 171.171.0.2redis:image: rediscontainer_name: redisvolumes:- redis-data:/dataenvironment:- TZ=Asia/Shanghairestart: alwayslogging:driver: json-fileoptions:max-size: "20m" # 单个文件大小为20mmax-file: "2" # 最多2个文件networks:my-bridge:ipv4_address: 171.171.0.3flask:build: /Flaskcontainer_name: flaskports:- "5000:5000"volumes:- /Flask/code:/code- /Flask/logs:/logsenvironment:- TZ=Asia/Shanghaidepends_on:- redisrestart: alwayslogging:driver: json-fileoptions:max-size: "20m" # 单个文件大小为20mmax-file: "2" # 最多2个文件networks:my-bridge:ipv4_address: 171.171.0.12volumes:redis-data:driver: local
至此开放服务器防护墙 80 端口,外网即可访问网页,并显示 Hello World。
相关文章:
docker-compose 简单部署Flask + Redis + Nginx环境搭建网站
主博客目录:《从零开始学习搭建量化平台笔记》 主项目计划需要搭建一个 Flask Redis Nginx环境 来制作一个可视化的网站,为了避免搭完就忘,因此就有了这个博客。 任务:搭建一个内网通信且只有由Nginx代理发放的网页端显示环境。…...
debian和ubuntu
Debian和Ubuntu是两种流行的Linux发行版,它们之间有密切的关系,但也存在一些重要的区别。 关系: Ubuntu是基于Debian创建的。这意味着Ubuntu使用与Debian相同的APT包管理系统,并共享来自Debian库中的大量包和库。 区别…...
恒驰服务 | 华为云数据使能专家服务offering之数仓建设
恒驰大数据服务主要针对客户在进行智能数据迁移的过程中,存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题,通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容,支撑客户实现快速稳定上云,有效降低时间成本…...
AI与Prompt:解锁软件开发团队的魔法咒语,在复杂任务上生成正确率更高的代码
AI与Prompt:解锁软件开发团队的魔法咒语 写在最前面论文:基于ChatGPT的自协作代码生成将团队协作理论应用于代码生成的研究自协作框架原理1、DOL任务分配2、共享黑板协作3、Instance实例化 案例说明简单任务:基本操作,生成的结果1…...
深度学习02-数据集格式转换
背景: 通常搜集完数据图片后,我们会用labelimg进行图片标注,比较高版本的labelimg支持的标注格式有三种,PascalVOC、YOLO、CreateML,标注的时候可以根据自己的算法模型数据集需求选择相应的格式,当然&…...
【c++|opencv】一、基础操作---1.图像读取
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 有关c操作opencv记录 1. 正文 1.1 图像读取、显示、保存 // 读取、显示、保存图像#include <opencv2/opencv.hpp> #include <iostream>us…...
【2023.10.30练习】C语言-循环右移字符
计算机能力挑战初赛2020.19题 题目描述: 现要对一个由字符a-z和A-Z组成的字符串进行解密,已知加密规则是: 字符串中所有字符分别在大写或小写的字母表中被循环左移5位(fGh-->aBc), 输入:一个加密过的字符串&#…...
C++ 自引用指针this(整理)
使用例子: #include <iostream> #include <Windows.h> using namespace std; class A { public:A(int x1){x x1;}void disp(){cout<<"this"<<this<<" when x"<<this->x<<endl;} private:int x;…...
pyzed.sl 突然 ImportError: DLL load failed while importing sl: 找不到指定的程序。 的解决
问题描述 >>> import pyzed.sl Traceback (most recent call last):File "<stdin>", line 1, in <module> ImportError: DLL load failed while importing sl: 找不到指定的程序。解决 1 按网上说的,将bin文件夹下所有dll复制到py…...
STM32 Cube配置RS485 Modbus
STM32CUBUMX配置RS485 modbus STM32(从机)亲测可用 STM32开发(六)STM32F103 通信 —— RS485 Modbus通信编程详解...
global,nonlocal
1.global 在局部,引入全局变量,使得局部变量可以修改全局变量 a 10 # a为全局变量def func():global a #把外面的全局变量引入到局部a 20 #创建局部变量,修改全局变量func() print(a) #20 2.nonlocal 在局部,引入外层的…...
HTML5教程
HTML5读书笔记 jack 2023.10.24 来源:HTML5 Canvas | 菜鸟教程 常识: HTML5 是下一代 HTML 标准。 HTML , HTML 4.01的上一个版本诞生于 1999 年 <!DOCTYPE html>用于声明下面代码是H5; 浏览器支持 你可以让一些较早的浏览器(不支…...
vulnhub momentum 靶机复盘
环境配置 到学校了 原来的桥接配置要改 这里记录几个点备忘 1.virtualbox 桥接 未指定 重新安装驱动VBoxNetLwf.inf 2.配置完靶机启动失败 手动安装VBoxNetLwf.inf 不要用virtualbox自带的netlwfinstall 3.配置完nmap扫不到 rw init/bin/bash 进去看看网卡配置 信息收集…...
c++和java实现策略模式的差异
一、C和java的差异 实例化方式 c的对象有两种实例化方式,一种是局部变量中直接实例化。一种是new出来的。 MyClass myclass; //第一种方式 MyClass* myclassPtrnew MyClass(); //第二种方式java的对象构建,没有第一种方式,java的对象都…...
vim
简介 vim是一款多模式的文本编辑器,vim里面还有很多子命令,来进行代码的编写操作 常用模式图 命令模式 光标移动 shif $ 光标定义到当前行的最右侧结尾 shift ^ 光标定义到当前行的最左侧开头 shift g 光标定位到文本最末尾…...
AcWing93. 递归实现组合型枚举:输出从1~n中随机选出的m个整数
题目 从 1∼ n n n 这 n n n 个整数中随机选出 m m m 个,输出所有可能的选择方案。 输入格式 两个整数 n , m , n,m, n,m, 在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案,每行 1 个。 首先,同一行内的数升序排列&a…...
Java修仙传之Flink篇
大道三千:最近我修Flink 目前个人理解: 处理有界,无界流的工具 FLINK: FLINK定义: Flink特点 Flink分层API 流的定义 有界数据流(批处理): 有界流:数据结束了,程序也…...
网络新闻发稿为何经久不衰?
有的老板可能看不到新闻营销的直接回报,一直不乐意在此方面投入,但是却看到竞争对手一直在搞新闻营销,也就安排个PR做做新闻公关。小马识途营销顾问观察,自互联网诞生以来,新闻营销一直是网络营销工作中的一个重点。 如…...
Java SimpleDateFormat 中英文时间格式化转换
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。 SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式。但是&…...
机器学习-基本知识
任务类型 ◼ 有监督学习(Supervised Learning) 每个训练样本x有人为标注的目标t,学习的目标是发现x到t的映射,如分类、回归。 ◼ 无监督学习(Unsupervised Learning) 学习样本没有人为标注,学习的目的是发现数据x本身的分布规律…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
