皆様、こんにちは。y.kobayashiです。
今回はOCIのコンテナ・インスタンスを使用して、WordPress環境を構築していきたいと思います。
目次
構成イメージ

はじめに
コンテナ・インスタンスとは
コンテナ・インスタンスは、サーバの管理をすることなくコンテナを迅速かつ簡単に実行できるサーバレス・コンピュート・サービスです。
1つ以上のコンテナを指定して作成でき、CPU・メモリなどのリソース割り当て、ネットワーク設定、再起動ポリシー、環境変数などを柔軟に構成可能です。
コンテナ・インスタンスは、あらかじめコンテナ・レジストリに登録されたイメージをもとにコンテナを起動します。
その為、コンテナ・インスタンスとして起動するイメージは、コンテナ・レジストリに登録します。
コンテナ・インスタンスの詳細については、以下のドキュメントをご参照ください。
コンテナ・インスタンスの概要
事前準備
認証トークンの作成
最初にコンテナ・レジストリにイメージをプッシュする為に認証トークンの作成を行います。
OCIコンソールの右上にある「プロファイル」アイコンをクリックし、「プロファイル名」を選択します。

「トークンおよびキー」を選択します。

「トークンの生成」を選択します。

トークンの生成画面から以下の項目を入力し、「トークンの生成」を選択します。
説明:任意

作成した認証トークンの右側にある「三点リーダー」をクリックし、「コピー」を選択した後、「閉じる」を選択します。
コピーした認証トークンは後の手順で必要となる為、テキストエディタなどにペーストしておきます。

動的グループ/ポリシーの作成
次にコンテナ・インスタンスがコンテナ・レジストリからイメージをプルできるようにする為、動的グループとポリシーを作成します。
動的グループの設定は以下の通りです。
ルール | 説明 |
ALL {resource.type = 'computecontainerinstance', resource.compartment.id = '<コンパートメントOCID>'} | コンテナ・インスタンスがコンテナ・レジストリへアクセスする為に必要な動的グループ |
ポリシーの設定は以下の通りです。
ポリシー | 説明 |
Allow dynamic-group <動的グループ名> to read repos in compartment <コンパートメント名> | コンテナ・インスタンスがOCIレジストリへアクセスする為に必要なポリシー |
イメージの作成
次にコンテナ・レジストリにプッシュするイメージの作成を行います。
OCIコンソールの右上にある「開発者ツール」アイコンをクリックし、「Cloud Shell」を選択します。

本記事で使用するWordPressとMySQLのDockerfileとenvファイルは以下の通りです。
ARGでビルド時に値を受け取り、ENVでコンテナ内に環境変数として設定しています。
#Dockerfile WordPress
FROM wordpress
ARG WORDPRESS_DB_HOST
ARG WORDPRESS_DB_NAME
ARG WORDPRESS_DB_USER
ARG WORDPRESS_DB_PASSWORD
ENV WORDPRESS_DB_HOST=$WORDPRESS_DB_HOST
ENV WORDPRESS_DB_NAME=$WORDPRESS_DB_NAME
ENV WORDPRESS_DB_USER=$WORDPRESS_DB_USER
ENV WORDPRESS_DB_PASSWORD=$WORDPRESS_DB_PASSWORD
#Dockerfile MySQL
FROM mysql:8.0
ARG MYSQL_ROOT_PASSWORD
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
#WordPressとMySQLで使用するenvファイル
WORDPRESS_DB_HOST=<127.0.0.1>
WORDPRESS_DB_NAME=<使用するDB名>
WORDPRESS_DB_USER=<DB接続ユーザ名>
WORDPRESS_DB_PASSWORD=<DB接続パスワード>
MYSQL_ROOT_PASSWORD=<rootのパスワード>
MYSQL_DATABASE=<作成するDB名>
MYSQL_USER=<DB接続ユーザ名>
MYSQL_PASSWORD<DB接続パスワード>
上記envファイルの環境変数を読み込み、各DockerfileをもとにWordPressとMySQLのイメージを以下のコマンドで作成します。
--build-argオプションを使用してDockerfile内のARGに値を渡します。
本記事では、--build-argオプションに渡す値としてあらかじめ用意したenvファイルで定義した環境変数を使用しています。
1.WordPressとMySQLで使用する環境変数を読み込む
. /<ディレクトリパス>/<envファイル名>
2.WordPressのイメージを作成
docker build \
--build-arg WORDPRESS_DB_HOST=<127.0.0.1> \
--build-arg WORDPRESS_DB_NAME=<使用するDB名> \
--build-arg WORDPRESS_DB_USER=<DB接続ユーザ名> \
--build-arg WORDPRESS_DB_PASSWORD=<DB接続パスワード> \
-t <イメージ名>:<タグ> <Dockerfileを配置しているディレクトリパス>
3.MySQLのイメージを作成
docker build \
--build-arg MYSQL_ROOT_PASSWORD=<rootのパスワード> \
--build-arg MYSQL_DATABASE=<作成するDB名> \
--build-arg MYSQL_USER=<DB接続ユーザ名> \
--build-arg MYSQL_PASSWORD=<DB接続パスワード> \
-t <イメージ名>:<タグ> <Dockerfileを配置しているディレクトリパス>
以下は実際にコマンドを実行した結果となります。
イメージをコンテナ・レジストリにプッシュ
次に作成したイメージをコンテナ・レジストリにプッシュします。
これにより、OCI上のコンテナ・インスタンスからこのイメージを取得して、コンテナを起動できます。
OCIコンソールの右上にある「プロファイル」アイコンをクリックし、「テナンシ名」を選択します。

