Docker + FlaskでWebサービスを作成する
はじめに
サンプルアプリ(feedback-api)を用いてご紹介します。
Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。
目的
この記事を最後まで読むと、次のことができるようになります。
No. | 概要 | キーワード |
---|---|---|
1 | docker設定 | install, Dockerfile, docker-compose.yml |
2 | docker起動 | docker run, docker-compose up |
実行環境
環境 | Ver. |
---|---|
macOS Catalina | 10.15.3 |
Python | 3.7.3 |
Docker | 19.03.8 |
ソースコード
実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。
関連する記事
0. 開発環境
tree.sh
/
│── config/
├── app/
└── Dockerfiles/
├── app/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ └── entrypoint.sh
├── docker_compose_up.sh
└── docker_run.sh
1. dockerのインストール
command_line.sh
~$ brew install docker
~$ brew cask install docker
2. 共通定義
2-1. Dockerfile定義
FROM python:3.7
RUN mkdir /code
WORKDIR /code
ADD entrypoint.sh /code/entrypoint.sh
ADD app/ /code
RUN pip install --upgrade pip --no-cache-dir
RUN pip install -r requirements.txt --no-cache-dir
EXPOSE 5000
ENV PYTHONPATH "${PYTHONPATH}:/code/"
ENV FLASK_APP "/code/run.py"
CMD ["/code/entrypoint.sh"]
2-2. entrypoint定義
Dockerfiles/app/entrypoint.sh
#!/bin/sh
sleep 5
flask db init
flask db migrate
flask db upgrade
flask run --host=0.0.0.0 --port=5000
3. ローカルホストのRDBと接続する場合
docker(flask) <-> localhost(postgres)
3-0. 前提条件
localhostでpostgresをstart
しておくこと。
3-1. sh定義
Dockerfiles/docker_run.sh
#!/bin/sh
docker stop $(docker ps -q)
docker rm $(docker ps -q -a)
# docker rmi $(docker images -q) -f
rsync -av --exclude=app/tests* app Dockerfiles/app
docker build -t feedback-api Dockerfiles/app
docker run -it -p 5000:5000 feedback-api:latest
3-2. sh実行
command_line.sh
Dockerfiles/docker_run.sh
4. コンテナのRDBと接続する場合
docker(flask) <-> docker(postgres)
4-0. 前提条件
localhostのpostgresをstop
しておくこと。
4-1. sh定義
Dockerfiles/docker_compose_up.sh
#!/bin/sh
docker stop $(docker ps -q)
docker rm $(docker ps -q -a)
# docker rmi $(docker images -q) -f
rsync -av --exclude=app/tests* app Dockerfiles/app
docker-compose -f Dockerfiles/app/docker-compose.yml up --build
4-2. yml定義
Dockerfiles/app/docker-compose.yml
version: '3'
services:
docker_postgres:
image: postgres:11.5
ports:
- 5432:5432
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: feedback
POSTGRES_INITDB_ARGS: --encoding=UTF-8
app:
build: .
depends_on:
- docker_postgres
ports:
- 5000:5000
environment:
ENV_CONFIG: docker
SQLALCHEMY_POOL_SIZE: 5
SQLALCHEMY_MAX_OVERFLOW: 10
SQLALCHEMY_POOL_TIMEOUT: 30
4-3. sh実行
command_line.sh
Dockerfiles/docker_compose_up.sh