目次


Docker と Kubernetes を導入する

次世代の DevOps に不可欠の要素となる Docker コンテナーと Kubernetes クラスターの使用方法を学ぶ

Comments

Docker と Kubernetes の 2 つは、IT の世界で最も注目を集めているテクノロジーです。このチュートリアルに従えば、この両方のテクノロジーを IBM Cloud 内で利用できるようになります。何よりも、このチュートリアルで説明する作業はすべて、無料の IBM Cloud Lite アカウント内で行うことができます (補足記事を参照)。

  1. このチュートリアルでは以下の方法を説明します。
  2. サンプル・コードを入手して、必要なツールをインストールする
  3. Docker イメージをビルドして、そのイメージをローカル・マシン上で実行する
  4. IBM Cloud 内で Kubernetes クラスターを作成する
  5. IBM Cloud 内で Docker イメージを作成する
  6. Docker イメージを Kubernetes クラスターにデプロイする

サンプル・コードを入手する

まず始めに、サンプル・コードが格納されている Github リポジトリーを複製します。これからデプロイするアプリケーションは、単純な「Hello World」ページに Dockerfile を結合したものです。この Dockerfile によってアプリケーションを Docker イメージにビルドします。サンプル・コードは github.com/DougTidwell/dWTVSimpleContainerApp にあります。

dWTVSimpleContainerApp リポジトリーのホーム・ページのスクリーン・キャプチャー

dWTVSimpleContainerApp リポジトリーのホーム・ページのスクリーン・キャプチャー

リポジトリーを複製するには、コマンド・ラインに git clone https://github.com/DougTidwell/dWTVSimpleContainerApp.git と入力します。その後、複製されたリポジトリーのディレクトリー (cd dWTVSimpleContainerApp) にカレント・ディレクトリーを変更します。

GitHub リポジトリー複製時の出力を示す画面のスクリーン・キャプチャー

GitHub リポジトリー複製時の出力を示す画面のスクリーン・キャプチャー

サンプル・コードがマシン上にインストールされたので、次は、コンテナーとクラスターの世界を制覇するために必要なツールをインストールします。

先に進める前に...

コンテナーを話題にする記事の決まりとして、貨物船の絵を入れておかなくてはなりません。そうです、以下に記載するようなにコンテナーを運ぶ船の絵です。

海の真ん中で巨大なイカに襲われているコンテナー船の絵

海の真ん中で巨大なイカに襲われているコンテナー船の絵

この必須の気分転換をお楽しみいただけたでしょうか。

必要なツールをインストールする

docker build を実行したり、Docker と Kubernetes を使用して何らかの処理を行ったりするには、その前に、IBM Cloud、Docker、Kubernetes を操作するためのツールをインストールする必要があります。

IBM Cloud ツールをインストールする

最新バージョンの IBM Cloud ツールを入手するためには、console.bluemix.net/docs/cli/index.html#downloads にアクセスして、「Download (ダウンロード)」リンクをクリックします。お使いのプラットフォームに対応するツールをダウンロードして、インストーラーを実行します。

IBM Cloud ツールのダウンロード・ページのスクリーン・キャプチャー

IBM Cloud ツールのダウンロード・ページのスクリーン・キャプチャー

: これまでの経緯から、IBM Cloud のリソースを処理するためのコマンドは bluemix となっています。コマンドを実行するたびに 7 文字すべてを入力するのは骨が折れるだろうと不安に感じているかもしれませんが、ご心配なく。私たちはこのコマンドを bx に省略して使えるようにしました。このショートカットによって毎日の入力作業が何時間も節約されることがわかるでしょう。節約した時間の分、家族や友人と一緒に過ごしたり、長いことほったらかしにしていた趣味に没頭したりできます。あるいは、家計をやりくりするために副業を始めるのでも構いません。

感謝の言葉をありがとうございます!

Docker をインストールする

次のステップは、Docker と Docker 関連のコマンド・ライン・ツールをインストールすることです。それには、docker.com にアクセスして「Get Docker (Docker を入手)」リンクをクリックします。

docker.com から Docker ツールをダウンロードするページのスクリーン・キャプチャー

docker.com から Docker ツールをダウンロードするページのスクリーン・キャプチャー

