4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM Cloud入門:DockerコンテナをIBM Code Engineにデプロイする手順まとめ

Last updated at Posted at 2025-08-09

はじめに

この記事では、コンテナ化したアプリケーションをIBM Cloud上で提供されているサービス、IBM Code Engineにデプロイする方法をご紹介します。主な手順は以下の通りです。

  1. ローカル環境でアプリを作成
  2. コンテナイメージを作成
  3. ローカル環境でコンテナの実行テスト
  4. IBM Container RegistryにコンテナイメージをPush
  5. 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を用いた簡素なアプリケーションのソースコードを以下に掲載します。

<アプリケーションのソースコード>

app.py
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番に設定しておくことで、特別な設定を行うことなく簡単にデプロイ できます。
なお、他のポート番号もオプションで指定可能なため、必要に応じて変更することもできます。

<仮想環境にインストールするパッケージ>

Pipfile
[[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を使用しています。

Dockerfile
# ベースイメージとして公式の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が名前空間です。

image.png

Dockerfileを基にコンテナイメージをビルド

コンテナの設計書にあたるDockerfileを利用して、コンテナイメージをビルドします。

terminal
$ 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 ビルドするイメージのターゲットプラットフォームを指定。ここではLinuxx86_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にデプロイした際にエラーが発生することがあります。

コンテナイメージの確認

コンテナイメージが正常にビルドできたか確認します。
下記のコマンドを実行すれば、作成済みのコンテナイメージ一覧を取得できます。

terminal
$ 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:ローカル環境でコンテナの実行テスト

作成したコンテナイメージを指定してコンテナを実行し、正常に動作するかをテストします。

terminal
$ 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"を入力し、立ち上がったブラウザに表示されるワンタイムパスワードをターミナルにコピー&ペーストします。

terminal
$ 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

アカウントの選択

アカウント名の前に振られた数値を入力して、ログインしたいアカウントを選択します。
(一部をマスキングしています。)

terminal
アカウントを選択:
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など)

terminal
$ ibmcloud cr region-set ap-north
地域は「ap-north」に設定されました。地域は「jp.icr.io」です。

OK

リソース・グループの一覧を取得

ログイン中のアカウント内で利用可能なリソース・グループの一覧を取得します。
(一部をマスキングしています。)

terminal
$ ibmcloud resource groups
******************** としてアカウント ******************** のすべてのリソース・グループを取得しています...
OK
名前                     ID                                 デフォルト・グループ   状態
**********************   ********************************   false                  ACTIVE
cc-697000c3vg-kq0q9xb3   ********************************   false                  ACTIVE
**********************   ********************************   false                  ACTIVE
**********************   ********************************   false                  ACTIVE
**********************   ********************************   false                  ACTIVE
**********************   ********************************   false                  ACTIVE

リソース・グループの選択

上記で取得したリソース・グループの一覧から、今回利用するものを選択します。
(一部をマスキングしています。)

terminal
$ 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)が可能になります。

terminal
$ ibmcloud cr login
'docker' を 'jp.icr.io' にログインしています ...
「jp.icr.io」にログインしました。

OK

コンテナレジストリにコンテナイメージをPush

ローカル環境でビルドしたコンテナイメージを、IBM CloudのコンテナレジストリにPushします。docker buildコマンドの-tオプションで指定したタグ名を、docker pushコマンドでも同じように指定します。

terminal
$ docker push jp.icr.io/cc-697000c3vg-kq0q9xb3-cr/gradio-sample-app:v1

Pushが完了したら、ブラウザでIBM Cloudを開き、リソース・リストから、今回利用するContainer Registryを開きます。

左側のメニューで「リポジトリー」を選択すると、先ほどPushしたコンテナイメージが正常にアップロードされていることを確認できます。

image.png

手順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)」をクリックします。

スクリーンショット 2025-08-09 11.03.25(2).png

左側のメニューから「サービスID」を選択し、「サービスIDの作成」をクリックします。
任意の名前を入力して、「作成」をクリックします。

image.png

