目的
以下のチュートリアルとなります。
- podmanでregistry.access.redhat.com上のnginxから自分のイメージを作成(Linuxサーバーを想定)
- IBM Cloud Container Registry(ICR)に作成イメージをPush
- Red Hat OpenShift on IBM Cloud(ROKS)上に上記イメージをデプロイ
前提
- Podmanは導入済み(RHEL8.10に導入)
- ROKSはデプロイ済み (ICRとの接続も済。OCP4.14)
- ibmcli、ocは導入済み
- ICRのデプロイおよびNamespaceは作成済み
手順
ibmcliの準備
ibmcliは導入済みとする
ユーザーの作成
podmanを利用する場合、ルートレスコンテナを利用するため、/etc/subuid
、/etc/subgid
に記載されたUID/GIDのユーザーが必要となる。
そのため、上記UID/GIDのユーザーではない場合、ユーザーを追加し、パスワード設定をする。
sudo useradd ユーザー名
sudo passwd ユーザー名
Container Registry CLI のインストールをおこなう
ibmcloud plugin install container-registry
ibmcloud plugin list
資料の取得
git cloneで資料を取得し、対象ディレクトリに移動
git clone https://github.com/sclorg/nginx-container.git nginx-container
cd nginx-container/examples/1.20/
もしくは、zipでダウンロードし、作業ディレクトリに配置する。
自分用ファイルを作成
以下のindex.htmlファイルを作成する。
作成後、index2.htmlも作成する(index.htmlをコピーしたものでよい)
<title>部分や<body>は適宜変更する。
イメージファイルを読み込むようにしてもよい。(以下のindex.htmlはindex-amaebi_computer.pngを読み込んでいる)
<html>
<head>
<title>Test NGINX passed</title>
</head>
<body>
<h1>NGINX is working on ROKS</h1>
<p>Hello, World!</p>
<img src="index-amaebi_computer.png" alt="Legendary Japanese spirit, Amabie" title="Amabie" >
</body>
</html>
ファイルの配置ができたら、index.html
とindex2.html
、使うイメージファイル等を
nginx-container/examples/1.20/test-app/
直下に配置する。(ファイルを置き換える)
コンテナイメージの作成
Dockerfileの確認
nginx-container/examples/1.20/
にあるDockerfileを書き換える。
イメージファイルを配置する場合、ADD を追加し、イメージファイルを追加する。
FROM registry.access.redhat.com/ubi8/nginx-120
# Add application sources
ADD test-app/nginx.conf "${NGINX_CONF_PATH}"
ADD test-app/nginx-default-cfg/*.conf "${NGINX_DEFAULT_CONF_PATH}"
ADD test-app/nginx-cfg/*.conf "${NGINX_CONFIGURATION_PATH}"
ADD test-app/index* .
# Run script uses standard ways to run the application
CMD nginx -g "daemon off;"
コンテナイメージのビルド
作成したDockerfileでコンテナイメージをビルドする
cd <Dockerfileがあるディレクトリ>
podman build -t <コンテナイメージ名>
(例) podman build -t nginx-app .
イメージの確認
podman images
(以下表示される)
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/nginx-app latest 66ee5daf56a3 10 seconds ago 451 MB
registry.access.redhat.com/ubi8/nginx-120 latest eec8d440def2 2 months ago 450 MB
コンテナイメージの稼働確認
コンテナイメージを稼働させて、想定のファイルがみえることを確認する。
podman run -it -d -p <てきとうなPORT>:8080 <コンテナイメージ名>
確認
curl -Lk 127.0.0.1:<指定したPort>
コンテナイメージをICRへPUSH
参考
IBM Cloudにログイン
ibmcloud login
ICRのNamespaceが作成されていることを確認
ibmcloud cr namespace-list -v
作成したイメージにtagをつける
- source_imageは作成したコンテナイメージ名
podman tag <source_image>:<tag> <region>.icr.io/<my_namespace>/<new_image_repo>:<new_tag>
例) podman tag localhost/nginx-app jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0
ICRにログインする(IBM Cloudにログインするだけではプライベートレジストリは使えません)
ibmcloud cr login --client podman
コンテナイメージをICRのNamespaceにPushする
イメージの指定は、先程つけたtag名を使用する
podman push <region>.icr.io/<my_namespace>/<image_repo>:<tag>
例) podman push jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0
イメージがPushされたことを確認
ibmcloud cr image-list
ROKSにデプロイする
ROKSにログインする
自分用のNamespace(Project)を作成する
oc create new-project <new-project>
NamespaceにImagePullSecretをコピーする
oc get secrets -n default | grep icr-io
oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -
Secretがコピーされたことを確認する
oc get secret -n <new-project> | grep all-icr-io
デプロイ用のyamlファイルを用意する(nginx-deploy.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: ここにICRのイメージを記載(例 jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0)
ports:
- containerPort: 8080
imagePullSecrets:
- name: all-icr-io
Podのデプロイ
oc create -f nginx-deploy.yaml -n <new-project>
oc get pod -n <new-project>
Serviceの作成用yamlの作成 (nginx-svc.yaml)
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 8080
targetPort: 8080
Serviceの作成
oc create -f nginx-svc.yaml -n <new-project>
oc get svc -n <new-project>
Routeの作成
oc expose svc nginx-svc -n <new-project>
oc get route -n <new-project>
デプロイしたnginxコンテナにアクセスできることを確認
上記のoc get route
に表示されているURLにアクセスする。
curl http://上記URL
GUIからもアクセスして確認する。