podman で nginx + php + mariadb を立ち上げてみる

CentOS 6 のサポート期限が迫ってきているので CentOS 8 について必死で勉強しています。試しに全部コンテナで環境作ろうとしたのですが、CentOS 8 は docker ではなく podman が標準っぽいので、試しに podman で web サーバーを立ち上げてみました。

主力の PC が Windows なので Hyper-V で CentOS 8 を立ち上げて試しています(なので、 Hyper-V 専用の手順が紛れている可能性がありますがご承知おきください)。podman は docker と互換性があるので、 docker コマンドを podman に置き換えればほぼそのまま動くようです。

今回使用するイメージは以下の3つです。

podman でも Docker Hub からイメージをプルできます。

podman の目玉機能として、 rootless (ルート以外のユーザー)でコンテナ実行できる機能があるのですが、今回は 80 番ポートを使いたかったので rootfull で構築します。

SELinux が有効な場合は盛大にブロックしてくるので、先に setenforce 0 にしておき、後でポリシーを作りましょう(本記事では割愛)。また、 sudo 付けるのが面倒なので、root でログインして作業する想定で書いています。root 権限必須ですので、環境に合わせて sudo 付けてください。

PHP イメージの作成

php に関しては php の extension を入れないといけないので Dockerfile を書いてイメージを作る必要があります。podman でも Dockerfile なんですね。私はイメージ作成用のファイルをユーザーホームに作るタイプなので、/root/php/Dockerfileに以下のファイルを配置しました。必要な拡張は docker-php-ext-install コマンドを使用してインストールします。

また、拡張をビルドするために必要なパッケージを apk add に指定する必要があります。alpine Linux をベースにしているので、パッケージ管理は apk を使用します。dnf, apt-get とはパッケージ名が違う場合があるので注意が必要です。必要な物は php のドキュメントに書いてありますが、私は面倒なのでエラーが出たら追加する方針で書いてます。

shadow は usermod, groupmod コマンドを入れるために指定しているパッケージです。

イメージを作成する前に、 www-data ユーザー&グループをホスト側に作っておきます。php fpm イメージでは www-data ユーザーで php を実行するので、ホスト側とコンテナ側で同じユーザー名&UIDに揃えておいた方が便利なためです。

Dockerfile を配置したディレクトリに移動し、 buildah コマンドを打ちイメージを作成します。buildah はイメージ作成用のツールです。最初から CentOS 8 に入っていました。Dockerfile を置いたディレクトリで実行してください。

完了後に buildah imagesコマンドをたたくと localhost/my-phpイメージができているのが確認できます。

pod の作成

pod を作成します。pod はコンテナをまとめるグループ的なものです(細かい部分はよくわかってません・・・)。ネットワーク的に良さそう(localhost でコンテナ間通信できる)だったので、pod でまとめることにしました。

ポート番号のマッピングを変えたい場合は、左側の数字を変更します。-p host:containerです。

コンテナで使用するディレクトリの作成

場所は任意ですが、今回はコンテナ関係のファイルを /srvに置くことにしました。設定やデータ系を置く場所です。

public は web ページのファイルを置く場所なので、 www-data ユーザー&グループを所有者にしておきます。php が www-data ユーザーで実行されるので、読み書きできるようにしておく必要があるためです。

mariadb コンテナの立ち上げ

mariadb を立ち上げます。my-secret-pwは root のパスワードなので変更してください。

php コンテナの立ち上げ

php の設定ファイルを持ってきます。extension の読み込み設定は、 docker-php-ext-install コマンドにより自動で追加されるので不要です。

php を立ち上げます。

nginx コンテナの立ち上げ

まずは nginx の設定ファイルを持ってきます。

/srv/wwwpod/nginx/config/conf.d/default.conf を編集し、 php を実行できるようにします。

nginx を立ち上げます。

コンテナ立ち上げ後に設定ファイルを修正した場合は、 reload コマンドを実行します。

firewalld を設定

デフォルトの状態だとコンテナからインターネットが見れなかったので以下のコマンドを打ちました。

web ページの配置

/srv/wwwpod/public に html や php ファイルを置けば見えるようになるはずです。試しに WordPress を置いて軽く動かしてみましたが、大丈夫そうです。少なくとも記事の投稿やプラグインのインストールは可能でした。

その他

診断

何か問題が起きた時に調査する方法です。

実行中のコンテナを見る場合は以下のコマンドを使用します。

各コンテナの shell に入る場合は以下のコマンドを打ちます。php だけ alpine なので bash が入っていないです。

各コンテナのログを見る場合は以下のコマンドを打ちます。

コンテナの立ち上げ、停止

pod ごとまとめて開始・停止したり、コンテナごとに開始・停止したりできます。

課題

お試しなので権限回りの設定や動作確認が甘めです。

  • nginx と mariadb も UID GID そろえた方がよさそう
    • nginx はデフォルトだと UID=101 GID=101 で動く
    • mariadb (mysqld) は UID=999 GID=999 で動く
  • php と nginx のワーカープロセス、 mariadb 以外は root で動くので、SELinux を適切に設定したほうがよさそう
    • chcon -Rt container_file_t /srv/wwwpod で許可できる
    • コンテナを複数立ち上げる場合は MCS の設定も考える必要がありそう
  • インターネット側からアクセスできるかの確認
  • ホスト起動時にコンテナも立ち上げる方法
  • mariadb の設定ファイルもホスト側に置く
  • 存在しない php ファイルへアクセスすると「 File not found. 」画面が出てしまう

バージョン情報

今回使用した podman のバージョンです。

podman version 1.6.4
buildah version 1.11.6

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください