ステータス:非推奨

この記事は非推奨になり、保守されなくなりました。

理由

この記事の手法は時代遅れであり、Dockerのベストプラクティスを反映していない可能性があります。

代わりに参照してください

序章


Webアプリケーションが乗っ取られ、ホスト全体を乗っ取るために使用されるという脅威は、広大で恐ろしいものです。 特にアプリケーションが異なるクライアントに属している場合、セキュリティを強化するために物事を互いに分離しておくことは長い間課題でした。 この不幸なシナリオを防ぐために多くの対策を講じることができますが、通常、ほとんどの開発者または管理者のユースケースでは、コストがかかりすぎるか(時間とリソースの両方で)複雑すぎます。

このDigitalOceanの記事では、Python Webアプリケーションを「コンテナ化」して、非常に安全なサンドボックスに入れ、独自の環境内に完全に保持する方法について説明します(明示的に別のアプリケーションに「リンク」しない限り)。 これを実現するために、PythonWebアプリケーションをホストするdocker コンテナーを段階的に作成し、最後にDockerfileを使用してビルドプロセスをブートストラップして完全に自動化する方法について説明します。

用語集


1. Dockerの概要


2. UbuntuへのDockerのインストール


3. 基本的なDockerコマンド


  1. Dockerデーモンの実行とCLIの使用法
  2. dockerコマンド

4. サンドボックスPythonWSGIアプリへのDockerコンテナの構築


  1. UbuntuからベースDockerコンテナを作成する
  2. インストール用のベースコンテナの準備
  3. デプロイ用の一般的なPythonツールのインストール
  4. Webアプリケーションとその依存関係のインストール
  5. PythonWSGIアプリケーションの構成

5. イメージを自動的にビルドするDockerfileの作成


  1. Dockerfileの基本
  2. Dockerfileコマンドの概要
  3. Dockerfileの作成
  4. 基礎の定義
  5. インストール用のデフォルトのアプリケーションリポジトリの更新
  6. 基本ツールのインストール
  7. Pythonおよび基本的なPythonツールの基本インストール手順
  8. アプリケーションの展開
  9. すべてをブートストラップする
  10. 最終的なDockerfile
  11. 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オペレーティングシステムにデプロイできます。

Ubuntu13.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コンテナに接続することは、別の内部から新しいドロップレットに接続するようなものです。

このコンテナに戻るには:

  1. 「sudodockerps」を使用して、実行中のすべてのコンテナーを一覧表示します

  2. そのIDを見つける

  3. 「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!