四时宝库

程序员的知识宝库

「Docker」 如何使用docker创建一个Flask运行环境

第1步

创建一个叫docker_flask的目录并进入这个目录。下面的所有步骤都是在这个docker_flask目录里进行。

$ mkdir docker_flask
$ cd docker_flask

第2步

# 查看当前目录
decisionmaker@tdar-srv:~/examples/docker_flask$ pwd
/home/decisionmaker/examples/docker_flask

# 在当前目录下,创建一个叫init.sh的脚本,写入以下命令
decisionmaker@tdar-srv:~/examples/docker_flask$ vi init.sh 
mkdir -p code/
mkdir -p config/nginx/
touch config/nginx/learn_flask.conf
touch docker-compose.yml
touch Dockerfile_web
touch code/requirements.txt
touch code/app.py

# 在当前目录下,执行init.sh生成基本的目录和文件结构
decisionmaker@tdar-srv:~/examples/docker_flask$ sh init.sh

# 最后,列出当前目录下生成的目录和文件
decisionmaker@tdar-srv:~/examples/docker_flask$ tree
.
├── code
│   ├── app.py
│   ├── __pycache__
│   │   └── app.cpython-39.pyc
│   └── requirements.txt
├── config
│   └── nginx
│       └── learn_flask.conf
├── docker-compose.yml
├── Dockerfile_web
└── init.sh

4 directories, 7 files

第3步

在当前目录下,执行vi Dockerfile_web命令,添加以下内容:

FROM python:3.9-alpine
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code

RUN apk add --update --no-cache g++ gcc libxslt-dev musl-dev linux-headers postgresql-libs postgresql-dev mariadb-dev
RUN apk add --update libxml2-dev libffi-dev gcc musl-dev libgcc openssl-dev curl jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev

RUN apk add --update vim
RUN apk add --update tzdata
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

COPY ./code .

RUN python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

RUN adduser -D -g '' www

# ENV FLASK_APP app.py
# ENV FLASK_RUN_HOST 0.0.0.0
# ENV FLASK_RUN_PORT 9000
# ENV FLASK_ENV development
# CMD ["flask", "run"]

第4步

在当前目录下,执行vi docker-compose.yml命令,添加以下内容(nginx容器暂时用不到,先配置好,以备将来的不时之需):

version: '3'

networks:
    network:
        ipam:
            driver: default
            config:
                - subnet: '192.168.89.0/24'

services:
    nginx:
        networks:
            network:
                ipv4_address: 192.168.89.11
        image: nginx:latest
        ports:
            - "9092:9092"
        volumes:
            - ./config/nginx/learn_flask.conf:/etc/nginx/conf.d/000_learn_flask.conf
    web:
        networks:
            network:
                ipv4_address: 192.168.89.12
        build:
            context: ./
            dockerfile: ./Dockerfile_web
        # command: uwsgi uwsgi.ini
        command: python app.py
        depends_on:
            - db
            - cache
        volumes:
            - ./code:/code
        ports:
            - "9093:9093"
    db:
        networks:
            network:
                ipv4_address: 192.168.89.13
        image: mysql
        ports:
            - "13307:3306"
        volumes:
            - mysql_data:/var/lib/mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: learn_flask
            MYSQL_USER: learn_flask
            MYSQL_PASSWORD: 123456
        command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-authentication-plugin=mysql_native_password', '--max_allowed_packet=32505856']
        cap_add:
            - SYS_NICE  # solve mbind: Operation not permitted
    cache:
        networks:
            network:
                ipv4_address: 192.168.89.14
        image: redis
        # command: redis-server --requirepass 123456
        ports:
            - "16380:6379"
        volumes:
            - redis_data:/data
volumes:  
    mysql_data:
    redis_data:

第5步

在当前目录下,执行vi code/app.py命令,添加以下内容

import time
import redis
from flask import Flask

app = Flask(__name__)


REDIS_HOST = "192.168.89.14"
REDIS_PORT = 6379
# REDIS_PASSWORD = "123456"
cache = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return '当前页面已被点击 {} 次.\n'.format(count)

@app.route('/test')
def test():
    return 'Test --------------------------------------------------'


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=9093, debug=True)

第6步

在当前目录下,执行vi code/requirements.txt命令,添加以下内容:

redis
mysqlclient
pgsql
# psycopg2
pymongo
requests
urllib3
httpie
lxml
python-dateutil
pytz
gunicorn
uwsgi
supervisor
django
flask
SQLAlchemy
Flask-SQLAlchemy
tornado
Jinja2
simplejson
django-simpleui
djangorestframework
django-cors-headers
django-compressor
django-mdeditor
beautifulsoup4
django-modeladmin-reorder
Markdown
casbin
Pillow

第7步:在当前目录下,执行docker-compose build

decisionmaker@tdar-srv:~/examples/docker_flask$ sudo docker-compose build

第8步:在当前目录下,执行docker-compose up

decisionmaker@tdar-srv:~/examples/docker_flask$ sudo docker-compose up

第9步

打开浏览器,输入网址:http://127.0.0.1:9093/,查看结果:

第10步:在当前目录下,执行docker-compose down销毁容器

decisionmaker@tdar-srv:~/examples/docker_flask$ sudo docker-compose down

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接