OCI_Geminiに作ってもらったしょうもないアプリをコンテナインスタンスで公開した
Categories:
まずコンテナイメージ作る
ローカル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 build
→ docker image ls <image名>
起動して動確もするなら:docker compose up --build -d
→ docker 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$
作ったイメージにタグをつける
参考:
イメージにタグ付け
https://docs.oracle.com/en-us/iaas/Content/Registry/Tasks/registrypushingimagesusingthedockercli.htmリージョンコードとかリージョンキーはここで確認できる。
https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htmエンドポイントの確認
https://docs.oracle.com/en-us/iaas/Content/Registry/Concepts/registryprerequisites.htm
東京に配置する
- リージョン識別子(例: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$
できとる
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$
できとる
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で使える分を指定する
イメージは事前にOCIRにPushしたイメージを選ぶ。
選択画面でIAMの権限が必要という警告がでる。Provide credentils manually にチェックつけると指定したユーザーのAuthトークンでpullできる。
めんどくさいけど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と同じ。実行環境から参照できる。今回は特に使わない。
コンテナ名は適当
確認してCreate
エラー出た。AlwayFreeの空きがないっぽい。
Shape を「Shape: CI.Standard.E4.Flex」 に変更したら作成できた。でもAlwayFreeじゃないのでダメぽ。
とりあえず動確だけして削除する。後で他のリージョンで試してみる。
LB経由だったらPublic IPいらなかったかも。まーいいや
→LBめんどくさそうだったので一旦HTTPアクセスで
→一旦Security List で80番を許可
Public IP addressでとりあえず行けた