はじめに
この記事では、コンテナ化したアプリケーションをIBM Cloud上で提供されているサービス、IBM Code Engineにデプロイする方法をご紹介します。主な手順は以下の通りです。
- ローカル環境でアプリを作成
- コンテナイメージを作成
- ローカル環境でコンテナの実行テスト
- IBM Container RegistryにコンテナイメージをPush
- IBM Container RegistryからIBM Code EngineにコンテナイメージをPullしてデプロイ
想定読者
この記事は、以下のような方を対象としています。
- 技術レベル
- Pythonなどで簡単なアプリを作れる
- Docker(Dockerfileや
docker build
/docker run
など)の基礎を理解している
- 目的・関心
- ローカルで作ったアプリをクラウドにデプロイしたい
- IBM Cloud(特にCode Engine / Container Registry)を使ってみたい
- サーバーレスやコンテナベースのデプロイ手法を学びたい
- 想定する読者像
- クラウドやコンテナ技術を学習中のエンジニア(学生・新人・キャリアチェンジ中)
- 社内や個人開発でIBM Cloudを利用する開発者
- PoCやプロトタイプを短期間でクラウドに載せたい技術者
前提知識と準備
IBM Code Engine(ICE)とは
IBM Code Engine(ICE)は、コンテナベースのサーバーレス・プラットフォームです。一般的には「CaaS(Container as a Service)」と呼ばれ、コンテナレジストリ(コンテナイメージの保管場所)からイメージを取得(Pull)することで、アプリケーションやサービスを簡単にデプロイできます。
Kubernetesを基盤として構築されており、アクセス数の増加に応じた自動スケーリング(稼働中のコンテナ数の動的な調整)に対応しているほか、障害発生時には自動復旧(異常なコンテナの再起動など)も行われるため、柔軟かつ効率的な運用が可能です。また、Kubernetesの複雑な構成やコマンド操作は抽象化されており、ユーザーはその詳細を意識することなく、シンプルに利用できます。
IBM Container Registry(ICR)とは
IBM Container Registry(ICR)は、一般的に「コンテナレジストリ」と呼ばれるサービスで、DockerやRancher DesktopなどでビルドしたコンテナイメージをPush(アップロード)して保管するリポジトリとして機能します。
保管されたコンテナイメージは、コンテナ対応環境(本稿ではIBM Code Engine)に配布・デプロイすることが可能です。これにより、アプリケーションの展開が容易になります。
さらに、IBM Container RegistryにはPushされたイメージに対して自動的にセキュリティスキャンを実行する機能が備わっており、コンテナイメージ内の脆弱性をチェックすることで、セキュリティリスクの低減につながります。
実行環境
本手順は以下の環境を前提に記載していますが、WindowsやLinux環境でも基本的には同様の手順でアプリケーションをデプロイできます。
項目 | 内容 |
---|---|
OS | macOS Sequoia 15.6 |
CPU | Apple M3 Pro |
メモリ | 36 GB |
コンテナ環境 | Rancher Desktop Version 1.19.3 |
Docker Engine | version 28.1.1-rd |
手順1:ローカル環境でアプリを作成
今回はサンプルとして、Gradioで作成した簡素なアプリケーションを作成します。
(入力文字列を反転させるだけの機能を備えたアプリケーション)
項目 | 内容 |
---|---|
アプリケーション内容 | Gradioで入力文字列を反転させるアプリケーションを作成 |
開発言語 | Python |
実行ポート番号 | 8080(IBM Code Engineでは外部アクセス用のデフォルトポート) |
パッケージ管理ツール | Pipenv |
Pythonバージョン | 3.11.7 |
参考までに、Gradioを用いた簡素なアプリケーションのソースコードを以下に掲載します。
<アプリケーションのソースコード>
import gradio as gr
# テキストを逆順にする関数
def reverse_text(text):
return text[::-1]
# Gradioインターフェースを作成
demo = gr.Interface(fn=reverse_text, inputs="text", outputs="text")
# ポート番号を指定してアプリを起動
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=8080)
IBM Code Engineでは、外部アクセス用のデフォルトポートとして 8080番が使用されます。そのため、アプリケーション側でリッスンポートを 8080番に設定しておくことで、特別な設定を行うことなく簡単にデプロイ できます。
なお、他のポート番号もオプションで指定可能なため、必要に応じて変更することもできます。
<仮想環境にインストールするパッケージ>
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
gradio = "*"
[dev-packages]
[requires]
python_version = "3.11.7"
アプリケーションをローカルで実行する際は、下記のコマンドを実行します。
pipenv install # Pipfileに基づいて必要なPythonパッケージをインストール(仮想環境も自動作成)
pipenv shell # Pipenvで作成した仮想環境に入る(以降のコマンドはこの環境内で実行される)
python app.py # app.py(Gradioアプリ)をPythonで実行(アプリケーションを起動する)
手順2:コンテナイメージを作成
Dockerfileを作成
Dockerfileは、コンテナイメージを作成するための設計図のようなものです。以下は、前述のGradioアプリケーションを動作させるためのサンプルDockerfile
です。Pythonパッケージのインストールには、Pipfile
を使用しています。
# ベースイメージとして公式のPythonイメージを使用
FROM python:3.11-slim
# 作業ディレクトリを設定
WORKDIR /app
# 必要なパッケージをインストール(Pipenvをインストール)
RUN apt-get update && apt-get install -y \
build-essential \
&& pip install pipenv \
&& apt-get clean
# PipfileとPipfile.lockをコンテナにコピー
COPY Pipfile Pipfile.lock ./
# Python依存関係をインストール
RUN pipenv install --system --deploy
# アプリケーションコードをコンテナにコピー
COPY . .
# コンテナがリッスンするポートを指定
EXPOSE 8080
# コンテナが起動したときに実行されるコマンドを設定
CMD ["python", "app.py"]
作成したDockerfile
を次のようなフォルダ構成で配置してください。
.
├── app.py
├── Dockerfile
├── Pipfile
└── Pipfile.lock
IBM Container Registryで名前空間を確認
IBM Cloudにログインし、左上のハンバーガーメニューから「リソース・リスト」をクリックすると、利用できるリソースが表示されます。「コンテナー」のプルダウンをクリックし、Container Registry(「製品」列を参照)をクリックします。
プルダウンで予約した適切なロケーション(今回は「東京」)を選択し、名前空間(「名前」列を参照)を確認します。ここでは、cc-697000c3vg-kq0q9xb3-cr
が名前空間です。
Dockerfileを基にコンテナイメージをビルド
コンテナの設計書にあたるDockerfile
を利用して、コンテナイメージをビルドします。
$ docker build . --platform=linux/x86_64 -t jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app:v1
ビルドコマンドの構成要素は次のとおりです。ご自身の環境に応じて適宜書き換えてください。
コマンド | 説明 |
---|---|
docker build |
Dockerイメージをビルドするコマンド。Dockerfile をもとに新しいイメージを作成する。 |
. |
ビルドコンテキスト(現在のディレクトリ)。ここにあるDockerfile や関連ファイルを使用する。 |
--platform=linux/x86_64 |
ビルドするイメージのターゲットプラットフォームを指定。ここではLinux のx86_64 (64ビットIntel/AMDアーキテクチャ)を指定している。 |
-t |
イメージにタグを付けるオプション。<名前>:<タグ> の形式で指定する。 |
jp.icr.io |
IBM Cloud Container Registry のリージョン別エンドポイント。jp は東京リージョンを意味する。ダラスリージョンの場合はus を指定する。 |
cc-697000c3vg-2ious07v-cr |
IBM Cloud Container Registry 上のネームスペース。組織やプロジェクトごとに分けられる領域。 |
gradio-sample-app |
イメージ名。ここでは Gradio を使ったサンプルアプリケーションのイメージを表す。 |
:v1 |
タグ(バージョン番号)。同じイメージ名でも複数バージョンを管理できる。ここではバージョン1を指定している。 |
Mac(特にApple SiliconのM1/M2/M3)でビルドする際、--platform=linux/x86_64
または--platform=linux/amd64
をつけない場合、ホストマシンのアーキテクチャ(linux/arm64
)向けにビルドされるため、IBM Code Engineにデプロイした際にエラーが発生することがあります。
コンテナイメージの確認
コンテナイメージが正常にビルドできたか確認します。
下記のコマンドを実行すれば、作成済みのコンテナイメージ一覧を取得できます。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app v1 fb51ea71fdd2 13 hours ago 1.13GB
手順3:ローカル環境でコンテナの実行テスト
作成したコンテナイメージを指定してコンテナを実行し、正常に動作するかをテストします。
$ docker run -it --platform=linux/x86_64 -p 8080:8080 jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app:v1
* Running on local URL: http://0.0.0.0:8080
* To create a public link, set `share=True` in `launch()`.
docker run
コマンドの構成要素は次のとおりです。ご自身の環境に応じて適宜書き換えてください。
コマンド | 説明 |
---|---|
docker run |
Dockerコンテナを実行するためのコマンド |
-it |
コンテナをインタラクティブモードで実行し、ターミナルに接続可能にするオプション |
--platform=linux/x86_64 |
コンテナを特定のプラットフォーム(ここではLinuxのx86_64アーキテクチャ)で実行する |
-p 8080:8080 |
ホストのポート8080をコンテナのポート8080にマッピングする |
jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app:v1 |
実行するコンテナイメージのリポジトリ名とタグ(バージョン)を指定 |
ブラウザで http://0.0.0.0:8080 にアクセスして、エラーなく正常に動作すれば、実行テスト完了です。
手順4:IBM Container RegistryにコンテナイメージをPush
事前準備(初回のみ)
IBM Container RegistryにコンテナイメージをPushするにはログインが必要になります。コマンドラインからIBM Cloudのリソースを制御するibmcloud
コマンドを利用するため、IBM Cloud CLIというツールをインストールしてください。
IBM Cloudにログイン
ターミナル上の質問に"Y
"を入力し、立ち上がったブラウザに表示されるワンタイムパスワードをターミナルにコピー&ペーストします。
$ ibmcloud login --sso
API エンドポイント: https://cloud.ibm.com
リージョン: jp-tok
https://identity-1.ap-north.iam.cloud.ibm.com/identity/passcode からワンタイム・コードを取得して、続行します。
デフォルトのブラウザーで URL を開きますか? [Y/n] > Y
ワンタイム・コード >
認証中です...
OK
アカウントの選択
アカウント名の前に振られた数値を入力して、ログインしたいアカウントを選択します。
(一部をマスキングしています。)
アカウントを選択:
1. Hironori Uchibori's Account (********************)
2. ************* (********************) <-> *******
3. ************* (********************) <-> *******
4. ************* (********************) <-> *******
5. ************* (********************) <-> *******
6. ************* (********************) <-> *******
7. ************* (********************) <-> *******
8. ************* (********************) <-> *******
9. itz-watsonx-5 (********************) <-> *******
数値を入力してください> 9
ターゲットのアカウント itz-watsonx-5 (********************) <-> *******
API エンドポイント: https://cloud.ibm.com
Region: jp-tok
ユーザー: ***************@*******
アカウント: itz-watsonx-5 (********************) <-> *******
リソース・グループ: リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
リージョンをセット
利用するリージョンをセットします。東京リージョンを利用する場合は、ap-north
を指定します。(ダラスはus-south
など)
$ ibmcloud cr region-set ap-north
地域は「ap-north」に設定されました。地域は「jp.icr.io」です。
OK
リソース・グループの一覧を取得
ログイン中のアカウント内で利用可能なリソース・グループの一覧を取得します。
(一部をマスキングしています。)
$ ibmcloud resource groups
******************** としてアカウント ******************** のすべてのリソース・グループを取得しています...
OK
名前 ID デフォルト・グループ 状態
********************** ******************************** false ACTIVE
cc-697000c3vg-kq0q9xb3 ******************************** false ACTIVE
********************** ******************************** false ACTIVE
********************** ******************************** false ACTIVE
********************** ******************************** false ACTIVE
********************** ******************************** false ACTIVE
リソース・グループの選択
上記で取得したリソース・グループの一覧から、今回利用するものを選択します。
(一部をマスキングしています。)
$ ibmcloud target -g cc-697000c3vg-kq0q9xb3
ターゲットのリソース・グループ cc-697000c3vg-kq0q9xb3
API エンドポイント: https://cloud.ibm.com
Region: jp-tok
ユーザー: ***************@*******
アカウント: itz-watsonx-5 (********************) <-> *******
リソース・グループ: cc-697000c3vg-kq0q9xb3
コンテナレジストリにログイン
ローカル環境のDockerクライアントをIBM Container Registryにログインさせます。これにより、DockerクライアントとIBM Container Registryの接続が確立し、コンテナイメージのアップロード(Push)やダウンロード(Pull)が可能になります。
$ ibmcloud cr login
'docker' を 'jp.icr.io' にログインしています ...
「jp.icr.io」にログインしました。
OK
コンテナレジストリにコンテナイメージをPush
ローカル環境でビルドしたコンテナイメージを、IBM CloudのコンテナレジストリにPushします。docker build
コマンドの-t
オプションで指定したタグ名を、docker push
コマンドでも同じように指定します。
$ docker push jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app:v1
Pushが完了したら、ブラウザでIBM Cloudを開き、リソース・リストから、今回利用するContainer Registryを開きます。
左側のメニューで「リポジトリー」を選択すると、先ほどPushしたコンテナイメージが正常にアップロードされていることを確認できます。
手順5:IBM Container RegistryからIBM Code EngineにコンテナイメージをPullしてデプロイ
シークレットの作成
サービスIDの作成
IBM Container Registryからコンテナを稼働させるIBM Code EngineにコンテナイメージをPullするには、シークレットが必要になります。
IBM Container Registryはデフォルトでプライベート設定のため、IBM Code EngineへコンテナイメージをPullするには認証情報(シークレット)が必要です。シークレットなしでPullできる場合、そのイメージはパブリック公開されており、誰でもアクセス可能ということになります。
画面上部の「管理」から、「アクセス(IAM)」をクリックします。
左側のメニューから「サービスID」を選択し、「サービスIDの作成」をクリックします。
任意の名前を入力して、「作成」をクリックします。
作成したばかりのサービスIDには、Container RegistryやCode Engineなどのリソースに対するアクセス権限が付与されていません。そのため、サービスIDによりアクセス可能なリソースを明示的に割り当てる必要があります。
アクセス権限の割り当て
「アクセス権限の割り当て」をクリックして、以下のように必要なリソースへのアクセス権限を設定します。
設定項目 | 選択・入力内容 |
---|---|
アクセス権限の割り当て方式 | アクセス・ポリシー |
サービス | 「Container Registry」と検索し、チェックを入れる |
リソース | 「特定のリソース」を選択 → 「属性の選択」で「リソース・グループ」を選択 → 「値の選択」で今回利用するリソース・グループ名をクリック |
リソース・グループ・アクセス | 「管理者」にチェックを入れる |
役割とアクション | 「サービス・アクセス」「プラットフォーム・アクセス」ともに「管理者」にチェックを入れる |
条件 | 特に指定しない |
設定が完了したら、「追加」をクリックし、「割り当て」をクリックします。正常に割り当てが完了すると、「アクセス・ポリシー」に「Container Registry」の項目が追加されていることを確認できます。
APIキーの作成
Container RegistryにアクセスできるようになったサービスIDに対して、APIキーを発行します。これが、Container RegistryからコンテナイメージをPullするためのシークレットとなります。
画面上部で「APIキー」タブを選択し、「作成」をクリックします。
任意の名前を入力し、「作成」をクリックします。
作成されたAPIキーが表示されます。
APIキーはこの画面でしか表示されません。必ずコピーして保存するか、JSON形式でダウンロードして保管してください。安全に管理するよう十分ご注意ください。
アプリケーションの新規作成
IBM Cloudのリソース・リストから、Code Engineを選択し、右側のメニューからアプリケーションを選択します。アプリケーション一覧が表示されたら、右上の「作成」ボタンをクリックします。
各設定項目について、順を追って説明します。
一般
任意のアプリケーション名を入力します。公開されるURLにも含まれる文字列となるので、わかりやすい名前にしてください。
コード
「既存のコンテナ・イメージを使用」を選択したうえで、「イメージの構成」をクリックします。
画面右側に表示される「イメージの構成」で以下の設定項目を入力します。
設定項目 | 選択・入力内容 |
---|---|
レジストリー・サーバー | private.jp.icr.io (コンテナレジストリのリージョンによって変わる) |
レジストリー・シークレット | プルダウンから、「レジストリー・シークレットの作成」をクリックして、表下部に記載の設定を実施 |
名前空間 | cc-697000c3vg-kq0q9xb3-cr |
リポジトリー(イメージ名) | gradio-sample-app |
タグ | v1 |
「レジストリ・シクレットの作成」では下記のように設定します。
「IAM APIキー」の項目ではAPIキーの作成にて準備したAPIキーを貼り付けます。
リソースおよびスケーリング
稼働させるアプリケーションによって必要なリソース量は異なるため、過不足のない値を選択してください。自動スケーリングによってインスタンス数が0になるとアプリケーションが利用できなくなるため、「インスタンスの最小数」には1を指定しています。
その他の設定項目
必要に応じてその他の設定項目やオプション指定を実施してください。今回はデフォルトの値を利用します。
設定が完了したら、右下の「作成」をクリックします。
デプロイ完了
デプロイが完了すると「対応可能」と表示されます。
左上のパンくずリストから「アプリケーション」に戻ります。
デプロイされているアプリケーションの一覧を確認できます。
「アプリケーション・リンク」の「URLを開く」をクリックするとデプロイされたアプリケーションにアクセスできます。
無事、アプリケーションのページにアクセスすることができました。
おわりに
今回は、Webアプリケーションのデプロイを例に、IBM Code EngineとIBM Container Registryの基本的な利用方法をご紹介しました。今後は、IBM Code Engineで稼働中のコンテナのログ確認方法や、デプロイ時に発生するエラーへの対処方法などについても、順次記事としてご紹介していく予定です。