Docker Community Edition をダウンロードしてインストールしてください。プラットフォームによっては、インストールを続けるにはシステムを再起動する必要があるというメッセージが表示されることがありますが、再起動するのは Kubernetes ツールのインストールが完了するまで待ってください。

Kubernetes ツールをインストールする

Kubernetes は使用するのはこの記事の後のほうですが、この時点で kubectl ツールもインストールしておきます。kubernetes.io/docs/tasks/tools/install-kubectl/ にアクセスして、お使いのプラットフォームに応じた手順に従って kubectl をインストールしてください。

kubectl インストール・ページのスクリーン・キャプチャー

kubectl インストール・ページのスクリーン・キャプチャー

IBM Cloud 内でクラスターを作成するときには、そのクラスターと連動するように kubectl を構成します。けれどもその段階に辿り着くには、いくつかの作業を片付けなければなりません。とりあえず今のところは、このコマンドをインストールするだけにしておいてください。

IBM Cloud にログオンする

これまでの手順で、IBM Cloud、Docker、Kubernetes のツールをすべてインストールしました。必要に応じてマシンの再起動も行っているはずです。次のステップとして、IBM Cloud アカウントにログインします。コマンド・ラインに bx login と入力してください。

IBM Cloud ログイン時の出力を示すスクリーン・キャプチャー

IBM Cloud ログイン時の出力を示すスクリーン・キャプチャー

IBM Cloud にログインしたら、IBM Container Service 用のプラグインと IBM Container Registry 用のプラグインをインストールします。それには、以下のコマンドを入力します。

  • bx plugin install container-service -r Bluemix
  • bx plugin install container-registry -r Bluemix
  • bx cr login

最初の 2 つのコマンドによって、Bluemix リポジトリーから IBM Container Service と IBM Container Registry のプラグインがインストールされます。最後のコマンドは、IBM Container Registry サービスにログインするためのものです。このコマンドによって、IBM Cloud のパブリック・レジストリー内に保管されている Docker イメージにアクセスできるようになります。

マシン上で Docker のイメージとコンテナーを使用する

Docker を起動する

次のステップはビルドを開始することですが、それにはまず、マシン上の Docker を起動する必要があります。その方法はもちろん、お使いのプラットフォームによって異なります。

Windows

デスクトップ・アイコンをダブルクリックします。

Windows 上の Docker デスクトップ・アイコンのスクリーン・キャプチャー

Docker が稼働中になると、以下に示すメッセージがデスクトップの右下隅に表示されます。

Windows 上の Docker「稼働中」メッセージのスクリーン・キャプチャー

Windows 上の Docker「稼働中」メッセージのスクリーン・キャプチャー

Mac

デスクトップ・アイコンをクリックします。

Mac 上の Docker デスクトップ・アイコンのスクリーン・キャプチャー

Mac 上の Docker デスクトップ・アイコンのスクリーン・キャプチャー

Docker が稼働中の状態になったら、メニュー・バーにある Docker アイコンをクリックします。すると、以下の心安らぐステータス・メッセージが表示されるはずです。

Mac 上の Docker「稼働中」ステータス・メッセージのスクリーン・キャプチャー

Mac 上の Docker「稼働中」ステータス・メッセージのスクリーン・キャプチャー

Linux

Linux 上の Docker を起動する方法はディストリビューションによって異なることがありますが、通常は、以下の 2 つのコマンドのいずれかを実行することになります。

  • sudo systemctl start docker
  • sudo service docker start

Linux 上で Docker を起動できない場合は、Docker の資料で詳細を調べてください。

Docker イメージをビルドする

Docker が稼働中になったので、アプリケーションを格納するイメージのビルドに取り掛かります。前に複製したリポジトリー内に、イメージのビルド方法を Docker に指示する Dockerfile が保管されています。このファイルは以下のような内容になっています。

FROM ibmcom/ibmnode:latest

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app
RUN npm install

EXPOSE 6006

COPY . /usr/src/app

CMD ["node", "app.js"]

