はじめに

みなさん、はじめまして。
Oracle Cloud Infrastructure検証チームの新人です。

本記事では、Oracle Cloud Infrastructure(OCI)で開発者サービスとして提供されている、コンテナ・インスタンス使用して、シンプルなWebアプリケーションをコンテナ化していきます。

こちらの記事は
ORACLE MASTER Bronze DBA 2019とOracle Cloud Infrastructure 2024 Certified Foundations Associateを取得しました!
に登場した社員です!

コンテナ・インスタンスとは?

コンテナ・インスタンスは、サーバ管理が不要で、かつコンテナイメージを指定することで高速かつ簡単に実行できるサーバレスのコンピュートサービスです。
また、コンテナ・レジストリと連携することで、コンテナイメージをセキュアに管理することが可能です。

コンテナとは?

コンテナは、アプリケーションと実行に必要な環境を1つのまとまりにし、パッケージ化する技術のことです。
これにより、実行するOSの違いや、アプリケーションに必要なライブラリ・依存パッケージを気にすることなく、軽量かつ高速で、アプリケーションの開発と運用が可能になります。

仮想マシンとコンテナのアーキテクチャの違い

一般的に、仮想マシンとコンテナには、以下のようなアーキテクチャの違いがあります。

  • 仮想マシン(VM):ハイパーバイザー上で複数のゲストOSを動作させます。
    各VMは独立したOSを持ち、アプリケーションはそのOS上で動作します。
    これにより高い分離性がありますが、OSごとのリソース消費が大きく、起動に時間がかかります。
  • コンテナ:ホストOSのカーネルを共有し、アプリケーションと依存関係のみをパッケージ化します。
    コンテナエンジンがプロセスを隔離するため、軽量で起動が速く、リソース効率に優れます。

    開発者フレンドリーなサービスだね!

実際にやってみた

事前に必要なもの

コンテナ化するにあたり、以下3つのファイルは最低限必要となります。

  • 実行するアプリケーション関連ファイル
  • アプリケーションの依存パッケージ情報
  • Dockerfile

本記事では、PythonのフレームワークであるFlaskを用いて、簡易的なWebアプリケーションを作成しました。
コンテナでapp.pyを直接実行し、ブラウザで http://<パブリックIP>:8080 にアクセスすると、
文字列 "Hello OCI" を表示するような動作になっています。

  • app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
	return "Hello OCI"

if __name__ == "__main__":
	app.run(host="0.0.0.0", port=8080)
  • requirements.txt
Flask==3.1.2
  • Dockerfile
FROM python:3.12-slim
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["python", "app.py"]

構成図

本記事の構成図は以下になります。
また、OCI上でネットワーク設定が必要になります。

  • コンテナ・インスタンスを作成する対象コンパートメントにVCNが作成されていること
  • VCN内にパブリック・サブネットが構成されていること
  • インターネット・ゲートウェイサービス・ゲートウェイが構成されていること
  • セキュリティ・リストのイングレス・ルールで、HTTPリクエストを待ち受けるポートを許可していること

1. 認証トークンの生成

コンテナイメージのビルド、プッシュする際に
Oracle Cloud Infrastructure Registry(OCIR)へのログインが必要となります。
このログインで、認証トークンが必要なため作成します。

プロファイル > ユーザ設定 > 自分のプロファイル > トークンおよびキー から、認証トークンを生成できます。

生成された認証トークンは、忘れないように控えてください。

2. リポジトリの作成

コンテナイメージを保存する、リポジトリを作成します。
コンソールから メニュー > 開発者サービス > コンテナとアーティファクト > コンテナ・レジストリ から「リポジトリの作成」を選択します。

コンパートメント/アクセス方法/リポジトリ名を指定し、「作成」をクリックします。

リポジトリが作成されました。
OCIRのログインに、ユーザ名とネームスペースを使用するため控えてください。

3. コンテナイメージをビルドする

OCIのCloud Shellでは、Dockerが使用できます。
今回は、Cloud Shell上で、コンテナイメージをビルドしていきます。

Dockerはアプリケーションを
コンテナイメージにするためのプラットフォームだよ!

OCIコンソールからCloud Shellを起動します。

最初に アクション > アーキテクチャ から、現在のアーキテクチャをX86_64に変更します。ここで注意したい点として、コンテナを作成する際は、プルするコンテナイメージとのアーキテクチャを一致させる必要があります。
本記事では、コンテナ・インスタンスのシェイプをAMD(X86_64)で作成するために変更しました。

