Dockerの説明:PythonWebアプリケーションをコンテナ化する方法
ステータス:非推奨
この記事は廃止され、メンテナンスされなくなりました。
理由
この記事の手法は時代遅れであり、Dockerのベストプラクティスを反映していない可能性があります。
代わりに参照してください
序章
Webアプリケーションが乗っ取られ、ホスト全体を乗っ取るために使用されるという脅威は、広大で恐ろしいものです。 特にアプリケーションが異なるクライアントに属している場合、セキュリティを強化するために物事を互いに分離しておくことは長い間課題でした。 この不幸なシナリオを防ぐために多くの対策を講じることができますが、通常、ほとんどの開発者または管理者のユースケースでは、コストがかかりすぎるか(時間とリソースの両方で)複雑すぎます。
このDigitalOceanの記事では、Python Webアプリケーションを「コンテナ化」して、非常に安全なサンドボックスに入れ、独自の環境内に完全に保持する方法について説明します(明示的に別のアプリケーションに「リンク」しない限り)。 これを実現するために、PythonWebアプリケーションをホストするdocker コンテナーを段階的に作成し、最後にDockerfileを使用してビルドプロセスをブートストラップして完全に自動化する方法について説明します。
用語集
1. Dockerの概要
2. UbuntuへのDockerのインストール
3. 基本的なDockerコマンド
- Dockerデーモンの実行とCLIの使用法
- dockerコマンド
4. サンドボックスPythonWSGIアプリへのDockerコンテナの構築
- UbuntuからベースDockerコンテナを作成する
- インストール用のベースコンテナの準備
- デプロイ用の一般的なPythonツールのインストール
- Webアプリケーションとその依存関係のインストール
- PythonWSGIアプリケーションの構成
5. イメージを自動的にビルドするDockerfileの作成
- Dockerfileの基本
- Dockerfileコマンドの概要
- Dockerfileの作成
- 基礎の定義
- インストール用のデフォルトのアプリケーションリポジトリの更新
- 基本ツールのインストール
- Pythonおよび基本的なPythonツールの基本的なインストール手順
- アプリケーションの展開
- すべてをブートストラップする
- 最終的なDockerfile
- Dockerfileを使用してコンテナを自動的に構築する
Dockerの概要
dockerプロジェクトは、いくつかのLinuxカーネル機能の上に構築された、連携して動作する高レベルのツールを提供します。 目標は、開発者とシステム管理者がアプリケーションを移植し(すべての依存関係を組み合わせて)、システムとマシン間で実行できるようにすることです。頭痛の種はありません。
Dockerは、安全なLXC(つまり、 Linux Containers) dockercontainerと呼ばれるアプリケーション用のベースの環境。 これらのコンテナーは、Dockerイメージを使用して作成されます。これは、コマンドを手動で実行するか、Dockerfilesを介して自動的に実行することで構築できます。
注: Dockerとそのパーツの詳細(例: dockerデーモン、CLI、イメージなど)、プロジェクトの紹介記事をチェックしてください: docker Explained:GettingStarted。
UbuntuへのDockerのインストール(最新)
最新のリリース( 0.7.1。は12月5日付け)で、dockerはUbuntu/DebianやCentOS/RHELを含むさまざまなLinuxオペレーティングシステムにデプロイできます。
Ubuntu 13.04で構築されたDigitalOceanのすぐに使用できるDockerイメージを使用すると、すぐに開始できることを忘れないでください。
Ubuntu(最新)のインストールプロセスを簡単に説明します。
Ubuntuのインストール手順
ドロップレットを更新します。
sudo aptitude update sudo aptitude -y upgrade
aufsサポートが利用可能であることを確認してください:
sudo aptitude install linux-image-extra-`uname -r`
パッケージ検証のためにDockerリポジトリキーをapt-keyに追加します。
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
Dockerリポジトリをaptitudeソースに追加します。
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
新しい追加でリポジトリを更新します。
sudo aptitude update
最後に、dockerをダウンロードしてインストールします。
sudo aptitude install lxc-docker
Ubuntuのデフォルトファイアウォール( UFW :Uncomplicated Firewall)は、Dockerが必要とするすべての転送トラフィックをデフォルトで拒否します。
UFWで転送を有効にする:
nanoテキストエディタを使用してUFW設定を編集します。
sudo nano /etc/default/ufw
下にスクロールして、DEFAULT_FORWARD_POLICY
で始まる行を見つけます。
交換:
DEFAULT_FORWARD_POLICY="DROP"
と:
DEFAULT_FORWARD_POLICY="ACCEPT"
CTRL + X を押し、 Y で承認して、保存して閉じます。
最後に、UFWをリロードします。
sudo ufw reload
基本的なDockerコマンド
dockerの使用を開始する前に、最初の Getting Started の記事から、使用可能なコマンドをすばやく調べてメモリを更新しましょう。
Dockerデーモンの実行とCLIの使用法
インストール時に、dockerデーモンはバックグラウンドで実行され、dockerCLIによって送信されたコマンドを受け入れる準備ができている必要があります。 dockerを手動で実行する必要がある特定の状況では、以下を使用します。
Dockerデーモンの実行:
sudo docker -d &
docker CLIの使用法:
sudo docker [option] [command] [arguments]
注: dockerを機能させるには、sudo権限が必要です。
Dockerコマンド
現在利用可能な(バージョン 0.7.1 )dockerコマンドの概要は次のとおりです。
添付
実行中のコンテナに接続する
建てる
Dockerfileからコンテナを構築する
専念
コンテナの変更から新しいイメージを作成します
cp
コンテナファイルシステムからホストパスにファイル/フォルダをコピーします
差分
コンテナのファイルシステムの変更を検査します
イベント
サーバーからリアルタイムのイベントを取得する
書き出す
コンテナのコンテンツをtarアーカイブとしてストリーミングする
歴史
画像の履歴を表示する
画像
画像を一覧表示
輸入
tarballのコンテンツから新しいファイルシステムイメージを作成します
情報
システム全体の情報を表示する
入れる
画像にファイルを挿入する
検査する
コンテナに関する低レベルの情報を返す
殺す
実行中のコンテナを殺す
ロード
tarアーカイブから画像をロードする
ログインする
Dockerレジストリサーバーに登録またはログインします
ログ
コンテナのログを取得します
ポート
PRIVATE_PORTにNAT変換された公開ポートを検索します
ps
コンテナの一覧表示
引く
Dockerレジストリサーバーからイメージまたはリポジトリをプルします
押す
イメージまたはリポジトリをDockerレジストリサーバーにプッシュします
再起動
実行中のコンテナを再起動します
rm
1つ以上のコンテナを削除します
rmi
1つ以上の画像を削除する
走る
新しいコンテナでコマンドを実行する
保存する
画像をtarアーカイブに保存します
探す
Dockerインデックスで画像を検索する
始める
停止したコンテナを起動します
止まる
実行中のコンテナを停止します
鬼ごっこ
画像をリポジトリにタグ付けする
上
コンテナの実行中のプロセスを検索します
バージョン
Dockerのバージョン情報を表示する
サンドボックスPythonWSGIアプリへのDockerコンテナの構築
DockerをVPSにインストールし、そのコマンドをすばやく確認したら、PythonWSGIアプリケーションを実行するDockerコンテナーを作成する実際の作業を開始する準備が整いました。
注:次のセクションでは、ドッキングされた(コンテナ化された)PythonWSGIWebアプリケーションを使用できます。 ただし、その複雑さと実行不可能性のため、これは絶対に推奨される方法ではありません。 ここでは、ライブコンテナの操作方法を学び、プロセスを自動化するために次のセクションで定義する必要のあるコマンドに慣れるための機会を提供します。
さぁ、始めよう!
UbuntuからベースDockerコンテナを作成する
dockerのRUNコマンドを使用して、Ubuntuイメージに基づいて新しいコンテナーを作成することから始めます。 -t フラグを使用して端末を接続し、実行中のプロセスとしてbashを使用します。
ポート80を公開して、アプリケーションに外部からアクセスできるようにします。 将来的には、複数のインスタンスの負荷を分散し、コンテナを相互に「リンク」して、たとえば、リバースプロキシ実行コンテナを使用してそれらにアクセスしたい場合があります。
sudo docker run -i -t -p 80:80 ubuntu /bin/bash
注:このコマンドを実行した後、dockerは新しいコンテナーを作成する前にUbuntuイメージをプルする必要がある場合があります。
覚えておいてください:作成したコンテナに接続されます。 自分自身を切り離してメインターミナルのアクセスポイントに戻るには、エスケープシーケンスを実行します:CTRL+Pに続いてCTRL+Q。 Dockerコンテナに接続することは、別の内部から新しいドロップレットに接続するようなものです。
このコンテナに戻るには:
- 「sudodockerps」を使用して、実行中のすべてのコンテナーを一覧表示します
- そのIDを見つける
- 「sudodockerattach[id]」を使用して、端末に接続し直します
重要:私たちはコンテナ内にあるため、以下のすべてのコマンドは、それが存在するホストに影響を与えることなく、そこで実行されることを忘れないでください。
インストール用のベースコンテナの準備
Python WSGI Webアプリケーションをコンテナー内(およびプロセスに必要なツール)にデプロイするには、関連するアプリケーションリポジトリがダウンロードに使用できる必要があります。 残念ながら(そして意図的に物事を単純にするために)、これはdockerに付属するデフォルトのUbuntuイメージの場合ではではありません。
Ubuntuのユニバースリポジトリをベースイメージのアプリケーションソースリストのデフォルトリストに追加しましょう。
echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list
新しく追加されたソースでリストを更新します。
apt-get update
Python WSGIアプリケーションのセットアップに進む前に、nano、tar、curlなどのツールが必要です。 -念のため。
コンテナ内の便利なツールをダウンロードしてみましょう。
apt-get install -y tar \ git \ curl \ nano \ wget \ dialog \ net-tools build-essential
デプロイ用の一般的なPythonツールのインストール
チュートリアル(例として)では、非常に基本的なFlaskアプリケーションを作成します。 この記事を読んだ後は、仮想サーバーにデプロイするのと同じ方法で、代わりにお気に入りのフレームワークを使用してデプロイできます。
覚えておいてください:以下のすべてのコマンドと手順は、コンテナ内で実行されます。これは、まるでそれ自体がまったく新しい液滴であるかのように機能します。
PythonとpipPythonパッケージマネージャーをインストールすることから展開プロセスを始めましょう。
# Install pip's dependency: setuptools: apt-get install -y python python-dev python-distribute python-pip
Webアプリケーションとその依存関係のインストール
サンプルアプリケーションの作成を開始する前に、すべてを確認することをお勧めします。 すべての依存関係-そこにあります。 何よりもまず、アプリケーションの依存関係としてWebアプリケーションフレームワーク(WAF)を使用する可能性があります(つまり、 フラスコ)。
pipがインストールされて動作する準備ができたら、それを使用してすべての依存関係をプルし、コンテナー内にセットアップすることができます。
# Download and install Flask framework: pip install flask
pipをインストールした後、すべてを含む「my_application」フォルダー内に基本的なサンプルのFlaskアプリケーションを作成しましょう。
# Make a my_application folder mkdir my_application # Enter the folder cd my_application
注:この単純なサンプルの例の代わりにアプリケーションをデプロイすることに興味がある場合は、以下の「クイックヒント」の中央セクションを参照してください。
1ページのフラスコ「HelloWorld!」を作成しましょう。 nanoを使用したアプリケーション。
# Create a sample (app.py) with nano: nano app.py
そして、今述べたこの小さなアプリケーションの以下の内容をコピーして貼り付けます。
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
CTRL + Xを押し、Yで承認して保存して閉じます。
または、「requirements.txt」を使用して、Flaskなどのアプリケーションの依存関係を含めることもできます。
nanoテキストエディタを使用してrequirements.txtを作成するには:
nano requirements.txt
そして、すべての依存関係とともに、内部に次のように入力します。
flask cherrypy
CTRL + Xを押し、Yで承認して保存して閉じます。
注: pip を使用して、実際のアプリケーションの依存関係のリストを作成できます。 方法については、チュートリアル一般的なPythonツール:virtualenvの使用、Pipを使用したインストール、およびパッケージの管理を確認してください。
最終的なアプリケーションフォルダ構造:
/my_application | |- requirements.txt # File containing list of dependencies |- /app # Application module (which should have your app) |- app.py # WSGI file containing the "app" callable |- server.py # Optional: To run the app servers (CherryPy)
注:「server.py」-PythonWSGIアプリケーションの構成については次のセクションを参照してください。
覚えておいてください:このアプリケーションフォルダはコンテナ内に作成されます。 イメージを自動的に構築する場合(Dockerfilesの次のセクションを参照)、Dockerfileと一緒にこの構造がホスト上にあることを確認する必要があります。
__*実際の展開に関するクイックヒント*__
アプリケーションリポジトリとその要件をコンテナ内に取得する方法
上記の例では、コンテナ内にアプリケーションディレクトリを作成しました。 ただし、アプリケーションをデプロイするためにそれを行うことはありません。 リポジトリからソースをプルする可能性がかなり高くなります。
コンテナ内にリポジトリをコピーする方法はいくつかあります。
以下にその2つを説明します。
# Example [1] # Download the application using git: # Usage: git clone [application repository URL] # Example: git clone https://github.com/mitsuhiko/flask/tree/master/examples/flaskr # Example [2] # Download the application tarball: # Usage: wget [application repository tarball URL] # Example: (make sure to use an actual, working URL) wget http://www.github.com/example_usr/application/tarball/v.v.x # Expand the tarball and extract its contents: # Usage: tar vxzf [tarball filename .tar (.gz)] # Example: (make sure to use an actual, working URL) tar vxzf application.tar.gz # Download and install your application dependencies with pip. # Download the requirements.txt (pip freeze output) and use pip to install them all: # Usage: curl [URL for requirements.txt] | pip install -r - # Example: (make sure to use an actual, working URL) curl http://www.github.com/example_usr/application/requirements.txt | pip install -r -
PythonWSGIアプリケーションの構成
このアプリケーションを提供するには、Webサーバーが必要です。 WSGIアプリを強化するWebサーバーは、アプリケーションの他のリソースと同じコンテナーにインストールする必要があります。 実際、dockerが実行するのはプロセスです。
注:この例では、CherryPyの組み込みの本番環境対応HTTP Webサーバーを使用します。これは、その単純さのためです。 このテーマに関するチュートリアルに従うことで、Gunicorn、CherryPy、さらにはuWSGIを使用できます(Nginxの背後にセットアップできます)。
CherryPyをpipでダウンロードしてインストールします。
pip install cherrypy
「server.py」を作成して、「app.py」からWebアプリケーションを提供します。
nano server.py
サーバーのコンテンツをコピーして貼り付け、アプリケーションをインポートして提供を開始します。
# Import your application as: # from app import application # Example: from app import app # Import CherryPy import cherrypy if __name__ == '__main__': # Mount the application cherrypy.tree.graft(app, "/") # Unsubscribe the default server cherrypy.server.unsubscribe() # Instantiate a new server object server = cherrypy._cpserver.Server() # Configure the server object server.socket_host = "0.0.0.0" server.socket_port = 80 server.thread_pool = 30 # For SSL Support # server.ssl_module = 'pyopenssl' # server.ssl_certificate = 'ssl/certificate.crt' # server.ssl_private_key = 'ssl/private.key' # server.ssl_certificate_chain = 'ssl/bundle.crt' # Subscribe this server server.subscribe() # Start the server engine (Option 1 *and* 2) cherrypy.engine.start() cherrypy.engine.block()
以上です! これで、「ドッキングされた」Python Webアプリケーションをサンドボックスに安全に保管し、次のコマンドを実行するだけで、何千ものクライアント要求に対応できるようになります。
python server.py
これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、CTRL+Cを押してください。
サーバーをバックグラウンドで実行するには、次を実行します。
python server.py &
アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。
注:CherryPyでデプロイするためのPythonWSGIアプリケーションの構成の詳細については、チュートリアルを確認してください:CherryPyWebサーバーを使用してPythonWSGIアプリをデプロイする方法
すべてがスムーズに実行されていることをテストするには、すべてのポート割り当てがすでに処理されていることを確認する必要があります。ブラウザで http://[ドロップレットのIP]にアクセスして、「[X206X ] Hello World!」メッセージ。
イメージを自動的にビルドするDockerfileの作成
前のステップで述べたように、スケーラブルな本番デプロイメントでこの方法でコンテナーを作成することは、確かに推奨される方法ではありません。 正しい方法は、Dockerfilesを使用して構造化された方法でビルドプロセスを自動化することと見なすことができます。
コンテナー内にダウンロードしてインストールするために必要なコマンドを実行した後、同じ知識を使用して、dockerがイメージの構築に使用できるDockerfileを作成し、PythonWSGIアプリケーションコンテナーを簡単に実行できます。
Dockerfileの作業を開始する前に、基本を簡単に説明しましょう。
Dockerfileの基本
Dockerfileは、連続して宣言されたコマンドを含むスクリプトであり、dockerによってこの順序で実行され、新しいdockerイメージが自動的に作成されます。 それらは展開に大いに役立ちます。
これらのファイルは常に、FROMコマンドを使用してベースイメージを定義することから始まります。 そこから、ビルドプロセスが開始され、実行される後続の各アクションが、ホストでコミットされる最終イメージを形成します。
使用法:
# Build an image using the Dockerfile at current location # Tag the final image with [name] (e.g. *nginx*) # Example: sudo docker build -t [name] . sudo docker build -t nginx_img .
注: Dockerfileの詳細については、次の記事をご覧ください: Dockerの説明:Dockerfileを使用したイメージの構築の自動化。
Dockerfileコマンドの概要
追加
ホストからコンテナにファイルをコピーします
CMD
実行する、またはENTRYPOINTに渡すデフォルトのコマンドを設定します
エントリーポイント
コンテナ内にデフォルトのエントリポイントアプリケーションを設定します
ENV
環境変数を設定します(例: 「キー=値」)
公開
ポートを外部に公開する
から
使用するベースイメージを設定します
メンテナ
Dockerfileの作成者/所有者データを設定します
走る
コマンドを実行し、終了結果(コンテナー)イメージをコミットします
ユーザー
イメージからコンテナを実行するようにユーザーを設定します
音量
ホストからコンテナにディレクトリをマウントします
WORKDIR
CMDのディレクティブを実行するディレクトリを設定します
Dockerfileの作成
nanoテキストエディタを使用して現在の場所にDockerfileを作成するには、次のコマンドを実行します。
sudo nano Dockerfile
注:次のすべての行を次々に追加してDockerfileを作成します。
基礎の定義
FROMイメージ(つまり、FROMイメージ)などの基本(基本)を定義することから、Dockerfileを始めましょう。 Ubuntu)とMAINTAINER。
以下を追加します。
############################################################ # Dockerfile to build Python WSGI Application Containers # Based on Ubuntu ############################################################ # Set the base image to Ubuntu FROM ubuntu # File Author / Maintainer MAINTAINER Maintaner Name
インストール用のデフォルトのアプリケーションリポジトリの更新
前のセクションで行ったように、以下を実行して、apt-get
リポジトリを追加のアプリケーションで更新します。
以下を追加します。
# Add the application resources URL RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list # Update the sources list RUN apt-get update
基本ツールのインストール
デフォルトのアプリケーションリポジトリソースリストを更新した後、必要な基本的なアプリケーションを取得することで、展開プロセスを開始できます。
以下を追加します。
# Install basic applications RUN apt-get install -y tar git curl nano wget dialog net-tools build-essential
注:上記のツールの一部が必要になる可能性はほとんどありませんが、それでも念のためで入手できます。
Pythonおよび基本的なPythonツールの基本的なインストール手順
Python WSGIアプリケーションをデプロイするには、以前に使用したツールのいくつかが必要になる可能性が非常に高くなります(例: pip )。 フレームワークのセットアップに進む前に、今すぐインストールしましょう(つまり WAF)と選択したWebアプリケーションサーバー(WAS)。
以下を追加します。
# Install Python and Basic Python Tools RUN apt-get install -y python python-dev python-distribute python-pip
アプリケーションの展開
Python WebアプリケーションをデプロイするためにDockerイメージを構築していることを考えると、DockerのADDコマンドを利用して、アプリケーションリポジトリをコピーできます。できれば、REQUIREMENTSファイルを使用して1つのステップですばやく実行できます。
注:すべてを1つのファイルにパッケージ化し、繰り返さないようにするには、以下のような構造のアプリケーションフォルダーを使用することをお勧めします。
アプリケーションフォルダ構造の例:
/my_application | |- requirements.txt # File containing list of dependencies |- /app # Application module |- app.py # WSGI file containing the "app" callable |- server.py # Optional: To run the app servers (CherryPy)
注:この構造の作成については、ロールバックして、Webアプリケーションとその依存関係のインストールのセクションを参照してください。
以下を追加します。
# Copy the application folder inside the container ADD /my_application /my_application
注:オンラインホストのgitリポジトリからデプロイする場合は、次のコマンドを使用してクローンを作成できます。
RUN git clone [application repository URL]
URLプレースホルダーを実際のプレースホルダーに置き換えることを忘れないでください。
すべてをブートストラップする
アプリケーションをコピーするための手順を追加したら、requirements.txtから依存関係をプルするなどの最終的な構成で終了しましょう。
# Get pip to download and install requirements: RUN pip install -r /my_application/requirements.txt # Expose ports EXPOSE 80 # Set the default directory where CMD will execute WORKDIR /my_application # Set the default command to execute # when creating a new container # i.e. using CherryPy to serve the application CMD python server.py
最終的なDockerfile
結局、これはDockerfileがどのように見えるべきかです:
############################################################ # Dockerfile to build Python WSGI Application Containers # Based on Ubuntu ############################################################ # Set the base image to Ubuntu FROM ubuntu # File Author / Maintainer MAINTAINER Maintaner Name # Add the application resources URL RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list # Update the sources list RUN apt-get update # Install basic applications RUN apt-get install -y tar git curl nano wget dialog net-tools build-essential # Install Python and Basic Python Tools RUN apt-get install -y python python-dev python-distribute python-pip # Copy the application folder inside the container ADD /my_application /my_application # Get pip to download and install requirements: RUN pip install -r /my_application/requirements.txt # Expose ports EXPOSE 80 # Set the default directory where CMD will execute WORKDIR /my_application # Set the default command to execute # when creating a new container # i.e. using CherryPy to serve the application CMD python server.py
CTRL + Xを押し、Yで確定して、ファイルを再度保存して終了します。
Dockerfileを使用してコンテナを自動的に構築する
「基本」セクションで最初に説明したように、Dockerfilesの使用法は、 dockerbuildコマンドでそれらを呼び出すことです。
Dockerにアプリケーションフォルダをコピーするように指示しているので(つまり / my_application)現在のディレクトリから、ビルドプロセスを開始する前に、このDockerfileと一緒にあることを確認する必要があります。
このDockerイメージを使用すると、1つのコマンドでPythonWSGIアプリケーションを実行するコンテナーをすばやく作成できます。
使用を開始するには、次のコマンドを使用して新しいコンテナイメージを作成します。
sudo docker build -t my_application_img .
そして、my_application_imgにタグを付けたその画像を使用して、アプリケーションを実行する新しいコンテナーを次のように実行できます。
sudo docker run -name my_application_instance -p 80:80 -i -t my_application_img
これで、ドロップレットのIPアドレスにアクセスでき、アプリケーションはDockerコンテナーを介して実行されます。
例:
# Usage: Visit http://[my droplet's ip] http://95.85.10.236/
サンプル応答:
Hello World!
docker(他のOSを含む)をインストールするための完全な手順については、docker.ioにあるdockerインストールドキュメントを確認してください。