ファイル内の各コマンドについて簡単に説明しましょう。

  • 行 1: この行は Docker に対し、イメージのベースとして最新の IBM node.js イメージを使用するように指示します (前に bx cr login コマンドを実行したので、このイメージにアクセスできるようになっています)。
  • 行 3 および 4: ディレクトリー /usr/src/app を作成し、Docker にそのディレクトリーを作業ディレクトリーとして使用するように指示します。
  • 行 6 および 7: package.json ファイルを作業ディレクトリーにコピーし、npm install コマンドを実行してアプリケーションのすべての依存関係をインストールします。
  • 行 9: 着信トラフィックに対してポート 6006 を開くように Docker に指示します。アプリケーションは、このポート上で接続を listen します。
  • 行 11: カレント・ディレクトリー内にあるすべてのファイルを作業ディレクトリーにコピーします。
  • 行 13: Docker に、イメージの起動時に実行するコマンドを指示します。最初のパラメーターは起動時に実行するコマンド、2 番目のパラメーターはそのコマンドの引数のリストです。上記のコードに示されているように、このイメージが起動すると、Docker は node app.js を実行することになります。

コマンド・ラインを表示して、コマンド docker build -t basicapp:v1 . と入力します (このコマンドに含まれているピリオドは、Docker にカレント・ディレクトリーで処理を行うように指示するためのものです)。このコマンドによって、以下のような出力が表示されます。

docker build コマンドの実行結果のスクリーン・キャプチャー

docker build コマンドの実行結果のスクリーン・キャプチャー

皆さんが目にする結果は、これとは異なるでしょう。システム上にはすでに node.js イメージが存在しているため、上記のスクリーン・キャプチャーには Docker がダウンロードする必要のないさまざまな依存関係が示されています。マシン上で初めて docker build を実行する際は、そのマシン上にはイメージに必要なこれらの依存関係はまったく存在していないため、Docker がそれらの依存関係をすべてインストールしなければなりません。以降の docker build 呼び出しは、遥かに短時間で完了するはずです。もう 1 つ注意する点として、この例では npm install コマンドの実行はまだ完了していません。

マシン上で Docker イメージを実行する

初めて Docker イメージをビルドしたことなどで皆さんはもうすっかり興奮されているとは思いますが、先に進めて、そのイメージを実際に実行しましょう。コマンド・ラインに docker create basicapp:v1 と入力します。これによって、皆さんがビルドしたイメージからコンテナーが作成されます。

Docker イメージから Docker コンテナーを作成する際の出力のスクリーン・キャプチャー

Docker イメージから Docker コンテナーを作成する際の出力のスクリーン・キャプチャー

ご覧の通り、この出力はエキサイティングなものではまったくありません。コマンドを実行すると表示される、この長々とした 16 進文字列は何かを意味するはずですが、それが何であるのかは明らかではありません。幸い、Docker コミュニティーでは Docker コンテナーを容易に操作できるようにする素晴らしいツールをいくつか用意しています。Windows 上または Mac 上で Docker を実行している場合は、Kitematic という極めて優れたツールを使用してください。Windows 上ではシステム・トレイから、Mac 上ではメニュー・バーからこのツールを起動します。

Windows 上または Mac 上で Kitematic を起動するメニューのスクリーン・キャプチャー

Windows 上または Mac 上で Kitematic を起動するメニューのスクリーン・キャプチャー

: このチュートリアルを作成している時点で、Windows 上には Kitematic を別途インストールする必要があります。インストール手順については、Docker の資料を参照してください。

Kitematic が起動すると、以下に示すような画面が表示されます。

Kitematic のメイン画面のスクリーン・キャプチャー

Kitematic のメイン画面のスクリーン・キャプチャー

dockerhub カタログには、さまざまな Docker イメージのタイルが表示されます。Jenkins、PostgreSQL、Minecraft、または他のソフトウェアをセットアップするとしたら、それに該当するイメージを使用して簡単にセットアップできます。このカタログで注目する点は、左上隅にある、マシン上で実行されているすべてのコンテナーのリストです。それぞれのコンテナーにはランダムな名前が割り当てられます。上記のスクリーン・キャプチャーでは、作成されたコンテナーの名前は unruffled_swirles となっています。少し前にコマンド・ラインで見た、あの長々とした 16 進文字列よりも、この名前のほうが遥かに覚えやすいのは確かです。

