目次


Docker と Bluemix を使用して golang アプリをコンテナー化する

Swift Object Storage をバックエンドに使用し、コンテナー化された golang フォト・アルバム Web アプリを作成してデプロイする

Comments

Docker は DevOps のためだけのものではありません。専門家によって管理された Docker コンテナーを統制のとれた使い方をすることで、今どきの多言語開発者の作業をつらくない、愉しいものにすることができます。私が作成した関連チュートリアル「Docker: 今どきの開発者への朗報」では、Docker を使用することで大切な開発ワークステーションを混乱状態に陥れることなく、数秒でアプリの開発を Node.js、Java EE、Python、NoSQL の間で切り替えられるようにする方法を紹介しました。Docker によって極めて高いアジリティーがもたらされ、日々の開発ワークフローにおいて厄介な作業がなくなり、生産性が向上します。

このチュートリアルでは、Go プログラミング言語 (golang) で作成されてコンパイルされるとバイナリーとして生成されるハイパフォーマンスの Web アプリケーション ― フォト・アルバム ― を追加することで、さらに大きな一歩を踏み出します。皆さんのワークステーションに golang をインストールしなくても、数秒で golang 開発およびテスト環境を立ち上げて使用できる状態にすることが可能です。さらに、公式の golang Docker コンテナーを使用して、golang アプリの依存関係を管理するとともに golang アプリケーションをコンパイルする方法も紹介します。

また、golang による Web ベースのフォト・アルバム・アプリでは、OpenStack Swift Object Storage が使用され、皆さんのシステム上でフォト・アルバム・アプリをテストするために、(通常、OpenStack のセットアップに関連して行われるダウンロードと構成はエラーを伴いがちで数時間程度かかるのに対し) 数秒で OpenStack Swift 実装を実行状態にすることができます。

最後に同じく重要なこととして、Docker 化された golang フォト・アルバム・アプリの完成版を IBM Containers for Bluemix を介して IBM Bluemix にデプロイし、Bluemix Object Storage サービスのインスタンスに接続します。

IBM Containers for Bluemix を使用すれば、コンテナー化されたアプリはこれまでにないほどの効率で、開発から、テストを行って、スケーリングされるクラウド・ベースの本番環境へデプロイするところまで行えるようになります。

必要となるもの

Bluemix アカウントをお持ちでない方はサインアップする必要があります。さらに、このチュートリアルを開始する前に、以下の前提条件を満たす必要があります。

ソフトウェア

背景知識となる読み物

「アプリを実行する」ボタンをクリックし、完成版のアプリを試してください。このアプリは、Object Storage サービスによって管理されるストレージをバックエンドとして IBM Containers for Bluemix 上で実行されます。このバージョンでは、アーカイブのサイズを制限するために写真のアップロードは無効にされています。皆さんが独自にデプロイしたバージョンでは、この制約はないはずです。

ステップ 1. 必要な Docker イメージをプルする

以下のコマンドを実行し、このチュートリアルで使われている Docker イメージをローカル PC にプルダウンします。

docker pull golang:1.4

docker pull morrisjobke/docker-swift-onlyone

docker pull pallet/swiftclient

docker pull busybox

ステップ 2. golang フォト・アーカイブ用のコード・リポジトリーを複製する

プロジェクトのソース・コードをローカル PC に複製します。

git clone https://github.com/sing-li/dockergophoto.git

複製したコードを展開すると、他の 3 つの GitHub リポジトリーに依存していることに気付くはずです。

ステップ 3. gophoto アプリの依存関係を追加する

golang をコンパイルするとバイナリー・コードが生成されますが、コンパイルを成功させるには、その前にすべての依存関係を解決しなければなりません。

  1. 公式の golang Docker コンテナーを使用することで、gophoto の依存関係を gopath サブディレクトリーにダウンロードします (以下の 3 つのコマンドのそれぞれを 1 行で入力します)。

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/codegangsta/martini

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/codegangsta/martini-contrib/render

    docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go get github.com/ncw/swift

    gopath サブディレクトリーは、コンテナー内部で /go としてマッピングされることに注意してください。実行時のコンテナーには、/go を指す GOPATH 環境変数があります。

  2. ls -R gopath を実行します。このコマンド出力で、依存関係のあるすべてのパッケージが gopath サブディレクトリーの下にダウンロードされたことを検証します。

    gopath:
    pkg src

    gopath/pkg:
    linux_amd64

    gopath/pkg/linux_amd64:
    github.com

    ...

