包含多个不同进程以及复杂依赖的Flask项目示例
大约 3 分钟
包含多个不同进程以及复杂依赖的Flask项目示例
这个示例演示了如何使用 supervisord
来管理一个包含多个不同进程以及复杂依赖的Flask项目。
为了编写一个包含 Redis
、MySQL
、Nginx
和 Python
的 Dockerfile
,我们可以参考一个常见的 Web 应用项目,例如一个基于 Flask 的应用。这个项目将会使用 Redis 作为缓存,MySQL 作为数据库,Nginx 作为反向代理服务器。
编写主进程 app.py
from flask import Flask
import redis
import mysql.connector
app = Flask(__name__)
# Redis 配置
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
# MySQL 配置
mysql_config = {
'user': 'yourusername',
'password': 'yourpassword',
'host': 'localhost',
'database': 'yourdatabase',
}
@app.route('/')
def hello_world():
# 示例 Redis 操作
redis_client.set('key', 'value')
value = redis_client.get('key')
# 示例 MySQL 操作
conn = mysql.connector.connect(**mysql_config)
cursor = conn.cursor()
cursor.execute('SELECT * FROM your_table')
result = cursor.fetchall()
return f'Redis value: {value}, MySQL result: {result}'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
编写子进程 checker.py
import time
import mysql.connector
from datetime import datetime
# MySQL 配置
mysql_config = {
'user': 'yourusername',
'password': 'yourpassword',
'host': 'localhost',
'database': 'yourdatabase',
}
def check_database():
conn = mysql.connector.connect(**mysql_config)
cursor = conn.cursor()
cursor.execute('SELECT * FROM your_table')
result = cursor.fetchall()
print(f"Database check at {datetime.now()}: {result}")
cursor.close()
conn.close()
if __name__ == '__main__':
while True:
check_database()
time.sleep(60) # 每隔60秒检查一次
编写pip环境 requirements.txt
flask
redis
mysql-connector-python
编写nginx配置文件 nginx.conf
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
编写mysql配置文件 mysql.cnf
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
default_authentication_plugin=mysql_native_password
编写supervisord配置文件 supervisord.conf
提示
为了确保主进程和子进程的稳定运行,并在发生错误时自动重启,我们将使用 supervisor
来管理这些进程。 supervisor
是一个进程控制系统,它可以监视和自动重启进程。
[supervisord]
nodaemon=true
[program:mysql]
command=mysqld_safe
autorestart=true
priority=1
[program:nginx]
command=nginx -g 'daemon off;'
autorestart=true
priority=2
[program:redis]
command=redis-server
autorestart=true
priority=3
[program:flask_app]
command=python /app/app.py
autorestart=true
priority=4
[program:checker]
command=python /app/checker.py
autorestart=true
priority=5
编写启动脚本 entrypoint.sh
#!/bin/bash
# 初始化 MySQL 数据库和用户(第一次运行时)
if [ ! -d /var/lib/mysql/yourdatabase ]; then
service mysql start
mysql -u root -e "CREATE DATABASE yourdatabase;"
mysql -u root -e "CREATE USER 'yourusername'@'%' IDENTIFIED BY 'yourpassword';"
mysql -u root -e "GRANT ALL PRIVILEGES ON yourdatabase.* TO 'yourusername'@'%';"
mysql -u root -e "FLUSH PRIVILEGES;"
service mysql stop
fi
# 启动 Supervisor
exec supervisord -c /etc/supervisor/conf.d/supervisord.conf
编写Dockerfile
# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim
# 设置环境变量
ENV PYTHONUNBUFFERED 1
# 安装系统依赖和 supervisor
RUN apt-get update && apt-get install -y \
nginx \
default-mysql-server \
redis-server \
supervisor \
&& rm -rf /var/lib/apt/lists/*
# 安装 Python 依赖
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
# 复制应用代码
COPY . /app
# 设置工作目录
WORKDIR /app
# 配置 Nginx
COPY nginx.conf /etc/nginx/nginx.conf
# MySQL 配置
COPY my.cnf /etc/mysql/my.cnf
# Supervisor 配置
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 暴露端口
EXPOSE 80
# 启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# 运行启动脚本
CMD ["/entrypoint.sh"]
构建 Docker 镜像
确保你在包含 Dockerfile 和相关文件的目录中,然后运行以下命令构建 Docker 镜像:
docker build -t my_app_image .
运行 Docker 容器
构建完成后,运行以下命令启动容器:
docker run -d -p 80:80 --name my_app_container my_app_image
测试是否运行成功
打开浏览器,访问 http://服务器IP
你应该会看到由 Flask 应用返回的内容。