現時点で、Docker コンテナーはマシン上で稼働中になっています。コンテナー内部では基本的な Hello World アプリケーションが実行されていますが、このアプリケーションにアクセスするにはどうすればよいでしょうか?それには、アプリケーション用のポートを定義する必要があります。ポートを定義すると、Docker はそのポート番号への着信リクエストをコンテナー内のポート 6006 にマッピングします (Dockerfile 内で見た EXPOSE 6006 コマンドを思い出してください)。ポートを定義するには、右上にある「Settings (設定)」メニューをクリックし、次に「Ports (ポート)」をクリックします。

「Settings (設定)」メニューの下にある「Ports (ポート)」メニューのスクリーン・キャプチャー

「Settings (設定)」メニューの下にある「Ports (ポート)」メニューのスクリーン・キャプチャー

表示される画面で、Docker コンテナー内のポート 6006 をマシン上のポートにマッピングできます。以下に示されているのは、ポート 32008 を使用する場合の例です。

Docker ポートとローカル・ホスト上のポートをマッピングする画面のスクリーン・キャプチャー

Docker ポートとローカル・ホスト上のポートをマッピングする画面のスクリーン・キャプチャー

「Save (保存)」をクリックしてマッピングを保存した後、ブラウザーに戻って http://localhost:32008 にアクセスしてださい。実行中の Hello World アプリケーションが表示されるはずです。

Docker コンテナー内で実行されている Hello World アプリケーションのスクリーンショット

Docker コンテナー内で実行されている Hello World アプリケーションのスクリーンショット

おめでとうございます!これで、Docker イメージを作成してマシンにデプロイする作業と、Docker ランタイムを構成して Docker コンテナー内で実行されているアプリケーションにブラウザーからアクセスできるようにする作業を無事に完了しました。

Linux の場合、このチュートリアルを作成している時点では Linux 対応の Kitematic はありません。同様の機能を備えたツールとして、Portainer を試してください。

Portainer コンソールのスクリーン・キャプチャー

Portainer コンソールのスクリーン・キャプチャー

Portainer は Docker イメージとしてパッケージ化されているので、Portainer をインストールするには、Docker にこのイメージをダウンロードして実行するように指示する以外の作業は必要ありません。詳細については、このリンク先の portainer.io を参照してください。

IBM Cloud 内で Kubernetes クラスターを作成する

最終的な目標は、Docker コンテナー内で実行されるアプリケーションを Kubernetes クラスターにデプロイすることです。クラスターが稼働中になるまでには数分かかるので、まずはクラスターを作成するための作業を完了させましょう。Docker のデプロイはその後で行います。IBM Cloud コンソールで、左上隅にあるメニューを表示し、「Containers (コンテナー)」を選択します。

「Containers (コンテナー)」メニュー項目のスクリーン・キャプチャー

「Containers (コンテナー)」メニュー項目のスクリーン・キャプチャー

表示されるページの中央にある「Create cluster (クラスターを作成)」ボタンをクリックします。

「Create cluster (クラスターを作成)」ボタンのスクリーン・キャプチャー

「Create cluster (クラスターを作成)」ボタンのスクリーン・キャプチャー

この作業の仕上げとして、クラスターに名前を付けて (以下の例では、クラスター名は「Mailbag」となっています)、「Lite plan (Lite プラン)」(別名、フリー・プラン) が選択されていることを確認してから、パネルの右側にある「Create cluster (クラスターを作成)」ボタンをクリックします。

クラスターを作成するパネルのスクリーン・キャプチャー

クラスターを作成するパネルのスクリーン・キャプチャー

クラスターがプロビジョニングされて起動されるまでには数分かかります。それまでの間、作業を進めてクラスターにデプロイする Docker イメージを作成します。

IBM Cloud 内で Docker イメージを作成する

ローカル・マシン上で Docker イメージを作成するのも大事なことですが、そのイメージを IBM Cloud 内に取り込まなければ、イメージを Kubernetes クラスターにデプロイすることはできません (先に進める前に、bx cr login コマンドを実行して IBM Cloud のイメージ・リポジトリーにログインした状態になっていることを確認してください)。まず、イメージの名前空間を定義します。一例として mailbag という名前空間を作成するには、以下のコマンドを入力します。

