Flask-nginx in Docker
使用两个容器 部署 Flask
Flask/uWSGI nginx的基础使用可以看这里
docker 配置
因为需要nginx反向代理uwsgi
所以需要nginx知道Flask容器的地址
在不使用 Docker Compose
和 K8S 的情况下 可以用两种方式让nginx容器知道Flask容器的存在
- run --link: 启动nginx的时候将flask容器link入nginx容器中
- docker network: 配置一个 nginx 和 flask 共用的桥接网络
docker network create __your_network_name__
默认使用桥接(Bridge)网络 即 create -d bridge
本文中创建的网络为
backend
uwsgi 配置
[uwsgi]
socket =:5000
stats =:9191
chdir = /flask
wsgi-file = app.py
callable = app
processes = 1
threads = 2
pidfile = uwsgi.pid
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
uwsgi 配置对比
对比正常使用的代码 少了daemonize = uwsgi.log
nginx 配置
upstream flask_server{
server flask:5000;
}
server {
listen 80;
server_name ngx;
charset utf-8;
location / {
uwsgi_pass flask_server;
include uwsgi_params;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
主要就是写一个配置文件
nginx配置
alpine
nginx 的 nginx.conf
里面默认include /etc/nginx/conf.d/*.conf
项目结构
.
├── flask
│ ├── app.py
│ ├── uwsgi.ini
├── ngx
│ └── flask.conf
└── run.sh
1
2
3
4
5
6
7
2
3
4
5
6
7
容器启动
#!/bin/bash
sudo docker run --network backend \
--rm -itd -v $(pwd)/flask:/flask \
--name flask flask uwsgi /flask/uwsgi.ini
sudo docker run --network backend \
--rm -d -v $(pwd)/ngx:/etc/nginx/conf.d \
--name ngx -p 8000:80 nginx:alpine nginx -g 'daemon off;'
1
2
3
4
5
6
7
2
3
4
5
6
7
容器启动时的容器名配置是必须的
一些小提示
flask 容器的容器名可以修改 不过需要保证 docker run
时的name和 nginx upstream
中配置的相同
nginx 容器必须前台启动
使用 docker compose
compose 配置文件
version: '3'
services:
flask:
container_name: flask
image: "git4docker/flask:backend"
volumes:
- "./flask:/flask"
nginx:
image: "nginx:alpine"
ports:
- "8000:80"
volumes:
- "./ngx:/etc/nginx/conf.d"
command: "nginx -g 'daemon off;'"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
拉取镜像 docker compose pull
启动服务 docker compose up
(前台启动 可以查看日志) 或者 docker compose up -d
(daemon后台启动)