常田です

SoftLayerでDocker利用していますか?

はじめに

Dockerを利用する上でDockerfileのBuildをどうされていますでしょうか?
既に自動化をしているユーザも多いかと思います。サービスを利用する場合にはDockerHubを使われているのでしょうか?

今回は「IBM Bluemix DevOpts Service」を利用してBiuldを実施してDocker Automated Build を実行する環境をつくる方法をご紹介します。流れ的には以下の図のようになります。

NewImage

環境

  • 最終的なDockerコンテナの実行環境:SoftLayer上のサーバ
  • Dockerのレポジトリ: IBM Container (Bluemix上のDocker as a Service) のプライベートリポジトリ
  • ビルド環境:IBM Bluemix DevOps Service
  • ソース管理:IBM Bluemix DevOps ServiceないのGitレポジトリ

あまり有名ではないような気がしますが、IBM Bluemix DevOpsのJazzHubというサービスでは無料でGitのプライベートレポジトリを持つ事ができます。また機能としてBuildをしたりするPipeLineという機能がありCommitされたことを監視して何かアクションを実行したり出来るなど結構面白いサービスがありますのでもしこの機会に興味を持たれた方は使ってみては如何でしょうか。

事前準備

  • ここではSoftLayerおよびBluemixのアカウントを所有している事を想定しています。

環境構築

IBM Bluemix DevOps Serviceの用意

  • サイト https://hub.jazz.net/ へアクセスをします。
  • NewImage
  • 「Create Project」を選択します。
  • Create Projectの画面にて、プロジェクト名を入力します。
  • レポジトリには内部のレポジトリを利用するか、外部のGithubを連携するかを選択することが出来ますのでここでは「Create a new repositry」を選択します。
  • 次にRepositryの場所を選択肢ますので「Create Git repo on Bluemix」を選択します
  • NewImage
  • その後にはオプションの設定がありますのでディフォルトのままにします。
  • NewImage
  • 最後の「Make this a Bluemix Project」でBluemixのアプリケーションへのデプロイが出来るようになります。
  • Createをすると初期画面が起動してきます。
  • NewImage

これでGitレポジトリを用意する事ができました。
機能は少し劣りますがGithubやBitbucketの様に利用するのも良いかとお思います。「TRACK &PLAN」ではIssue管理のような事も可能です。

最初のソースのアップロード

今回はサンプルとしてDocker社のサイトに有る簡単なnodejsのDockerfileを利用してアプリケーションを作成したいとお思います。

よくある作業となりますが最初の先ほどの画面に従いプロジェクトをクローン(ダウンロード)して必要なファイルを用意してい行きましょう。作業には git が導入されたPCが必要となります。実際にはローカルで開発などを実施すると思われるのでDockerが導入されたサーバ等で実施することも多いかと思います。

root@test:~# git clone --no-checkout https://hub.jazz.net/git/tokida/NodejsHello
Cloning into 'NodejsHello'...
Username for 'https://hub.jazz.net': hideaki_tokida@niandc.co.jp
Password for 'https://hideaki_tokida@niandc.co.jp@hub.jazz.net':
Checking connectivity... done.
root@test:~# cd NodejsHello
root@test:~/NodejsHello# echo "# NodejsHello" >> README.md
root@test:~/NodejsHello# git add README.md
root@test:~/NodejsHello# git commit -m "first commit"
[master (root-commit) 0dbac37] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
root@test:~/NodejsHello# git push -u origin master
Username for 'https://hub.jazz.net': hideaki_tokida@niandc.co.jp
Password for 'https://hideaki_tokida@niandc.co.jp@hub.jazz.net':
Counting objects: 3, done.
Writing objects: 100% (3/3), 226 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Processing changes: refs: 1, done
To https://hub.jazz.net/git/tokida/NodejsHello
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

これで画面側は以下のようになります。最初にコミットするとMasterブランチができていますので次の自動Buildの設定ができるようになります。

NewImage

自動Buildの準備

次に先ほど作成したリポジトリに対してソースがコミットされた際に自動的に docker buildを行い、Bluemix上のDocker Registryに対してPushをするようにしたいと思います。実は最初からこれが実施できるように設定がプリセットされていますので非常に楽に実施することが出来ます。

  • NewImage
  • 右上にある「Build & Deploy」をクリックします
  • NewImage
  • 次の画面で「ステージ」を作っていきます。これは複数のステージを組み合わせて色々なことを自動化するように出来る仕組みになっています。

補足

  1. 「入力」として可能なのはプロジェクト SCM リポジトリーまたは先行ステージからのビルド成果物のいずれかです。 入力はそのステージ内のすべてのジョブに適用されます。 ステージが実行されると、入力がフェッチされます。 各ジョブが始まる前にファイルが作業ディレクトリーに置かれます。

  2. 「ジョブ」は、ビルド、デプロイ、テストなどの、ステージの作業を実行します。 ステージのジョブは順次実行され、各ジョブはクリーンなコンテナー環境で実行されます。 ファイルはジョブ実行間で継承されないので、ジョブが必要とする依存関係はステージ入力で提供されるか、またはジョブの一部として組み込まれなければなりません。

  • NewImage
  • 名前は任意につけます(今回は docker build ) 。入力タイプはSCMレポジトリを選択します。次に「ジョブ」タブを選択します。
  • NewImage
  • ジョブの追加をクリックしてジョブを追加します。
  • NewImage
  • 今回は「ビルド」を選択します。
  • NewImage
  • ビルダー・タイプに「IBM Container Service」のプリセットを選択するとBuild+Pushを自動的に実施することが出来ます。イメージ名を適当に入力ます(ここでは nodejshello )
  • NewImage
  • このようなステージが出来れば完成です。