ステップ 4. コードをコンパイルする

依存関係のあるパッケージがダウンロードされたので、アプリをコンパイルしてバイナリーを生成します (以下のコマンドを 1 行で入力します)。

docker run --rm --net="host" -v "$PWD":/usr/src/myapp -v "$PWD/gopath":/go -w /usr/src/myapp golang:1.4 go build gophoto.go

これによって、テスト対象となる gophoto 実行ファイルが生成されます。このファイルをテストするには、その前に OpenStack Swift Object Storage サービスが使用可能になっている必要があります。

ステップ 5. OpenStack Swift Object Storage サービスをローカルで実行してテストをする

迅速に OpenStack Swift Object Storage サービスを起動してテストをするために、Docker Hubdocker-swift-onlyone イメージを使用します。

docker run -d -v $PWD/data:/srv --name SWIFT_DATA busybox

docker run -d -p 12345:8080 --volumes-from SWIFT_DATA -t morrisjobke/docker-swift-onlyone

これで、localhost:12345 で Object Storage サービスにアクセスできるようになります。

ステップ 6. 写真を保持するために Object Storage コンテナーを作成する

gophoto アプリは、アルバム用のすべての写真を保管するために「myphotos」という名前の Object Storage コンテナー (Docker コンテナーと混乱しないでください) を必要とします。この Object Storage コンテナーを作成するには、swiftclient Docker イメージを使用します (以下のコマンドを 1 行で入力します)。

docker run -it --rm --net="host" pallet/swiftclient swift -A http://127.0.0.1:12345/auth/v1.0 -U test:tester -K testing post myphotos

ステップ 7. gophoto アプリをローカルでテストする

現時点で以下の状態になりました。

  • カレント・ディレクトリーには、gophoto.go からコンパイルされた gophoto golang プログラムのバイナリーがあります。
  • OpenStack Swift Object Storage サービスが http://127.0.0.1:12345/ で実行されています。
  • myphotos」という名前の OpenStack Swift Object Storage コンテナーがあります。

以上のものが用意されたので、アプリをローカルでテストする準備は整いました。

  1. ./gophoto を実行して gophoto アプリを起動します。すべてが期待通りに動作すれば、アーカイブにアクセスするために使用される資格情報のコンソール・ログと、現在このアプリはポート 3000 をリッスンしていることを示すステータス・メッセージを確認することができます。 アプリがポート 3000 をリッスンしていることを示す画面のスクリーンショット
    アプリがポート 3000 をリッスンしていることを示す画面のスクリーンショット
  2. ブラウザーを起動して http://localhost:3000/ にアクセスします。すると、アルバム・アプリが実行中であるのを確認することができます (アルバムにはまだ写真がありません)。 アルバム・アプリを実行している画面のスクリーンショット
    アルバム・アプリを実行している画面のスクリーンショット
  3. 左上のボタンをクリックし、写真を 2 ~ 3 枚アップロードして (ソース・コードの photos ディレクトリーでいくつかのサンプルを見つけます)、保管されている写真をパラパラめくります。 保管されている写真を示す画面のスクリーンショット
    保管されている写真を示す画面のスクリーンショット

アプリの開発中には、コードに変更を加えてテストするという作業を迅速に行うことができます。それには、swift-only-one サービス・インスタンスをバックエンドに使用して、アプリケーションを再コンパイルして (ステップ 4 を参照) 実行します。

これでローカルでの gophoto アプリのテストが完了したので、IBM Containers for Bluemix を使用してこのアプリを Bluemix にデプロイする準備はほぼ整いました。

ステップ 8. コンテナー化されたアプリのイメージをローカルでビルドする

ここまで、専門家によって管理された Docker イメージを使用してきましたが、皆さん独自のイメージはまだ作成していません。そこで、単純なイメージをビルドして、IBM Containers for Bluemix を介してコンテナー化されたアプリとして gophoto アプリをデプロイする必要があります。

  1. 皆さんの PC 上でまだ実行されているコンテナー (docker-swift-onlyone など) があれば、そのコンテナーを終了します。スーパーユーザーとして、docker-swift-onlyone コンテナーの data ディレクトリーを削除します。
  2. Bluemix にログインします。

    cf login

  3. コンテナー拡張機能にログインします (プライベート・コンテナー・リポジトリーにアクセスするために必要です)。

    cf ic login

  4. ソース・コード内で Dockerfile を調べ、このファイルによって以下の処理が行われることに留意します。
    • そのまま実行できる状態の gophoto バイナリーをホスト・システムからイメージ内の /goapp ディレクトリーにコピーします。
    • public ディレクトリーをイメージにコピーします。
    • tmpl ディレクトリーをイメージにコピーします。
    • コンテナーが起動されたときに、/goapp/gophoto を実行ファイルとして実行します
  5. Dockerfile を実行するために、ソース・コードのルート・ディレクトリーから以下のコマンドを実行します。

    docker build -t mygophoto:v1 .

    このコマンドは、皆さんのローカル・リポジトリーに Docker イメージを作成します。

  6. このイメージが現在、皆さんのローカル・システム上にあることを検証するために、以下のコマンドを実行します。

    docker images