bx cr namespace-add mailbag

名前空間を定義することで、IBM Cloud アカウント内で Docker イメージのグループを作成できるようになります。名前空間を定義するまでは、Docker イメージを作成することもアップロードすることもできません。上記のコマンドを実行すると、結果として以下のような出力が表示されるはずです。

Docker イメージの名前空間を定義するコマンドの出力を示すスクリーン・キャプチャー

Docker イメージの名前空間を定義するコマンドの出力を示すスクリーン・キャプチャー

次は、Docker イメージを IBM Cloud 内のコンテナー・リポジトリーに取り込む必要があります。それには、クラウド内で直接イメージをビルドするという方法、そして既存のイメージをクラウドにプッシュするという方法の 2 つがあります。これから、それぞれの方法を説明します。

IBM Cloud 内で Docker イメージをビルドする

クラウド内にイメージを作成するための bluemix コマンドを使用できます。そのコマンドは、bx cr build -t registry.ng.bluemix.net/mailbag/basicapp:v1 . です (必ず、コマンドの最後にあるピリオドを含めて入力してください)。

IBM Cloud 内で Docker イメージをビルドするコマンドのスクリーン・キャプチャー

IBM Cloud 内で Docker イメージをビルドするコマンドのスクリーン・キャプチャー

このコマンドの出力は、以下のように docker build コマンドの出力と同様です。

docker build コマンドの出力のスクリーン・キャプチャー

docker build コマンドの出力のスクリーン・キャプチャー

bx cr build コマンドは新しいイメージを自動的にイメージ・リポジトリーにプッシュします。bx cr images を入力すると、イメージが作成されて IBM Cloud 内に保管されていることを確認できます。

Docker イメージが作成されて mailbag 名前空間に保管されていることを示す出力のスクリーン・キャプチャー

Docker イメージが作成されて mailbag 名前空間に保管されていることを示す出力のスクリーン・キャプチャー

既存の Docker イメージを IBM Cloud にプッシュする

ビルド済みの Docker イメージをクラウドにプッシュする場合は、以下の 2 つの Docker コマンドを使用します。

  1. docker tag basicapp:v1 registry.ng.bluemix.net/mailbag/basicapp:v2
  2. docker push registry.ng.bluemix.net/mailbag/basicapp:v2

上記のコマンドの結果として、以下のような出力が表示されるはずです。

Docker イメージにタグを付けて IBM Cloud にプッシュするコマンドの出力のスクリーン・キャプチャー

Docker イメージにタグを付けて IBM Cloud にプッシュするコマンドの出力のスクリーン・キャプチャー

: この例では、前のセクションで説明したコマンドによって作成された v1 イメージがすでにリポジトリー内に保管されているという前提で、タグとして v2 を使用しています。2 つのタグ (v1v2) を作成することで、同じイメージの 2 つのバージョンが作成されます。前と同じように、コマンド bx cr images を入力すると、リポジトリー内の Docker イメージがリストアップされます。

kubectl コマンドを構成する

クラスター内で実行されるコンテナーとしてイメージをデプロイし、そのコンテナーを世界に公開するには、bx コマンドと kubectl コマンドの組み合わせを使用します。これらのコマンドを実行するには、その前に、kubectl コマンドを構成して IBM Cloud 内で稼働中のクラスターと連動させるようにする必要があります。以下に、実行するコマンドとそれぞれのコマンドの説明を記載します。

  1. bx cs cluster-config Mailbag
    このコマンドは、Bluemix コンテナー・サービス・プラグインを使用して、前に作成した Mailbag クラスターの構成詳細を表示します。KUBECONFIG 環境変数を設定するには、このコマンドから返されるコマンドをコピー・アンド・ペーストして使用できます。
  2. [KUBECONFIG 変数を設定する]
    このコマンドは、上記のコマンドからの出力に含まれているものです。Linux および Mac 上では export ステートメント、Windows コマンド・ライン上では set コマンドとなります。このコマンドによって、Windows PowerShell 内での $env:KUBECONFIG 定義に必要な情報が返されます。

