OCI_Geminiに作ってもらったしょうもないアプリをコンテナインスタンスで公開した

まずコンテナイメージ作る

ローカルPCのUbuntu環境にて
コンテナイメージの作成(Dockerfile含めて全部Gemini作)

docker@ubuntu24:~/DC/ai_fortune_teller$ cat docker-compose.yml
services:
  web:
    build:
      context: . # Dockerfileがあるディレクトリを指定 (カレントディレクトリ)
      dockerfile: Dockerfile # 使用するDockerfileの名前
    image: ai_fortune_site_web:latest
    container_name: ai_fortune_site_web
    ports:
      - "8084:80"
    volumes:
      # index.htmlの変更をリアルタイムに反映させたい場合 (開発時向け)
      # Dockerfile内のCOPY命令と競合するため、どちらか一方を有効にします。
      # 開発時はこちらを有効にし、DockerfileのCOPY ./index.html ... をコメントアウトすると便利です。
      # 本番環境ではDockerfileのCOPYを使い、このvolumesはコメントアウトまたは削除します。
      - ./index.html:/usr/share/nginx/html/index.html:ro # :ro は読み取り専用
    restart: unless-stopped # コンテナが停止した場合、手動で停止しない限り再起動
docker@ubuntu24:~/DC/ai_fortune_teller$ cat Dockerfile
# ベースイメージとしてNginxの公式イメージを使用
FROM nginx:alpine

# Nginxのデフォルト設定ファイルを削除 (カスタム設定を使用するため)
RUN rm /etc/nginx/conf.d/default.conf

# カスタムのNginx設定ファイルをコンテナにコピー
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 静的コンテンツ (HTML, CSS, JS) をNginxのドキュメントルートにコピー
# index.html があるディレクトリを app という名前にしてコピーします。
# この Dockerfile と同じ階層に app/index.html がある想定です。
# もし index.html が Dockerfile と同じ階層にある場合は、
# COPY ./index.html /usr/share/nginx/html/index.html のように変更してください。
# 今回は index.html が Dockerfile と同じ階層にある前提で進めます。
COPY ./index.html /usr/share/nginx/html/index.html

# Nginxがリッスンするポートを指定 (デフォルトは80)
EXPOSE 80

# Nginxをフォアグラウンドで実行
CMD ["nginx", "-g", "daemon off;"]

docker@ubuntu24:~/DC/ai_fortune_teller$