テナンシ詳細から「オブジェクト・ストレージ・ネームスペース」をコピーし、テキストエディタなどにペーストしておきます。

CloudShellを使用して以下の手順でコンテナ・レジストリにログインし、イメージにタグを付けてプッシュします。
Docker CLIの詳細については、以下のドキュメントをご参照ください。
Docker CLIを使用したイメージのプッシュ
1.コンテナ・レジストリにログイン
docker login <region-key>.ocir.io
2.プロンプトが表示されたら、事前に確認・生成しておいた認証情報を入力
Username: <tenancy-namespace>/<username>
Password: <認証トークン>
3.イメージのタグ付け
docker tag <イメージ名>:<タグ> <region-key>.ocir.io/<tenancy-namespace>/<repo-name>:<version>
4.イメージをプッシュ
docker push <region-key>.ocir.io/<tenancy-namespace>/<repo-name>:<version>
以下は実際にコマンドを実行した結果となります。

OCIコンソールの左側メニューから「開発者サービス」→「コンテナ・レジストリ」を選択します。

コンテナ・レジストリ画面からイメージが追加されていることが確認できます。

WordPress環境を構築
コンテナ・インスタンスの作成
次にコンテナ・レジストリにプッシュしたイメージを使用して、コンテナ・インスタンスの作成を行います。
ここではOCIコンソールからコンテナ・インスタンスを作成し、WordPressコンテナとMySQLコンテナを起動します。
OCIコンソールの左側メニューから「開発者サービス」→「コンテナ・インスタンス」を選択します。

コンテナ・インスタンス画面から「コンテナ・インスタンスの作成」を選択します。

コンテナ・インスタンスの作成画面の基本的な詳細の追加セクションから以下の項目を入力し、「次」を選択します。
- 名前:任意
- コンパートメントに作成:任意
- 配置:任意
- シェイプ:任意
- プライマリ・ネットワーク:任意(今回は新規仮想クラウド・ネットワークの作成を選択します。)
- サブネット:新規パブリック・サブネットの作成
- 新規サブネット名:任意
- コンパートメントに作成:任意
- CIDRブロック:任意
- パブリックIPv4アドレス:パブリックIPv4ドレスの割当
最初にWordPressで使用するコンテナの設定を行います。
コンテナ・インスタンスの作成画面のコンテナの構成セクションから以下の項目を入力します。
- Name:任意
- イメージ:プッシュしたイメージを選択します。(外部レジストリのイメージを選択することも可能です。)
- 環境変数:空白(今回はbuild時に環境変数を設定しましたがこちらからも設定することが可能です。)
「+別コンテナ」を選択します。

同様にMySQLで使用するコンテナの設定を行います。
設定が完了したら「次」を選択します。
コンテナ・インスタンスの作成画面の確認セクションでこれまで入力した設定内容を確認します。
内容に問題がなければ、「作成」を選択します。

以上でコンテナ・インスタンスの作成が完了しました。
セキュリティリストの設定
次に80ポートを使用したWebアクセスが許可されていないので、セキュリティリストの設定を行います。
OCIコンソールの左側メニューから「ネットワーキング」→「仮想クラウド・ネットワーク」を選択します。

仮想クラウド・ネットワークの画面から「対象のVCN」→「セキュリィティ」→「対象のセキュリィティリスト」を選択します。
セキュリィティリストの画面から「セキュリィティ・ルール」→「イングレス・ルールの追加」を選択し、80ポート使用したWebアクセスを許可するイングレス・ルールの追加を行います。
動作確認
WordPressが表示されるか確認
最後にWebブラウザを使用してアクセスし、WordPressが正しく表示されるかを確認します。
作成したコンテナ・インスタンスのパブリックIPアドレスをコピーします。

WebブラウザからコピーしたパブリックIPアドレスにアクセスしてWordPressの初期設定画面が表示されることを確認し、画面の案内従ってセットアップを行います。
WordPressの画面が表示されれば、完了です。
さいごに
本記事では、コンテナ・インスタンスを使用してWordPress環境を構築する手順をご紹介しました。
コンテナ・インスタンスは、Kubernetesなどのコンテナ・オーケストレーションを用意しなくてもコンテナを簡単に動かせるサーバレスサービスです。
素早く環境を立ち上げたり削除したり出来る為、開発・テスト環境の構築や一時的な検証環境の利用に最適ですね。
この記事を通じ、皆様の問題解決の一助となれば幸いです。
最後まで読んで頂き、ありがとうございました。
参考
以下のドキュメントもあわせてご参照ください。
ドキュメント
コンテナ・インスタンスの作成
OCI Container Instances概要 / OCI Container Instances - Speaker Deck