主博客目录:《从零开始学习搭建量化平台笔记》
主项目计划需要搭建一个 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 Flask
app = 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: true
services:
nginx:
image: nginx
container_name: nginx
ports:
- "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.d
privileged: true
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
restart: always
logging:
driver: json-file
options:
max-size: "20m" # 单个文件大小为20m
max-file: "2" # 最多2个文件
networks:
my-bridge:
ipv4_address: 171.171.0.2
redis:
image: redis
container_name: redis
volumes:
- redis-data:/data
environment:
- TZ=Asia/Shanghai
restart: always
logging:
driver: json-file
options:
max-size: "20m" # 单个文件大小为20m
max-file: "2" # 最多2个文件
networks:
my-bridge:
ipv4_address: 171.171.0.3
flask:
build: /Flask
container_name: flask
ports:
- "5000:5000"
volumes:
- /Flask/code:/code
- /Flask/logs:/logs
environment:
- TZ=Asia/Shanghai
depends_on:
- redis
restart: always
logging:
driver: json-file
options:
max-size: "20m" # 单个文件大小为20m
max-file: "2" # 最多2个文件
networks:
my-bridge:
ipv4_address: 171.171.0.12
volumes:
redis-data:
driver: local
至此开放服务器防护墙 80 端口,外网即可访问网页,并显示 Hello World
。