一直想把面板从宝塔换成 1Panel,担心宝塔有后台,而且老是跳出来要绑定服务器,实在是太麻烦了。因为每隔几天就换了 IP,都需要重新绑定。但是 1Panel 一直未支持 Python,所以搁置了很久。最近注意到可以使用 Docker 部署 Python 项目,虽然稍微麻烦点,但是基本上部署之后不会再动了,还能接受。
下面是一个简单的 Flask 应用,以及项目的目录结构,文件位于 /opt/1panel/docker/compose/flask-server。以下内容请根据实际的项目进行更改。
1 2 3 4 5 6 7 8 9
|
from flask import Flask
app = Flask(__name__)
@app.route("/") def hello_world(): return "<p>Hello, World!</p>"
|
1 2 3 4 5
| │ ├─flask-server │ ├─app │ │ ├─app.py │ │ ├─requirements.txt
|
需要注意的是,请在 requirements.txt 中增加两个包:gunicorn
和 gevent
。
然后,在 flask_server 文件夹中新建 Dockerfile
文件,示例内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| FROM python:3.9-alpine
WORKDIR /app
COPY ./app /app
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txt
CMD gunicorn app:app -b :5000 -k gevent --log-level info
|
接着,在 容器 -> 编排模板
中创建新的编排模板,名字可自定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| version: '3' services: # 容器服务名称 flask-server: # 容器名称 container_name: flask-server build: #在当前目录下寻找Dockerfile文件并构建镜像 context: . dockerfile: Dockerfile # 重启策略 restart: always # 使用1Panel的网络方便容器间通信 networks: - 1panel-network # 挂载目录 本地化容器数据 # 这里挂载了本地当前目录的app目录到容器的/app目录 volumes: - ./app:/app # 端口映射 容器端口映射到主机端口 ports: - "5000:5000" networks: 1panel-network: external: true
|
最后,到 编排
中创建编排,选择使用编排模板。请注意,文件夹名称一定要与项目文件夹一致,比如这里需要设置成 flask-server
点击确认按钮,等待完成。如果最后提示docker-compose up successful!
,访问 IP:端口号 即可看到 Hello, World! 的内容。