データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

Docker MachineとComposeで実現する、ローカル開発からリモートデプロイまでの完全ガイド

この記事の目標は、リモートの本番環境にできるだけ近い環境でアプリケーションを開発することです。Docker MachineとDocker Composeを活用すれば、アプリケーションをローカル開発環境からリモートデプロイ環境へスムーズに移行できます。実際の手順を通じて、その方法を詳しく解説していきます。

Docker、Docker、Docker

Docker MachineとComposeで実現する、ローカル開発からリモートデプロイまでの完全ガイドまずはDockerをインストールしましょう。この記事では、執筆時点での最新バージョンのDockerコンポーネントを使用します。

  1. Docker 1.7.0
  2. Docker Machine 0.3.0
  3. Docker Compose 1.3.0

以降の手順では、VirtualBox上でDockerを実行していることを前提として説明を進めます。

ゲストブックに署名してください

今回デプロイするアプリケーションは、シンプルなゲストブックです。基本的な3層構造のアプリケーションを示すサンプルとしては十分な規模です。まずはローカル開発環境から始め、以下の技術スタックを使ってWebアプリを開発していきます。

  • Nginx:Webサーバー
  • アプリケーションサーバー:
    • Python:プログラミング言語
    • Flask:Webフレームワーク
    • Gunicorn:WSGIサーバー
  • MySQL:データベース

作業はGitHub上のリポジトリで行うため、まずはそのリポジトリをクローンしましょう。

git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook

また、作業を進めるうちに「今どのDockerホストに対して操作しているのか」分からなくなりがちです。現在接続しているホストを簡単に確認できるよう、以下のエイリアスを設定しておくことをおすすめします。

alias de='env | grep DOCKER_'

これでdeと入力するだけで、設定済みのDocker環境変数を一目で確認できます。

以下は、アプリケーションをローカル開発からリモートデプロイへ移行した際の最終的な構成イメージです。

Docker MachineとComposeで実現する、ローカル開発からリモートデプロイまでの完全ガイド

ローカル開発

ローカル開発環境(dev env)は非常にシンプルです。認証情報の設定やセキュリティ対策を気にする必要がないためです。リモートデプロイ環境と区別しやすいよう、開発環境用のリソースにはすべて「-dev」という接尾辞を付けて管理します。

環境の初期化

まずdocker-machineを使って、コンテナ用のDockerホストを作成します。次に、そのホストを使うようにDockerを設定します。最後に、docker-composeで開発環境全体を起動します。

docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # ゲストブック開発環境のIPアドレスをメモ
eval "$(docker-machine env guestbook-dev)"
docker-compose up

コマンドが実行されている間に、docker-compose.ymlを読んで、何をしてくれるのか確認してみましょう。コメントが丁寧に書かれているため、内容はほぼ自明なはずです。共通コンポーネントの基盤としてdocker-compose-common.ymlを拡張している点にも注目してください。Docker Composeファイル形式の詳細については、公式のdocker-compose.ymlリファレンスをご覧ください。

すべてのイメージのダウンロードが完了し、コンテナが起動したら、データベースを初期化する必要があります。アプリのワンオフコンテナを実行し、Pythonコマンドでデータベースにテーブルを作成します。

新しいターミナルを開いて、guestbookディレクトリに移動してください。

eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db

なぜわざわざワンオフコンテナを実行するのでしょうか?それは、docker-composeがデータベースへの接続に必要な環境変数を自動的に注入してくれるからです。私たちが追加の設定を行う必要は一切ありません。

ブラウザを開き、先ほどメモしたゲストブック開発環境のIPアドレスにアクセスしてください。ぜひゲストブックに署名してみてください。

変更を加える

続けて、アプリケーションコードを素早く開発し続けられることを確認しましょう。それを可能にする重要な設定オプションが、docker-compose.ymlの中にいくつかあります。appサービス内のvolumesとcommandのコメントをもう一度読んでみてください。

お好みのテキストエディタでapp/templates/index.htmlを開きます。変更を加えて保存したら、ブラウザに戻って再読み込みしてください。変更が即座に反映されるはずです!

リモートデプロイ

ここからが少し難しくなります。認証情報の設定が必要になり、セキュリティにも配慮しなければならないからです。Rackspaceアカウントをお持ちでない方は、developer+に登録すると無料クレジットを取得できます。アカウントの準備ができたらAPIキーを確認し、ターミナルで以下の環境変数を設定してください。

export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD

環境の初期化

docker-machineを使って、コンテナ用のDockerホストを作成します。

docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # ゲストブックのIPアドレスをメモ

環境のセキュリティ強化

免責事項:これは決して最も安全な構成ではありません。このスクリプトは、あくまでデフォルト構成より少し安全にすることのみを目的としています。このスクリプトによってサーバーの乗っ取りやデータ流出を完全に防げると保証するものではありません。悪意ある攻撃者は依然として存在します。また、このスクリプトを実行しても、安全なアプリケーションコードを書く責任は免除されません!

