OpenShift のこと Web ブラウザで全部やってみる (その 2)
これは Red Hat Advent Calendar 2025 の 12/24 の記事です。メリークリスマス!
はじめに
だいぶ前にこんな記事を書きました。
この時取り上げたのは Web Terminal Operator でしたが、今回は前の記事でもちょろっと触れていた Red Hat OpenShift Dev Spaces について書いていこうと思います。
OpenShift Dev Spaces の概要については既に解説記事があるのでそちらを見ていただくと良いと思いますが、ざっくり説明すると OpenShift 上でセルフホストする Web IDE (VSCode / IntelliJ IDEA) です。
- Red Hat OpenShift Dev SpacesとGitLabを使用してプライベートな開発環境をサクッと構築する
- VSCodeなどのモダンなエディタでブラウザ上で開発できる開発環境 Red Hat OpenShift Dev Spaces を 無料でもらっちゃおう
今回はこの OpenShift Dev Spaces、特 Dev Spaces で利用できる Kubedock について話そうと思います。
そもそもなぜ OpenShift Dev Spaces が必要なのか?
アプリケーション開発ライフサイクルのうち、ローカル開発環境での開発サイクル ( Inner loop ) を回すときに以下のような課題に直面したことはありませんか?
- 環境構築の複雑さ: 新しいプロジェクトを始めるたびに、開発環境のセットアップに時間がかかる(Node.js、Python、Java などのランタイム、データベース、各種ツールのインストールと設定)
- 依存関係の管理: プロジェクトごとに異なるバージョンのランタイムやライブラリが必要で、環境の切り替えが面倒
- チーム間の環境差: メンバーごとに OS(Windows、macOS、Linux)やツールのバージョンが異なり、同じ手順で動かない
- セキュリティの懸念: ローカル環境に本番に近いデータや認証情報を配置することへの不安
- オンボーディングの時間: 新しいメンバーがプロジェクトに参加する際、環境構築に数日かかる
Dev Spaces を利用すると開発者は上記のような環境構築の問題に煩わされることなく、ブラウザでアクセスさえすればアプリケーション開発のすべての準備が整った開発環境を利用できるようになります。
また、 Devfile というフォーマットで IDE の設定や開発者のための独自コマンド定義を宣言的に管理することができます。
この Devfile をソースコードと同じリポジトリ上でバージョン管理することで、開発者間で差分のない開発環境を実現できます。
Kubedock とは何か?なぜ必要なのか?
Kubedock は Kubernetes クラスタ上の Pod (コンテナ) 上でコンテナを実行するための Docker API の最小限の実装です。
OpenShift Dev Spaces が提供する IDE 環境 (Workspace) は OpenShift 上の Pod として動作するため、Kubedock が利用できるようになる前は Podman やコンテナに依存するようなツール (Testcontainers など) はこれまで利用できませんでした。
Kubedock が利用できるようになったことで、現在は Dev Spaces でもローカルの IDE と同様にコンテナが実行できるようになっています。
実際にやってみる
Kubedock を利用したコンテナ実行は以下のような Devfile を Git リポジトリに追加することで利用できます。
schemaVersion: 2.2.0
metadata:
name: kubedock-sample-devfile
components:
- name: tools
container:
image: quay.io/devfile/universal-developer-image:latest
memoryLimit: 8Gi
memoryRequest: 1Gi
cpuLimit: "2"
cpuRequest: 200m
env:
- name: KUBEDOCK_PARAMS
value: "--reverse-proxy --kubeconfig /home/user/.kube/config --initimage quay.io/agiertli/kubedock:0.13.0"
- name: USE_JAVA17
value: "true"
- value: /home/jboss/.m2
name: MAVEN_CONFIG
- value: -Xmx4G -Xss128M -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=2G
name: MAVEN_OPTS
- name: KUBEDOCK_ENABLED
value: 'true'
- name: DOCKER_HOST
value: 'tcp://127.0.0.1:2475'
- name: TESTCONTAINERS_RYUK_DISABLED
value: 'true'
- name: TESTCONTAINERS_CHECKS_DISABLE
value: 'true'
endpoints:
- exposure: none
name: kubedock
protocol: tcp
targetPort: 2475
- exposure: public
name: http-booster
protocol: http
targetPort: 8080
attributes:
discoverable: true
urlRewriteSupported: true
- exposure: internal
name: debug
protocol: http
targetPort: 5005
volumeMounts:
- name: m2
path: /home/user/.m2
- name: m2
volume:
size: 10G
Devfile を Git リポジトリに追加し、ブラウザから以下の形式の URL にアクセスします。
https://<openshift_dev_spaces_fqdn>#<git_repository_url>
しばらくすると以下のように VSCode が立ち上がるので、ターミナルを開いてコンテナの一連の操作を実行してみます。
# OpenShift 内部イメージレジストリにログイン
$ podman login -u admin -p $(oc whoami -t) --tls-verify=false image-registry.openshift-image-registry.svc.cluster.local:5000/admin-devspaces
Login Succeeded!
# コンテナイメージのビルドと内部レジストリへのプッシュ
$ podman build -t user1-nginx-app . -f Dockerfile
STEP 1/3: FROM nginx:alpine
Resolved "nginx" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/nginx:alpine...
Getting image source signatures
Copying blob 085c5e5aaa8e done |
Copying blob 1074353eec0d done |
Copying blob 25f453064fd3 done |
Copying blob 33f95a0f3229 done |
Copying blob 567f84da6fbd done |
Copying blob da7c973d8b92 done |
Copying blob 0abf9e567266 done |
Copying blob de54cb821236 done |
Copying config 04da2b0513 done |
Writing manifest to image destination
STEP 2/3: COPY default.conf /etc/nginx/conf.d/
--> e41e583778f6
STEP 3/3: COPY index.html /usr/share/nginx/html/
COMMIT user1-nginx-app
--> 0ae69bc9f566
Successfully tagged localhost/user1-nginx-app:latest
0ae69bc9f566b82543df39c14caad9c524270454285d9525ae4763ae6a06447e
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/user1-nginx-app latest 0ae69bc9f566 26 seconds ago 55.2 MB
docker.io/library/nginx alpine 04da2b0513cd 6 days ago 55.2 MB
$ podman push --tls-verify=false localhost/user1-nginx-app:latest image-registry.openshift-image-registry.svc.cluster.local:5000/admin-devspaces/user1-nginx-app:latest
Getting image source signatures
Copying blob ed5fa8595c7a done |
Copying blob fd1e40d7f74b done |
Copying blob 8ae63eb1f31f done |
Copying blob 7bb20cf5ef67 done |
Copying blob b3e3d1bbb64d done |
Copying blob 48078b7e3000 done |
Copying blob 67ea0b046e7d done |
Copying blob fb6c64633fd4 done |
Copying blob e6fe11fa5b7f done |
Copying blob 42cc4e8c87ef done |
Copying config 0ae69bc9f5 done |
Writing manifest to image destination
# コンテナの実行
$ podman run --rm -d -p 8080:8080 --tls-verify=false image-registry.openshift-image-registry.svc.cluster.local:5000/admin-devspaces/user1-nginx-app:latest
コンテナを実行すると IDE 上で以下のようなポップアップが表示されます。ブラウザの別タブが開き、 hello world が表示されたのでコンテナが実行できアクセスできることが確認できました。


