第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