Dockerで Python + Flask の開発環境を作成してみました



Dockerの使い方を学ぶために、Flaskの簡易WebアプリケーションをDockerコンテナで立ち上げてみました。


*環境

  • MacOS
  • Python 3.7
  • Flask 1.0.2


*参考



*Dockerファイルの作成

任意のディレクトリにDockerfileという名前のファイルを作成します。
<Dockerfile>
FROM python:3.7
  
WORKDIR /app

COPY . /app

RUN pip install Flask

CMD ["python", "app.py"]
  • FROM
    ベースとなるイメージを指定します。1行目に書く必要があります。
  • WORKDIR
    Dockerの作業ディレクトリを指定します。Docker起動時にログインした先のディレクトリになります。
  • COPY [送信元, 送信先]
    送信元のディレクトリやファイルを、第2引数に指定したコンテナ内の送信先にコピーします。
  • RUN
    コマンドを実行します。
  • CMD
    Dockerfile内で1度だけ実行できます。
    実行するコマンドを指定します。


*Pythonファイルの作成

Dockerfileと同じディレクトリにapp.pyを新規作成します。
<app.py>
from flask import Flask
  

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')


*Dockerイメージのビルド

Dockerfileがあるディレクトリで下記コマンドを実行すると、Dockerfileに書かれたコマンドが実行されます。
少し時間がかかりますが、Successfullyと表示されれば完了です。
$ docker build -t flask1 .

...
Successfully built d42102651bf7
Successfully tagged flask1:latest

下記コマンドを実行してビルドしたイメージを確認することができます。
$ docker images

REPOSITORY  TAG IMAGE ID  CREATED SIZE
flask1  latest  d42102651bf7  18 seconds ago  936MB


*Dockerイメージの実行

docker runでイメージ名を指定するとDockerイメージが実行されます。
下記コマンドを実行します。
$ docker run -d -p 80:5000 flask1

実行中のDockerイメージは下記コマンドで確認することができます。
$ docker ps

下記にアクセスすると「Hello World!」と表示されます。
http://localhost/













*Dockerイメージにログイン

下記コマンドを実行すると、Dockerイメージの中に管理者としてログインすることができます。
/appディレクトリの中に、コピーしたDockerfileapp.pyが格納されています。
$ docker exec -it 646e8f44c36f /bin/bash

root@646e8f44c36f:/app# ls
Dockerfile  app.py

ログインしたDockerの中でインストールされたパッケージを確認してみます。
Dockerfileで指定したFlaskがインストールされています。
root@646e8f44c36f:/app# pip list

Package      Version
------------ -------
Click        7.0    
Flask        1.0.2  
itsdangerous 1.1.0  
Jinja2       2.10   
MarkupSafe   1.1.0  
pip          18.1   
setuptools   40.6.3 
Werkzeug     0.14.1 
wheel        0.32.3 
root@646e8f44c36f:/app# 

下記コマンドでDockerから抜けます。
root@646e8f44c36f:/app# exit


*Dockerイメージの停止

docker stopコマンドを実行するとDockerイメージを停止することができます。
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
646e8f44c36f        flask1              "python app.py"     2 hours ago         Up 2 hours          0.0.0.0:80->5000/tcp   elegant_meninsky

$ docker stop 646e8f44c36f
646e8f44c36f

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
646e8f44c36f        flask1              "python app.py"     2 hours ago         Exited (137) 7 seconds ago                       elegant_meninsky


*Dockerイメージの削除

docker rmコマンドを実行するとDockerイメージ自体を削除することができます。
$ docker rm 646e8f44c36f
646e8f44c36f

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker ps -a
CONTAINER ID  IMAGE COMMAND CREATED STATUS  PORTS NAMES


*所感

Pythonの環境構築は、普段はvirtualenvを使うことが多かったのですが、Dockerfileに必要事項を書いてしまえばコマンドを実行するだけで環境が構築できてしまうので、大変便利だと感じました。
今後のPython開発環境の構築には、Dockerを使っていきたいと思います。

Previous
Next Post »

人気の投稿