ステップ 9. イメージをローカルでテストする

デプロイ済みのコンテナー化された gophoto アプリは、Bluemix Object Storage サービスのインスタンスをバックエンドとして実行する必要があります。このステップでは、皆さんのローカル PC 上で実行されているコンテナーをテストするために、Bluemix 上でインスタンスを作成してリモートで使用します。後で、Bluemix 上であらゆるものが実行される本番環境へデプロイする際にも、同じインスタンスを使用します。

  1. Object Storage サービスを作成します。

    cf create-service "Object-Storage" Free photoservice

    皆さんは、photoservice の代わりに独自のサービス名を選択することができます。
  2. サービスが作成されたことを確認します。

    cf services

    作成したサービスはリストの中にあるはずです。
  3. Bluemix ダッシュボードにログインして、左ペインにあるサービスのリストの中で、新しく作成したサービスを見つけて選択します。
  4. そのサービスの左ペインで「Manage (管理)」をクリックし、右ペインで「Add a container (コンテナーの追加)」リンクをクリックします。Object Storage コンテナーに「myphotos」という名前をつけます。この Object Storage コンテナーに写真をアップロードすることになります。
  5. このサービスの左ペインで「Service Credentials (サービス資格情報)」をクリックし、右ペインで「Add Credentials (資格情報の追加)」ボタンをクリックします。
  6. 資格情報を追加し、任意の名前を指定します。この資格情報 JSON オブジェクトをコピーして保存します。
  7. 設定する必要がある V2CREDS 環境変数は、保存したばかりの資格情報 JSON オブジェクトのサブセットです。以下のコマンドでイメージをテストします (コマンドは 1 行で入力します)。このコマンドでは、パラメーター auth_urldomainuseridpassword の値として、イタリックで示された値の代わりに、保存した auth_urldomainNameuserNamepassword の値を設定します。

    docker run -p 3000:3000 --name testonly --env "V2CREDS={\"CloudIntegration\": {\"auth_url\":\"https://identity.open.softlayer.com\",\"domain\":\"7adaef92- aeffeed\",\"credentials\":{\"userid\":\"user_b0e399c05baa037c48ce321d95b769\",\"password\": \"nopassis232m\"}}}" mygophoto:v1

    このコマンドによって、ホストとして皆さんの PC を利用して実行される、コンテナー化された gophoto アプリが起動され、先ほど作成した Bluemix 上のリモート Object Storage サービスをバックエンドとして動作します。
  8. ブラウザーで http://localhost:3000/ を指定して、実行中のコンテナーにアクセスしてみます。
  9. ソース・コードの photos ディレクトリーにある写真をいくつかアップロードします。

ステップ 10. テスト済みのイメージをプライベート Bluemix イメージ・リポジトリーにプッシュする

コンテナー化されたアプリのイメージについては、今テストしました。ここで、皆さんのプライベート Bluemix コンテナー・リポジトリー用のイメージを準備します (皆さんのリポジトリーの名前空間がわからない場合には、cf ic namespace get で取得します)。

  1. イメージにプライベート・リポジトリー名でタグを付けます。

    docker tag mygophoto:v1 registry.ng.bluemix.net/<皆さんの名前空間>/gophoto

  2. タグが付けられたイメージを皆さんのプライベート Bluemix repository リポジトリーにプッシュします。

    docker push registry.ng.bluemix.net/<皆さんの名前空間>/gophoto

  3. 皆さんのプライベート Bluemix リポジトリー内にあるイメージを一覧表示します。

    cf ic images

    これで、イメージ・リストの中でプッシュされた gophoto イメージを確認することができます。

    $ cf ic images
    REPOSITORY                                        TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    registry.ng.bluemix.net/singli/gophoto            latest              852a060ac7de        53 seconds ago      0 B
    registry.ng.bluemix.net/ibm-mobilefirst-starter   latest              5996bb6e51a1        13 days ago         770.4 MB
    registry.ng.bluemix.net/ibm-node-strong-pm        latest              ef21e9d1656c        3 weeks ago         528.7 MB
    registry.ng.bluemix.net/ibmliberty                latest              2209a9732f35        3 weeks ago         492.8 MB
    registry.ng.bluemix.net/ibmnode                   latest              8f962f6afc9a        3 weeks ago         429 MB

