Flask-nginx in Docker

使用两个容器 部署 Flask

Flask/uWSGI nginx的基础使用可以看这里

docker 配置

容器拉取

sudo docker pull git4docker/flask nginx:alpine

git4docker/flask的Dockerfileopen in new window

因为需要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

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

主要就是写一个配置文件

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

容器启动

#!/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

容器启动时的容器名配置是必须的

一些小提示

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

拉取镜像 docker compose pull

启动服务 docker compose up(前台启动 可以查看日志) 或者 docker compose up -d(daemon后台启动)

参考