はじめまして。ウナルスの斉藤です。 皆さん、Docker使いましたか?
はじめまして。ウナルスの斉藤です。
皆さん、Docker使いましたか?
前回のブログでDockerの紹介がありましたので、
今回はDockerを利用しつつ、PythonでWebAPIを作成したいと思います。
構成は 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 を使用しましたので、開発チーム内で同じ開発環境を準備するのも簡単ですね。
いろいろと活用したいと思います。