DockerfileのBuildからDeploy

DockerfileのCommitの実施

次の手順に従い dokerfile 等を用意して下さい。

root@test:~/NodejsHello# ls -la
total 28
drwxr-xr-x  3 root root 4096 Dec 17 17:14 .
drwx------ 10 root root 4096 Dec 17 17:02 ..
-rw-r--r--  1 root root  349 Dec 17 02:15 Dockerfile
drwxr-xr-x  8 root root 4096 Dec 17 17:03 .git
-rw-r--r--  1 root root  253 Dec 17 03:03 index.js
-rw-r--r--  1 root root  246 Dec 17 02:14 package.json
-rw-r--r--  1 root root   14 Dec 17 17:03 README.md

ファイルを作成したらソースをアップします。

root@test:~/NodejsHello# git add .
root@test:~/NodejsHello# git commit -m "first commit"
[master dfd0945] first commit
 3 files changed, 40 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 index.js
 create mode 100644 package.json
root@test:~/NodejsHello# git push -u origin master
Username for 'https://hub.jazz.net': hideaki_tokida@niandc.co.jp
Password for 'https://hideaki_tokida@niandc.co.jp@hub.jazz.net':
Counting objects: 6, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 937 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
remote:
remote: Processing changes: refs: 1, done
To https://hub.jazz.net/git/tokida/NodejsHello
   0dbac37..dfd0945  master -> master
Branch master set up to track remote branch master from origin.
root@test:~/NodejsHello#

コミットされると先ほどの「Build & Deploy」の画面が変換します。

  • まずキューに入ります。
  • NewImage
  • 「ログおよび履歴の表示」でログを見ることが出来ます
  • NewImage
  • 実行されている画面
  • NewImage
  • 完了した画面
  • NewImage

実際にBluemix側のコンテナイメージの画面を参照すると先ほどのイメージがアップされているのがわかります。Bluemixのコマンドライン (cf ic)を利用すると通常の docker images のようにコマンドラインで表示することも可能です。

カタログ IBM Bluemix

次に中を見てみますと脆弱性診断がエラーになっていることがわかります。

Nodejshello IBM Bluemix

これらのエラーを解消するために色々記載があります。

NewImage

折角なので修正してみましょう。

(全部は出来ないので少しだけ修正してみました、本番で使う際には対応していきたいですね)

修正を行い再度プッシュします。

NewImage

このように次に実行されるとタグにある番号は自動的に1つ増えていくようです。

NewImage

修正をして問題がないまで行っておきましょう。
(今回は yum update を行うことでPackageのバージョンチェックはOKになっています)

Dockerイメージの実行

実行するためにはDockerイメージをPullしなければいけないのですがBluemixのRepositryから直接ダウンロードするためのアカウント情報が解らず(調べきれず)今回は cf というコマンドラインを利用してイメージを取得します。(この処理をすると ~/.docker/config.json にbluemixのクレデンシャル情報が記載されます。コマンドを利用せずにこの情報をREST APIなどから取得できればツールの導入は不要だと思うのですが)

準備

今回はSoftLayer上の仮想サーバで実行したいと思います。

cf コマンドをダウンロードします。goでできているのでバイナリ1つです。

wget -o cf.tgz https://cli.run.pivotal.io/stable?release=linux64-binary&version=6.14.0&source=github-rel
tar xvzf cf.tgz
mv cf /usr/local/bin/

次にDocker用のプラグインを導入します。

cf add-plugin-repo bluemix http://plugins.ng.bluemix.net
cf install-plugin -f IBM-Containers -r bluemix

これでBluemix側のイメージが参照できるようになります。

スクリーンショット 2015 12 18 午前8 50 15

実行

通常のdockerコマンドで行いたいと思いますが先ほど同様に事前に cf login をしておきます。

cf login
cf ic login
docker pull registry.ng.bluemix.net/tokida/nodejshello:2

実行は普通に行うことが出来ます。

root@test:/etc# docker run -d -p 8888:8080  registry.ng.bluemix.net/tokida/nodejshello:2
c6d907a3710fa12004abb0d8701d681a4ce110e66a3c57709a2aac23db80a56a
root@test:/etc# curl http://localhost:8888
Hello world

まとめ

今回はプリセットされたIBM ContainerのレポジトリへPushして利用しましたがスクリプトなども実行できますのでこの辺りは柔軟にカスタマイズが出来そうです。DevOps Serviceは無料で利用可能ですのでプライベートレポジトリでこの辺りの機能を「サービス」として利用してみたい方は是非使ってみてはと思います。今回はDockerを実行させるのにSoftLayerのサービスを利用しましたがBluemixのIBM Containerサービスを利用する場合にはDevOpsからのプリセットでデプロイすることも簡単に可能です。

IBMのDocker レポジトリからの取得に際してクレデンシャル情報を取得する方法がわかればもっと簡単に利用できるかなと思います。SoftLayerではCoreOSがDocker用として提供されていますのでこちらと上手く組み合わせて利用できればと思います。

最後にIBM Containerのレポジトリサーバのバージョンが古いのか「this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker.」って注意されるので対応を待ちたいと思います。