Docker + Python + FlaskでAPIサーバーを構築してみる

はじめまして。ウナルスの斉藤です。 皆さん、Docker使いましたか?

はじめまして。ウナルスの斉藤です。

皆さん、Docker使いましたか?

前回のブログでDockerの紹介がありましたので、
今回はDockerを利用しつつ、PythonWebAPIを作成したいと思います。
構成は Ubuntu + Docker + Apache + Flaskです。

FlaskはURLのルーティング 機能を備えていますので、
例えばモバイルアプリ+WebAPIといった構成でも使いやすいかなと思います。


前提

・Docker, Docker Compose がインストール済みであること

はじめよう!

今回用意するファイルはこちらです。ホストOSのUbuntuに配置します。
myappは任意のアプリ名

・docker-compose.yml
・DockerFile
・ /myapp/myapp.py
・ /myapp/app.wsgi
・ /apache2/sites-available/000-default.conf


まずは、Flask + Pythonのメイン処理を用意します。
@app.route() で /hello と /func の処理を振り分けるようにします。

from flask import Flask

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

@app.route('/hello')
def hello():
    return 'Welcome! MyApp!'

@app.route('/func')
def func():
    return 'Welcome! MyFunction!'

次に、wsgiファイルを用意します。最終行でmyapp.pyを読み込んでいます。
ちなみにホストOSのユーザーはvagrantとしています。

import sys
sys.path.insert(0, '/usr/local/lib/python3.8/site-packages')
sys.path.insert(0, '/home/vagrant/myapp')

import os
# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))

from myapp import app as application

Apacheのwsgi設定を準備します。これから構築するDocker用ファイルなので、
ホストOSのApacheファイルを変更しないよう注意してください。

<VirtualHost *:80>
    ...
    WSGIDaemonProcess myapp processes=1 threads=5 python-path="/usr/local/bin/python3"
    WSGIScriptAlias / /home/vagrant/myapp/app.wsgi

    <Directory /home/vagrant/myapp>
        WSGIProcessGroup myapp
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Directory>    
</VirtualHost>

今回はDocker Composeを使用していますので、
docker-compose.yml に起動するコンテナの情報を記述し、
DockerFileに 必要なライブラリのインストールなどの初期処理を記述します。

version: '2'
services:
  app:
    container_name: myapp-flask-app
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./myapp:/home/vagrant/myapp
# Pythonは公式イメージ
FROM python:3.8.0

# 各ライブラリインストール
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y 	vim sudo apache2 libapache2-mod-wsgi-py3	

RUN pip3 install Flask

# default.confを修正
RUN rm /etc/apache2/sites-available/000-default.conf
COPY ./apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf

# default.confを修正
COPY ./myapp /home/vagrant/myapp

# Apache起動
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]

ホストOSのUbuntuのDocker ComposeでDockerのコンテナを起動します。

sudo docker-compose up -d

これでサーバー起動されますので、URLにアクセスすると、
/hello → Welcome! MyApp!
/func → Welcome! MyFunction!
と処理が振り分けられていることを確認できます。


まとめ

テスト環境などお手軽なAPIサーバーを用意したいときに便利です。
また今回は Docker Compose  を使用しましたので、開発チーム内で同じ開発環境を準備するのも簡単ですね。
いろいろと活用したいと思います。

コメントを残す

メールアドレスが公開されることはありません。