作成したばかりのサービスIDには、Container RegistryやCode Engineなどのリソースに対するアクセス権限が付与されていません。そのため、サービスIDによりアクセス可能なリソースを明示的に割り当てる必要があります。

アクセス権限の割り当て

image.png

「アクセス権限の割り当て」をクリックして、以下のように必要なリソースへのアクセス権限を設定します。

設定項目 選択・入力内容
アクセス権限の割り当て方式 アクセス・ポリシー
サービス 「Container Registry」と検索し、チェックを入れる
リソース 「特定のリソース」を選択 → 「属性の選択」で「リソース・グループ」を選択 → 「値の選択」で今回利用するリソース・グループ名をクリック
リソース・グループ・アクセス 「管理者」にチェックを入れる
役割とアクション 「サービス・アクセス」「プラットフォーム・アクセス」ともに「管理者」にチェックを入れる
条件 特に指定しない

設定が完了したら、「追加」をクリックし、「割り当て」をクリックします。正常に割り当てが完了すると、「アクセス・ポリシー」に「Container Registry」の項目が追加されていることを確認できます。

image.png

APIキーの作成

Container RegistryにアクセスできるようになったサービスIDに対して、APIキーを発行します。これが、Container RegistryからコンテナイメージをPullするためのシークレットとなります。

画面上部で「APIキー」タブを選択し、「作成」をクリックします。

image.png

任意の名前を入力し、「作成」をクリックします。

image.png

作成されたAPIキーが表示されます。

image.png

APIキーはこの画面でしか表示されません。必ずコピーして保存するか、JSON形式でダウンロードして保管してください。安全に管理するよう十分ご注意ください。

アプリケーションの新規作成

IBM Cloudのリソース・リストから、Code Engineを選択し、右側のメニューからアプリケーションを選択します。アプリケーション一覧が表示されたら、右上の「作成」ボタンをクリックします。

image.png

各設定項目について、順を追って説明します。

一般

任意のアプリケーション名を入力します。公開されるURLにも含まれる文字列となるので、わかりやすい名前にしてください。

image.png

コード

「既存のコンテナ・イメージを使用」を選択したうえで、「イメージの構成」をクリックします。

image.png

画面右側に表示される「イメージの構成」で以下の設定項目を入力します。

設定項目 選択・入力内容
レジストリー・サーバー private.jp.icr.io (コンテナレジストリのリージョンによって変わる)
レジストリー・シークレット プルダウンから、「レジストリー・シークレットの作成」をクリックして、表下部に記載の設定を実施
名前空間 cc-697000c3vg-kq0q9xb3-cr
リポジトリー(イメージ名) gradio-sample-app
タグ v1

「レジストリ・シクレットの作成」では下記のように設定します。
「IAM APIキー」の項目ではAPIキーの作成にて準備したAPIキーを貼り付けます。

image.png

リソースおよびスケーリング

稼働させるアプリケーションによって必要なリソース量は異なるため、過不足のない値を選択してください。自動スケーリングによってインスタンス数が0になるとアプリケーションが利用できなくなるため、「インスタンスの最小数」には1を指定しています。

image.png

その他の設定項目

必要に応じてその他の設定項目やオプション指定を実施してください。今回はデフォルトの値を利用します。
設定が完了したら、右下の「作成」をクリックします。

image.png

デプロイ完了

デプロイが完了すると「対応可能」と表示されます。
左上のパンくずリストから「アプリケーション」に戻ります。

image.png

デプロイされているアプリケーションの一覧を確認できます。
「アプリケーション・リンク」の「URLを開く」をクリックするとデプロイされたアプリケーションにアクセスできます。

image.png

無事、アプリケーションのページにアクセスすることができました。

image.png

おわりに

今回は、Webアプリケーションのデプロイを例に、IBM Code EngineとIBM Container Registryの基本的な利用方法をご紹介しました。今後は、IBM Code Engineで稼働中のコンテナのログ確認方法や、デプロイ時に発生するエラーへの対処方法などについても、順次記事としてご紹介していく予定です。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?