第一篇:服务器 Docker搭建Flask应用(一) ,没带数据库MySQL。如果是用python自带的 sqlite的话,就比较简单,直接反正就一个数据库文件。
如果要用MySQL的话,就麻烦点。
比如我自己装了一台Ubuntu20.04LTS作小服务器,并没有安装MySQL,然后反正装了Docker,倒也是没啥大关系,用个MySQL的镜像,创建容器就能用了。
一、制作Flask项目镜像(本地) 1.项目结构(样例) 1 2 3 4 5 6 7 8 9 10 flask_demo ├── app │ ├── templates │ └── index.html │ ├── app.py │ ├── Dockerfile │ └── requirements.txt ├── db_data │ └── init.sql └── docker-compose.yml
其中:Dockerfile、requirements.txt、docker-compose.yml文件都是后面创建的。
2.生成 requirements.txt 进入flask_demo\app
目录下,运行如下命令,就可以生成项目环境的 requirements.txt 文件。
1 pip freeze > requirements.txt
requirements.txt 举例 :
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 28 29 30 31 32 cffi==1.15.1 click==8.1.3 colorama==0.4.6 et-xmlfile==1.1.0 Flask==2.2.2 Flask-SQLAlchemy==3.0.2 Flask-WTF==1.0.1 gevent==22.10.2 greenlet==2.0.1 importlib-metadata==5.2.0 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.1 mysqlclient==2.1.1 numpy==1.24.1 openpyxl==3.0.10 pandas==1.5.2 prettytable==3.6.0 pycparser==2.21 pyecharts==2.0.1 PyMySQL==1.0.2 python-dateutil==2.8.2 pytz==2022.7 simplejson==3.18.1 six==1.16.0 SQLAlchemy==1.4.45 wcwidth==0.2.5 Werkzeug==2.2.2 WTForms==3.0.1 zipp==3.11.0 zope.event==4.6 zope.interface==5.5.2
我安装的库就是这些:pip install flask, flask_wtf, flask_sqlalchemy, pymysql, mysqlclient, pandas, openpyxl, gevent, pyecharts
3.用Dockerfile 文件创建镜像 注意一下,我这个Dockerfile文件只是建立一个初步的环境,后期是可以修改里面的python文件,最后在容器里运行python文件的。所以没把整个项目代码都copy进去。
Dockerfile文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # Use an official Python runtime as an image FROM python:3.9 # Sets the working directory for following COPY and CMD instructions # Notice we haven’t created a directory by this name - this instruction # creates a directory with this name if it doesn’t exist WORKDIR /app # copy code # COPY . /app COPY requirements.txt /app # RUN python -m pip install --upgrade pip # RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org --no-cache-dir -r requirements.txt RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt # The EXPOSE instruction indicates the ports on which a container EXPOSE 5002 # Run app.py when the container launches COPY app.py /app # CMD python app.py
EXPOSE 5020
:这里需要改成你自己设置的端口号。Flask一般默认用5000。别的可以啥也不用改。
然后,把app目录中的文件上传到服务器上,比如上传至 flask_demo目录。可以直接用Xftp上传。 (app目录下只需要:Dockerfile、requirements.txt、app.py文件就行)
然后SSH连接服务器,进入到app 目录,运行以下命令生成镜像:
1 docker build -t flask_demo:1.0 .
-t 设置镜像名字和版本号 最后有个点不要漏了,表示当前目录路径
执行完,就可以用命令 docker images
看到以下镜像了(当然也有python3.9的镜像)。
二、创建Flask项目容器(服务器) 根据刚创建的镜像:flask_demo:1.0 创建一个容器。
因为还涉及到MySQL,所以这里用docker-compose的方法,docker-compose的介绍看这里:Docker-Compose详解
先在 flask_demo目录下创建个 docker_app 目录,作来做映射需要的。
1.docker-compose.yml文件 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 28 29 30 31 version: "3" services: app: image: flask_demo:1.0 container_name: my_flask_demo tty: true ports: - "5002:5002" - "5522:22" volumes: - ./docker_app:/app environment: MYSQL_HOST: db MYSQL_USER: root MYSQL_ROOT_PASSWORD: 123MYSQL321 MYSQL_DATABASE: flask_demo_mysql db: image: mysql:8.0 container_name: my_flask_demo_db restart: always ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: 123MYSQL321 MYSQL_DATABASE: flask_demo_mysql volumes: - ./db_data:/docker-entrypoint-initdb.d/:ro volumes: app: db:
因为在app中用 restart: always 创建容器后会一直Restarting,所以用了 tty: true
db_data/init.sql 文件:
1 2 3 drop database flask_demo_mysql;create database flask_demo_mysql;use flask_demo_mysql;
2.部署Compose应用 docker-compose命令就在有 docker-compose.yml文件的目录下执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker-compose up -d docker-compose ps docker ps -a docker-compose stop docker-compose restart docker-compose down
3.把app目录下的所有文件复制到docker_app目录中
cp -r app docker_app/ :表示将app目录及其目录下所有文件复制到docker_app目录下,就会有 docker_app/app目录
cp -r app/. docker_app/ :表示将app目录下所有文件复制到docker_app目录下,不包括app目录
以后要改容器中的代码,就直接改这个目录下的代码就行了。
三、后台一直运行app.py 这个用nohup
命令,有文章写过介绍了:Linux nohup 后台运行 命令详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker exec -it my_flask_demo /bin/bash nohup python3 -u app.py > /dev/null 2>&1 & ps -aux | grep "app.py" kill [PID]exit
四、MySQL 看 docker-compose.yml文件内容:
1 2 3 4 5 6 MYSQL_USER: root MYSQL_ROOT_PASSWORD: 123MYSQL321 MYSQL_DATABASE: flask_demo_mysql "3307:3306"
所以在Flask使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 mysql_host = '192.168.1.121' mysql_user = 'root' mysql_passwd = '123MYSQL321' mysql_db = 'flask_demo_mysql' mysql_port = 3307 DATABASE_URI = 'mysql://' + mysql_user + ':' + mysql_passwd + '@' + mysql_host + ':' + str (mysql_port) + '/' + mysql_db app.config['SQLALCHEMY_DATABASE_URI' ] = DATABASE_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False db = SQLAlchemy(app)