ステップ 11. スケーラブルなコンテナー・グループを作成して、インターネットでアクセス可能なルートをマッピングする

パブリック・インターネット・アクセス用に IBM Containers for Bluemix コンテナーを公開する場合、次の 2 つの選択肢があります。

  • 固定 IP アドレスを 1 つの IBM Containers for Bluemix インスタンスにバインドする。
  • スケーラブルなコンテナー・グループにルートをマッピングする。このルートとは、通常の Cloud Foundry Bluemix アプリに対するルートのようなもので、mybluemix.net のサブドメインとなります。

ここでは、2 番目の方法に従って、スケーラブルなコンテナー・グループを作成します。

  1. mygophoto」という名前のスケーラブルなコンテナー・グループを作成し (以下のコマンドを 1 行で入力します)、ステップ 9 で詳しく説明したように、皆さんがお持ちの Object Storage サービス資格情報を反映するよう V2CREDS を設定します。

    cf ic group create --max 1 -p 3000 -m 256 --name mygophoto --env "V2CREDS={\"CloudIntegration\":{\"auth_url\":\"https://identity.open.softlayer.com\",\"domain\":\"7adaef92-aeffeed\",\"credentials\": {\"userid\":\"user_b0e399c05baa037c48ce321d95b769\",\"password\":\"nopassis232m\"}}}" <皆さんの名前空間>/gophoto

    スケーラブルなコンテナー・グループの作成に成功したというメッセージには、コンテナーの 1 つのインスタンスが起動されたことが示されています。

    スケーラブルなコンテナー・グループの作成に成功したというメッセージを表示する画面のスクリーンショット
    スケーラブルなコンテナー・グループの作成に成功したというメッセージを表示する画面のスクリーンショット
  2. スケーラブルなコンテナー・グループが現在実行中であることを確認します。

    cf ic group list

    スケーラブルなコンテナー・グループに関するステータス、CREAT_COMPLETE を確認することができます。 スケーラブルなコンテナー・グループに関するステータスを表示する画面のスクリーンショット
    スケーラブルなコンテナー・グループに関するステータスを表示する画面のスクリーンショット
  3. 実行中のスケーラブルなコンテナー・グループにルートをマッピングし、パブリック・インターネットを通じてアクセスできるようにします。

    cf ic route map -n <皆さんのルート名> -d mybluemix.net mygophoto

    ルートには一意の名前を選択する必要があります。

ステップ 12. Bluemix にデプロイされた、コンテナー化された gophoto アプリを試す

ブラウザーで http://<皆さんのルート名>.mybluemix.net/ にアクセスし、アプリを開きます。

ブラウザーに表示されたアプリの画面のスクリーンショット
ブラウザーに表示されたアプリの画面のスクリーンショット

これで、インターネット接続された任意の端末から、皆さんのアルバムにアクセスして、gophoto アーカイブに写真をアップロードできるようになりました。

まとめ

Docker コンテナー・テクノロジーをインテリジェントに使用することで、開発者のアジリティーと生産性を桁違いに高めることができます。Docker コンテナー・テクノロジーを使用しなければ、試行錯誤で数時間かかる (あるいは数日かかる場合さえある)、複雑なツールと環境をインストールして構成する作業が、今では数秒で済ませることができます。インストールと構成のエキスパートが持つ知恵と知識が、コンテナー化されたアプリのイメージ内にカプセル化されています。そして Docker は、DevOps とコンテナー化されたアプリのステージング環境または本番環境へのデプロイに最適なテクノロジーです。IBM Containers for Bluemix を使用すれば、コンテナー化されたアプリはさらなる可能性が広がり、これまでにないほどの効率で、開発から、テストを行って、スケーリングされるクラウド・ベースの本番環境へデプロイするところまで行えるようになります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Cloud computing
ArticleID=1030317
ArticleTitle=Docker と Bluemix を使用して golang アプリをコンテナー化する
publish-date=04282016