fail2banをインストールしてサーバーへのブルートフォースログイン攻撃を防ぎ、ufwでファイアウォールを設定して必要なポートのみを許可します。なお、コマンドが完全に完了するまで出力は表示されないため、多少の忍耐が必要です。

docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376" # Docker
docker-machine ssh guestbook "ufw --force enable"

環境の初期化(続き)

Docker Composeでリモートデプロイ環境を構築する前に、データベース用の環境変数をいくつか設定する必要があります。これらの環境変数はdocker-compose-prod.ymlファイルで使用されます。機密情報を誤ってGitHubにコミットしてしまうのを防ぐためです。

export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)

echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"

次に、作成したホストを使うようにDockerを設定します。最後に、docker-composeでコンテナをビルドし、バックグラウンドで起動します。ローカル開発時のようにカラフルなログメッセージは表示されません。

eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

ビルドが進行している間に、docker-compose-prod.ymlを読んで、何をしてくれるのか確認しましょう。デフォルトのdocker-compose.ymlというファイル名で扱えるため、docker-composeコマンドでいちいちファイル名を指定する必要がない点に注目してください。こちらもコメントが充実しており、内容は理解しやすいはずです。共通コンポーネントの基盤として、やはりdocker-compose-common.ymlを拡張しています。

すべてのビルドと起動が完了したら、データベースを初期化します。アプリのワンオフコンテナを実行し、Pythonコマンドでデータベースにテーブルを作成します。

docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db

ブラウザを開き、先ほどメモしたゲストブックのIPアドレスにアクセスしてください。ぜひゲストブックに署名してみてください。

変更を加える

リモート環境で直接アプリケーションコードを開発することは避けるべきですが、変更を簡単にデプロイできるようにしたいところです。

お好みのテキストエディタでapp/templates/index.htmlを開きます。変更を加えて保存したら、ブラウザでゲストブック開発環境(Dev)のIPアドレスにアクセスして再読み込みしてください。ローカル開発環境で期待通りに変更が反映されていることを確認します。

次に、おなじみのコマンドをいくつか実行して、その変更をリモート環境へデプロイします。

docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

ブラウザでゲストブックのIPアドレスに戻り、再読み込みしてください。変更が反映され、しかも登録済みのデータはそのまま保持されています!

次のステップ

さらに一歩進めるために、次はどんな改善が考えられるでしょうか?

データはアプリケーションにとって最も重要な資産です。その安全性を確保することが不可欠です。まずはバックアップ計画から始めましょう。独自の仕組みを構築し、cronジョブでデータベースのダンプをCloud Filesに定期的に保存する方法もあります。あるいは、手軽な選択肢としてCloud Backupサービスを利用するのもよいでしょう。さらに本格的に取り組むなら、高可用性のCloud Databaseを作成し、docker-compose.ymlをそちらを参照するように変更するのも有効な一案です。

まとめ

この記事を通じて、リモートの本番環境にできるだけ近い環境でアプリケーションを開発する方法を学べたのではないでしょうか。Docker MachineとComposeを組み合わせれば、ローカルと本番のギャップを最小限に抑えられます。手順の中で問題に遭遇した場合は、ぜひ下のコメント欄でお知らせください。

  1. ObjectRocketのElasticsearchでKibana 4をDockerコンテナで稼働させる方法

    数百万件(あるいは数十億件!)にも及ぶElasticsearchのドキュメントを、見栄えの良いチャート・グラフ・テーブルに変換したいとお考えなら、答えはKibanaです。KibanaはElastic社が提供するプロダクトであり、Elasticsearchと密接に連携し、膨大なデータを直感的に分析するための使いやすいインターフェースを提供します。現在、ObjectRocketのすべてのElasticsearchインスタンスにはKibana 3がプリロードされており、各HTTPエンドポイントの「/_plugin/kibana」からアクセスできます。しかし、Kibana 4には多くの改善点や新機能が

  2. 初心者でも安心!BluefishとKompoZerで始める簡単ウェブ開発

    ホームページを作りたいけれど、何から手をつければいいのか分からない——そんな悩みを抱えていませんか?ウェブサイトをゼロから構築するのは決して簡単な作業ではありません。アイデアが必要で、デザインが必要で、サイトを組み立てるためのツールも必要です。さらに、実際に制作を始める前には、ウェブの言語であるHTMLにある程度慣れておく必要があると思われがちです。しかし、必ずしもそうとは限りません。HTMLやXHTML、CSSなどの関連言語のエキスパートでなくても、十分に見栄えのするウェブサイトは作れます。少なくとも一つの言語に精通していれば確かに有利ですが、意欲さえあれば誰でも今日からスタートできるのです