イメージ作るだけなら:docker compose builddocker image ls <image名>
起動して動確もするなら:docker compose up --build -ddocker compose images `

docker@ubuntu24:~/DC/ai_fortune_teller$ docker compose up --build -d
[+] Building 1.5s (10/10) FINISHED                                                                                                   docker:default
 => [web internal] load build definition from Dockerfile                                                                                       0.0s
 => => transferring dockerfile: 1.10kB                                                                                                         0.0s
 => [web internal] load metadata for docker.io/library/nginx:alpine                                                                            1.3s
 => [web internal] load .dockerignore                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                0.0s
 => [web 1/4] FROM docker.io/library/nginx:alpine@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10                      0.0s
 => [web internal] load build context                                                                                                          0.0s
 => => transferring context: 63B                                                                                                               0.0s
 => CACHED [web 2/4] RUN rm /etc/nginx/conf.d/default.conf                                                                                     0.0s
 => CACHED [web 3/4] COPY nginx.conf /etc/nginx/conf.d/default.conf                                                                            0.0s
 => CACHED [web 4/4] COPY ./index.html /usr/share/nginx/html/index.html                                                                        0.0s
 => [web] exporting to image                                                                                                                   0.0s
 => => exporting layers                                                                                                                        0.0s
 => => writing image sha256:d72bb6cc95347fc94fd0c7cd32e50ec012bdd1d229ee035fc327c78dae7efc0b                                                   0.0s
 => => naming to docker.io/library/ai_fortune_site_web:latest                                                                                  0.0s
 => [web] resolving provenance for metadata file                                                                                               0.0s
[+] Running 2/2
 ✔ Network ai_fortune_teller_default  Created                                                                                                  0.2s
 ✔ Container ai_fortune_site_web      Started                                                                                                  0.5s
docker@ubuntu24:~/DC/ai_fortune_teller$ docker compose ps
NAME                  IMAGE                        COMMAND                  SERVICE   CREATED          STATUS          PORTS
ai_fortune_site_web   ai_fortune_site_web:latest   "/docker-entrypoint.…"   web       17 seconds ago   Up 17 seconds   0.0.0.0:8084->80/tcp, [::]:8084->80/tcp
docker@ubuntu24:~/DC/ai_fortune_teller$ docker compose images
CONTAINER             REPOSITORY            TAG                 IMAGE ID            SIZE
ai_fortune_site_web   ai_fortune_site_web   latest              d72bb6cc9534        48.3MB
docker@ubuntu24:~/DC/ai_fortune_teller$

作ったイメージにタグをつける

参考:

東京に配置する

  • リージョン識別子(例:ap-tokyo-1)
  • リージョンキー(例:NRT)

tag のregistry-domainはPush先となるのでdocker login 先と同じにしなければならない。
(nrt.ocir.ioとocir.ap-tokyo-1.oci.oraclecloud.comは同じエンドポイントを指すが 認証情報はホスト名で識別されるのでlogin とtag(push)で合わせないとPush時の認証通らない。ということでtagもloginもnrt.ocir.ioを使う)

docker tag <image-identifier> <registry-domain>/<tenancy-namespace>/<repo-name>:<version>


docker@ubuntu24:~/DC/ai_fortune_teller$ docker tag ai_fortune_site_web:latest nrt.ocir.io/zzzzzzzz/gemini_apps/ai_fortune_site_web:v1.0
docker@ubuntu24:~/DC/ai_fortune_teller$

OCIR(OCI Container Registry)にPushする

OCIRにログイン
→初回OCIユーザー名とAuthトークン必要
※以前にログインしてると ~/.docker/config.jsonに認証情報が保存されてるらしく明示的にログアウトしない限り認証情報必要ない > OCI Function & OCI Schedulerでの実行

docker login nrt.ocir.io


docker@ubuntu24:~/DC/ai_fortune_teller$ docker login nrt.ocir.io
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
docker@ubuntu24:~/DC/ai_fortune_teller$

OCIRのリポジトリ作成

oci artifacts container repository create \
  --display-name gemini_apps/ai_fortune_site_web \
  --compartment-id zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

※regionはconfigに指定してある


docker@ubuntu24:~/DC/ai_fortune_teller$ oci artifacts container repository create \
  --display-name gemini_apps/ai_fortune_site_web \
  --compartment-id zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
{
  "data": {
    "billable-size-in-gbs": 0,
    "compartment-id": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
    "created-by": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
    "defined-tags": {},
    "display-name": "gemini_apps/ai_fortune_site_web",
    "freeform-tags": {},
    "id": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
    "image-count": 0,
    "is-immutable": false,
    "is-public": false,
    "layer-count": 0,
    "layers-size-in-bytes": 0,
    "lifecycle-state": "AVAILABLE",
    "namespace": "zzzzzzzz",
    "readme": null,
    "system-tags": {},
    "time-created": "2025-06-13T14:43:04.637000+00:00",
    "time-last-pushed": null
  },
  "etag": "\"j2jc46vgqyszusqa4gnf5e2ylgnjwq-1\""
}
docker@ubuntu24:~/DC/ai_fortune_teller$

できとる
image-123.png

Pushする

docker push ocir.ap-tokyo-1.oci.oraclecloud.com/zzzzzzzz/gemini_apps/ai_fortune_site_web:v1.0


docker@ubuntu24:~/DC/ai_fortune_teller$ docker push nrt.ocir.io/zzzzzzzz/gemini_apps/ai_fortune_site_web:v1.0
The push refers to repository [nrt.ocir.io/zzzzzzzz/gemini_apps/ai_fortune_site_web]
6613445a452c: Pushed
369c6502b483: Pushed
d7f23493369b: Pushed
0d853d50b128: Pushed
947e805a4ac7: Pushed
811a4dbbf4a5: Pushed
b8d7d1d22634: Pushed
e244aa659f61: Pushed
c56f134d3805: Pushed
d71eae0084c1: Pushed
08000c18d16d: Pushed
v1.0: digest: sha256:731faf4f3da2eb5ead9350a3bc34e84c33cc536943138d8a2230c81f97a0b832 size: 2611
docker@ubuntu24:~/DC/ai_fortune_teller$

できとる
image-124.png

Container instances を作成

Developer Services > Containers & Artifacts > Container instances > Create container instances

  • region:Tokyo
  • Name: ai_fortune_site_web
  • compartment: BlogArea
  • VPN:NW_Blogs
  • Subnet: public subnet-NW_Blogs

※ShapeはAlwaysFreeで使える分を指定する
image-126.png

イメージは事前にOCIRにPushしたイメージを選ぶ。
選択画面でIAMの権限が必要という警告がでる。Provide credentils manually にチェックつけると指定したユーザーのAuthトークンでpullできる。
image-127.png

めんどくさいけどIAMポリシーを付与することにする
https://docs.oracle.com/en-us/iaas/Content/container-instances/permissions/policy-reference.htm

Let Container Instances pull images from Container Registry

Identity & Security > Domains > (OracleIdentityCloudService) > User management タブ > Dynamic Groups > Create Dynamic group

  • Dynamic Group
    • Name: Dynamic_Group_CI
    • Matching rules: ALL {resource.type=‘computecontainerinstance’, resource.compartment.id = ‘zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz’}

Identity & Security > Policies > Create Policies

  • Policy
    • OracleIdentityCloudService
    • Name: Policy_OI_pull_images
    • Compartment: BlogArea
    • Statements: Allow dynamic-group OracleIdentityCloudService/Dynamic_Group_CI to read repos in compartment BlogArea

Environmental variablesはDockerでいうdocker run -e KEY=valueと同じ。実行環境から参照できる。今回は特に使わない。
コンテナ名は適当
image-128.png

確認してCreate
image-129.png

エラー出た。AlwayFreeの空きがないっぽい。
image-130.png

Shape を「Shape: CI.Standard.E4.Flex」 に変更したら作成できた。でもAlwayFreeじゃないのでダメぽ。

image-131.png
とりあえず動確だけして削除する。後で他のリージョンで試してみる。

LB経由だったらPublic IPいらなかったかも。まーいいや
→LBめんどくさそうだったので一旦HTTPアクセスで
 →一旦Security List で80番を許可

Public IP addressでとりあえず行けた
image-136.png