以上の 2 つのコマンドは、Linux 上または Mac 上では以下のようになります。

KUBECONFIG 環境変数を定義するコマンドのスクリーンショット

KUBECONFIG 環境変数を定義するコマンドのスクリーンショット

(export コマンドは、bx cs cluster-config コマンド出力のカット・アンド・ペーストに過ぎないことに注目してください)。

KUBECONFIG が設定された後は、実行するすべての kubectl コマンドが IBM Cloud 内で稼働中のクラスターに作用するようになります。

Docker イメージを Kubernetes クラスターにデプロイする

現時点で、デプロイ対象の Docker イメージが IBM Cloud 内に保管され、Kubernetes クラスターが稼働していて、kubectl コマンドがクラスターと連動するように設定された状態になっています。

いよいよショータイムです!

目標を達成するには 4 つのコマンドを実行すればよいだけです。以下に、これら 4 つのコマンドとそれぞれのコマンドの説明を記載します。

  1. kubectl run apptest --image=registry.ng.bluemix.net/mailbag/basicapp:v1
    このコマンドは、IBM Cloud コンテナー・リポジトリー内に保管されている Docker イメージ basicapp:v1 をクラスター内で起動します。これによって、apptest という名前の Kubernetes デプロイメントが作成されます。
  2. kubectl expose deployment/apptest --type=NodePort --name=apptest-service --port=6006
    この長々としたコマンドは、apptest デプロイメントを、ポート 6006 上で稼働する apptest-service という名前の NodePort として公開します (NodePort については別の機会に説明することにしますが、フリー・プランのクラスターではこれが唯一の選択肢であるとだけ言及しておきます)。このコマンドの実行が完了した時点で、デプロイメントが作成されてサービスとして公開されます。デプロイメントを作成してサービスを公開するコマンドのスクリーン・キャプチャー
    デプロイメントを作成してサービスを公開するコマンドのスクリーン・キャプチャー
  3. kubectl describe service apptest-service
    このコマンドは、上記のコマンドで公開されたサービスに関する各種の有用な情報を表示します。なかでもとりわけ有用な情報として、Kubernetes がランダムに生成してこのサービスに割り当てたポート情報が表示されます。サービスにランダムに割り当てられたポート番号を示す出力のスクリーン・キャプチャー
    サービスにランダムに割り当てられたポート番号を示す出力のスクリーン・キャプチャー
  4. bx cs workers Mailbag
    最後に、Kubernetes クラスター自体の IP アドレスを確認する必要があります。その情報を返すのが、このコマンドです。Kubernetes クラスターの IP アドレスを示す出力のスクリーン・キャプチャー
    Kubernetes クラスターの IP アドレスを示す出力のスクリーン・キャプチャー

ついに、そのときがきました。クラスターの IP アドレスとサービスのポート番号を確認した後は、ブラウザー内でこの 2 つを組み合わせることで、栄光に満ちた Hello World を表示できます。

Kubernetes クラスター内で稼働中の Docker コンテナー内で実行されている Hello World アプリケーションのスクリーン・キャプチャー

Kubernetes クラスター内で稼働中の Docker コンテナー内で実行されている Hello World アプリケーションのスクリーン・キャプチャー

これで、Docker イメージを Web 上で稼働中の Kubernetes クラスターにデプロイするという目標は達成されました。この Hello World アプリケーションには、世界中の誰もがどこからでもアクセスできます。この偉業の栄光を浴びても、謙虚さは失くさないようにしてください。

まとめ

これで、コンテナーとクラスターの世界を制覇する万全の準備が整いました。皆さんは Docker イメージをビルドする方法も、そのイメージを IBM Cloud にプッシュする方法も、Kubernetes クラスター内にイメージをデプロイする方法もしっかり把握しています。クラスター内の Docker コンテナー内で実行されているアプリケーションは Web 上で有効なので、世界中の誰もが皆さんの制作物を見ることができます。習得しなければならないことは他にも山ほどありますが (クラスター内での資格情報の処理など)、皆さんが着実なスタートを切ったことは確かです。


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


関連トピック


コメント

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, DevOps
ArticleID=1062911
ArticleTitle=Docker と Kubernetes を導入する
publish-date=09062018