いま、自分比で大変ホットな話題のWeb会議サービス「Jitsi Meet」をubuntuではなくCentOS+Docker環境で動かしてみようとして、その環境を作ろうと、CentOS8環境をParallelsで作成して、さて、dockerをと思ったら・・・無い!!

無いんですよdockerが。。。。

あれ〜って思って、調べたらdockerではなく、podmanってのに変更しているとのこと。

CentOS8にdocker入れようかと思ったんですが、なんかややこしそうなのと、せっかくいいチャンスと思って、podmanにチャレンジすることとしました(^^;

Podって?

Dockerではcontainerなデーモンプロセスを経由するため、それらのプロセス停止で全機能が停止してしまうことをRedHatは主張していました。

それらへの回答として、このようなデーモンプロセスを利用しない環境としてPodmanが提供されています。

Podmanは、Dockerと互換性を持って作られていて、引数などの指定方法は、すべてDockerと同じです。さらに、Podの管理やKubernetesの管理用のYAMLファイルを 出力する機能が追加されています。

Podを作成すると管理用のコンテナであるinfraが自動的に生成され、infraで、Pod内のリソース(公開するポート、CPUやメモリなど)を管理されます。

Podとは、コンテナ型仮想化におけるコンテナの管理単位を表す用語です。Podは、複数の関連するコンテナをまとめて構成します。

Podに参加するコンテナがListenするポートは、127.0.0.1を通して他のポートから通信できます。

nginx+php+mariadbを構築してみましょう!

今回は、ユーザ名前空間を利用してルートレスモードで構築をしてみます。

これにより、開発サーバー一台用意して、みんなして使うなんてことができる。。はず(^^;

ではやっていきましょう。

手順は、基本的には「podman で nginx + php + mariadb を立ち上げてみる」を参考にしています。

これをルートレスで構築できるかをやっています。

動作環境

・MacOS + Parallels + CentOS8

必要なディレクトリを作成します

$ mkdir –p \
/home/kumakake/pod/mariadb/data \
/home/kumakake/pod/nginx/config \
/home/kumakake/pod/php/config \
/home/kumakake/pod/public

www-dataユーザーを作成し設定しておく

# useradd -M www-data : ホームディレクトリは不要
※UID,GIDをクライアント側も合わせる
# chonw www-data.www-data /home/kumakake/pod/public

php-extentionのイメージを作成する

phpのextention導入のため、Dockerfile を作成します。

/home/kumakake/pod/php/Dockerfile

イメージを作成します。

$ buildah bud \
–build-arg UID=$(id -u www-data) \
–build-arg GID=$(id -g www-data) \
–tag my-php .

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

$ podman images

PODを作成する

$ podman pod create -p 8080:80 -p 8443:443 -p 3306:3306 -n wwwpod

※-p 80:80とするとコンテナ立ち上げ時に下記のエラーが表示されます。

ERRO[0027] error starting some container dependencies
ERRO[0027] “error from slirp4netns while setting up port redirection: map[desc:bad request: add_hostfwd: slirp_add_hostfwd failed]”
ポートマッピングでエラー
非 root でコンテナを起動した場合はウェルノウンポートへのマッピングができないので、
1024 番ポート以降を利用するか、root でコンテナを起動する(sudo podman run …)

mariadbコンテナの立ち上げ

$ podman run –detach \
–pod wwwpod \
–name mariadb \
–restart always \
–volume /home/kumakake/pod/mariadb/data:/var/lib/mysql \
–env MYSQL_ROOT_PASSWORD=my-secret-pw \
mariadb

phpコンテナの立ち上げ

php の設定ファイルを先に作成したイメージから持ってきます。

$ podman run –name tmp-php -d localhost/my-php

$ podman cp tmp-php:/usr/local/etc/php/php.ini-production /home/kumakake/pod/php/config/php.ini
$ ls config/
php.ini

$ podman rm -f tmp-php

phpを立ち上げる

$ podman run –detach \
–pod wwwpod \
–name php \
–volume /home/kumakake/pod/php/config/php.ini:/usr/local/etc/php/php.ini:ro \
–volume /home/kumakake/pod/public:/usr/share/nginx/html \
localhost/my-php

nginxコンテナの立ち上げ

設定ファイルをnginxのイメージから持ってきます。

$ podman run –name tmp-nginx -d nginx

$ podman cp tmp-nginx:/etc/nginx/nginx.conf /home/kumakake/pod/nginx/config/nginx.conf
$ podman cp tmp-nginx:/etc/nginx/conf.d/default.conf /home/kumakake/pod/nginx/config/conf.d/default.conf
$ ls -al
drwxr-xr-x 2 kumakake kumakake 26 7月 26 05:35 conf.d
-rw-r–r– 1 kumakake kumakake 643 7月 8 00:52 nginx.conf
$ ls -al conf.d
-rw-r–r– 1 kumakake kumakake 1114 7月 26 05:18 default.conf

$ podman rm -f tmp-nginx

設定ファイルを編集します。

$ podman run –detach \
–pod wwwpod \
–name nginx \
–volume /home/kumakake/pod/nginx/config/nginx.conf:/etc/nginx/nginx.conf:ro \
–volume /home/kumakake/pod/nginx/config/conf.d:/etc/nginx/conf.d:ro \
–volume /home/kumakake/pod/public:/usr/share/nginx/html \
nginx

※/htmlにroとなっていたけど、必要なのか??
どちらでも同じ動きだったので、外しています。

※コンテナ立ち上げ後に設定ファイルを修正した場合は、 reload コマンドを実行する。
$ podman exec nginx nginx -s reload

動作確認をしましょう!

まずは、curl使って、htmlが表示されるか確認します。

リンクしている/home/kumakake/pod/publicになんかhtmlを作成します。

その後、curlで呼び出せるか確認します。

$ curl localhost:8080/abc.html

表示したらOK!!

phpはcurlでは確認できないので外部からブラウザでアクセスします。

今回は、確認はおなじみphpinfi()を表示させました。

/home/kumakake/pod/publicにinfo.phpで作成します。

外部のブラウザから、http://xxxxxx:8080/info.php で表示するかを確認します。

さてさて。。。

いくつかを立ち上げる場合は、docker-composeを利用しています。

podmanではpodman-composeがあります。

ただ、設定ファイル名はdocker-composeだそうですww

そちらにチャレンジします!