コンテナはX86_64、イメージはARM64と
いったように異なると、コンテナは作成できないよ!

続いて、OCIRにログインします。
Usernameは作成したリポジトリのネームスペースとユーザ名、Passwordは認証トークンを入力します。

$ docker login nrt.ocir.io
Username: <ネームスペース>/<ユーザ名>
Password: <認証トークン>
Login Succeeded!

Cloud Shellのエディタ/GUIで以下のファイルをアップロードします。
(必要に応じて、作業用ディレクトリを作成してください)

  • 実行するアプリケーション関連ファイル
  • アプリケーションの依存パッケージ情報
  • Dockerfile
$ ls -l ./oci-app-demo
total 12
-rw-r--r--. 1 XXXX oci 256 Dec  4 01:32 app.py
-rw-r--r--. 1 XXXX oci 619 Dec  4 01:35 Dockerfile
-rw-r--r--. 1 XXXX oci  29 Dec  4 01:34 requirements.txt

アップロードが完了したら、docker buildコマンドでコンテナイメージをビルドします。

$ docker build -t nrt.ocir.io/<ネームスペース>/oci-app-demo:1.0.0-demo .
・
・
Successfully tagged nrt.ocir.io/<ネームスペース>/oci-app-demo:1.0.0-demo
5472095e3d7d79e8279c074ad531ab36529b1ab4f8b226d3ff88d01fc844fb30

$ docker images
REPOSITORY                                TAG          IMAGE ID      CREATED         SIZE
nrt.ocir.io/<ネームスペース>/oci-app-demo  1.0.0-demo   5472095e3d7d  3 seconds ago   138 MB

$ docker image inspect nrt.ocir.io/<ネームスペース>/oci-app-demo:1.0.0-demo --format '{{.Architecture}}'
amd64

ビルドが完了したら、作成したリポジトリにコンテナイメージをプッシュします。

$ docker push nrt.ocir.io/<ネームスペース>/oci-app-demo:1.0.0-demo
Getting image source signatures
Copying blob ... 
Writing manifest to image destination
コンソールのコンテナ・レジストリでイメージの反映を確認します。

4. コンテナ・インスタンスの作成

メニュー > 開発者サービス > コンテナとアーティファクト > コンテナ・インスタンス から
「コンテナ・インスタンスの作成」をクリックします。

今回は検証用のためメモリを2GBに変更し、それ以外はデフォルトの構成で作成します。

続いて、コンテナの構成を設定します。
イメージは先ほどプッシュしたものを選択します。 最後に確認画面です。構成に問題なければ「作成」をクリックします。1~2分ほどで作成が完了し、ステータスが「アクティブ」と表示されます。

5. 作成したコンテナにアクセスする

それでは、作成したコンテナにアクセスしてみましょう。
ブラウザから、http://<パブリックIP>:8080にアクセスします。

「Hello OCI」と表示されました。

さらにローカルPCのコマンドプロンプトから、curlコマンドでHTTPリクエストを送信してみましょう。

C:>curl http://<パブリックIP>:8080
Hello OCI

先ほどと同様に、「Hello OCI」とレスポンスがありました。

6. ログの確認

最後にコンテナのログを確認します。

検証しているローカルPCのグローバルIPから、コンテナにHTTPリクエストが送信され、正常に処理されていることが確認できます。
画像にある①はブラウザからコンテナにアクセスしたログ②はcurlコマンドでアクセスしたログです。

①については、ブラウザの仕様で、自動的にFaviconを読み込むように設定されているため、404のエラーコードが発生しています。
ですが、本記事での検証ではFaviconを設定していないため、問題ありません。

さいごに

いかがでしたでしょうか?
コンテナ・インスタンスを使用することで、アプリケーションを簡単にコンテナ化することができます。

弊社にはOCIに詳しいエンジニアが多数在籍しております。
何かご不明なことやご興味を持たれたことがございましたら、お気軽にお問い合わせください!

他にもOCIの記事をたくさん投稿しているよ!
気になることがあったらチャットでも質問してね!

投稿者プロフィール

「DBひとりでできるもん」運営チーム
「DBひとりでできるもん」運営チーム
「親しみやすさと技術力」をテーマに、技術情報・サービス・インフラ系資格取得に役立つ情報、社員等の情報をお届けします。
90名強の事業部員で鋭意、執筆中です。
少しでも当社を知って頂けるよう、愛情込めて頑張ります!
※facebook、X(旧twitter)、インスタグラムでは「DBひとりでできるもん」の更新情報を発信しています。
最新の投稿