Dockerは、コンテナーを使用してアプリケーションを簡単に作成、デプロイ、実行できるように設計されたオープンソースツールです。コンテナは、コードとそのすべての依存関係をパッケージ化するソフトウェアパッケージであるため、アプリケーションは、あるコンピューティング環境から別のコンピューティング環境へと迅速かつ確実に実行されます。
Flaskは人気のあるPythonWebフレームワークです。特定のツールやライブラリを必要としないため、マイクロフレームワークとして分類されます。他のフレームワークと比較して、軽量で高度に構造化されています。
このチュートリアルでは、Debian10サーバーにDockerを使用してFlaskアプリケーションをデプロイする方法を説明します。
- Debian10を実行しているサーバー。
- ルートパスワードはサーバーで構成されています。
開始する前に、システムのパッケージを最新バージョンに更新することをお勧めします。次のコマンドを使用して、すべてのパッケージを更新できます。
apt-get update -y
apt-get upgrade -y
すべてのパッケージが更新されたら、システムを再起動して変更を適用します。
次に、NginxWebサーバーとその他の依存関係をシステムにインストールする必要があります。次のコマンドを使用して、それらすべてをインストールできます。
apt-get install nginx apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -y
すべてのパッケージがインストールされたら、次のステップに進むことができます。
Dockerをインストールする
デフォルトでは、最新バージョンのDockerはDebian10リポジトリで利用できません。したがって、Docker公式リポジトリからインストールすることをお勧めします。
まず、次のコマンドを使用してGPGキーをダウンロードして追加します。
wget https://download.docker.com/linux/debian/gpg apt-key add gpg
次に、次のコマンドを使用してDockerリポジトリを追加します。
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
次に、リポジトリを更新し、次のコマンドを使用してDockerをインストールします。
apt-get update -y
apt-get install docker-ce -y
インストールが正常に完了したら、次のコマンドを使用してDockerのステータスを確認します。
systemctl status docker
次の出力が得られるはずです:
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-04-19 06:26:25 UTC; 1min 8s ago Docs: https://docs.docker.com Main PID: 8883 (dockerd) Tasks: 10 Memory: 46.6M CGroup: /system.slice/docker.service ??8883 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413828757Z" level=warning msg="Your kernel does not support swap memory limit Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413876690Z" level=warning msg="Your kernel does not support cgroup rt period" Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413889604Z" level=warning msg="Your kernel does not support cgroup rt runtime Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.414115814Z" level=info msg="Loading containers: start." Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.788332166Z" level=info msg="Default bridge (docker0) is assigned with an IP a Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.972022325Z" level=info msg="Loading containers: done." Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.010940205Z" level=info msg="Docker daemon" commit=afacb8b7f0 graphdriver(s)=o Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.011145541Z" level=info msg="Daemon has completed initialization" Apr 19 06:26:25 debian10 systemd[1]: Started Docker Application Container Engine. Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.074603639Z" level=info msg="API listen on /var/run/docker.sock"
この時点で、Dockerがインストールされて実行されています。これで、次のステップに進むことができます。
次に、Flaskアプリケーションを保持するためのディレクトリ構造を作成する必要があります。
/ var / www/ディレクトリ内にflaskという名前のディレクトリを作成しましょう:
mkdir -p /var/www/flask
次に、ディレクトリをフラスコに変更し、フラスコのディレクトリ構造を作成します。
cd /var/www/flask
mkdir -p app/static
mkdir -p app/templates
静的ディレクトリは画像、CSS、JavaScriptファイルを保存するために使用され、テンプレートディレクトリはプロジェクトのHTMLテンプレートを保存するために使用されます。
次に、アプリディレクトリ内に__init__.pyファイルを作成する必要があります:
nano app/__init__.py
次のコンテンツを追加してFlaskインスタンスを作成し、views.pyファイルからロジックをインポートします。
from flask import Flask app = Flask(__name__) from app import views
ファイルを保存して閉じてから、アプリディレクトリにviews.pyファイルを作成します。
nano app/views.py
次の行を追加します
from app import app @app.route('/') def home(): return "hello world!"
ファイルを保存して閉じてから、次のコマンドを使用してuwsgi.iniファイルを作成します。
nano uwsgi.ini
このファイルには、以下に示すように、アプリケーションのuWSGI構成が含まれます。
[uwsgi] module = main callable = app master = true
終了したら、ファイルを保存して閉じます。 uWSGIは、プロトコルとアプリケーションサーバーの両方であるNginxの展開オプションです。
次に、main.pyファイルを作成して、アプリケーションパッケージからappという名前のFlaskインスタンスをインポートする必要があります。次のコマンドで作成できます:
nano main.py
次の行を追加します:
from app import app
終了したら、ファイルを保存して閉じます。次に、pipパッケージマネージャーがDockerデプロイメントにインストールする依存関係を指定するためのrequirements.txtファイルを作成します。
nano requirements.txt
最新バージョンのFlaskと一致する次の行を追加します。
Flask==1.1.2
終了したら、ファイルを保存して閉じます。
この時点で、Flaskアプリケーションは正常に構成されています。これで、次のステップに進むことができます。
FlaskをデプロイするようにDockerを構成する
次に、フラスコアプリケーションをビルドしてデプロイするためのDockerfileを作成する必要があります。
まず、次のコマンドを使用してDockerfileを作成します。
cd /var/www/flask
nano Dockerfile
次の行を追加します:
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7 RUN apk --update add bash nano ENV STATIC_URL /static ENV STATIC_PATH /var/www/app/static COPY ./requirements.txt /var/www/requirements.txt RUN pip install -r /var/www/requirements.txt
終了したら、ファイルを保存して閉じます。次に、start.shスクリプトを作成して、Dockerfileからイメージを構築し、結果のDockerイメージからコンテナーを作成します。
nano start.sh
次の行を追加します:
#!/bin/bash app="docker.test" docker build -t ${app} . docker run -d -p 56733:80 \ --name=${app} \ -v $PWD:/app ${app}
終了したら、ファイルを保存して閉じます。
注 :ポート56733が空いていて使用可能であることを確認してください。
最後に、次のコマンドを使用してスクリプトを実行します。
bash start.sh
これにより、Dockerイメージが作成され、以下に示すように、結果のイメージからコンテナーが構築されます。
Sending build context to Docker daemon 9.728kB Step 1/6 : FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7 python3.6-alpine3.7: Pulling from tiangolo/uwsgi-nginx-flask 48ecbb6b270e: Pull complete 692f29ee68fa: Pull complete f75fc7ac1098: Pull complete c30e40bb471c: Pull complete Successfully built f5de17e1ce82 Successfully tagged docker.test:latest 22cd2bd23c9190cf2900fa1d7c55e4765a266e68c74dc1e6858872e9ebe7bdcd
これで、次のコマンドを使用して実行中のコンテナを一覧表示できます。
docker ps
次の出力が得られるはずです:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 22cd2bd23c91 docker.test "/entrypoint.sh /sta…" About a minute ago Up About a minute 443/tcp, 0.0.0.0:56733->80/tcp docker.test
URL http:// your-server-ip:56733にアクセスして、Dockerコンテナを確認することもできます。次の画面が表示されます。
テンプレートファイルをデプロイして、静的および動的コンテンツを提供することもできます。次のコマンドを使用して、アプリケーションのホームページテンプレートを作成できます。
nano app/templates/home.html
次のコードを追加します:
<!doctype html> <html lang="en-us"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>Welcome Flask</title> </head> <body> <h1>Home Page</h1> <p>This is the home page of our flask application.</p> </body> </html>
終了したら、ファイルを保存して閉じます。次に、新しく作成されたファイルを提供するために、views.pyファイルを変更する必要があります。
nano app/views.py
以下に示すようにファイルを更新します:
from flask import render_template from app import app @app.route('/') def home(): return "hello world!" @app.route('/template') def template(): return render_template('home.html')
ファイルを保存して閉じます。次に、Dockerコンテナを再起動して変更を適用する必要があります。
次のコマンドを使用して、docker.testという名前のDockerコンテナを再起動できます。
docker stop docker.test
docker start docker.test
次に、Webブラウザーを開き、URL http:// your-server-ip:56733/templateを入力します。次の画面に、新しく作成したテンプレートが表示されます。
おめでとう!これで、Debian10サーバーにDockerを使用してFlaskアプリケーションを正常にデプロイできました。これで、最小限の再構成で異なるサーバー間でアプリケーションを複製できます。ご不明な点がございましたら、お気軽にお問い合わせください。