CentOS8でdockerに代わったpodmanでnginx+php+mariadbをPODで構築
いま、自分比で大変ホットな話題の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
1 2 3 4 5 6 7 8 9 10 11 |
FROM php:fpm-alpine RUN apk add --update --no-cache oniguruma-dev curl-dev icu-dev libpng-dev jpeg-dev giflib-dev shadow RUN docker-php-ext-install mbstring curl intl gd mysqli pdo_mysql opcache ARG UID=1001 ARG GID=1001 RUN usermod -u $UID www-data RUN groupmod -g $GID www-data |
イメージを作成します。
$ 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
1 2 3 |
REPOSITORY TAG IMAGE ID CREATED SIZE localhost/my-php latest c40903528600 4 minutes ago 135 MB docker.io/library/php fpm-alpine c8aada1d51a4 2 weeks ago 83.2 MB |
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
1 2 3 4 5 6 7 |
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fafd560ba33d docker.io/library/mariadb:latest mysqld 24 seconds ago Up 23 seconds ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb $ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fafd560ba33d docker.io/library/mariadb:latest mysqld 51 seconds ago Up 50 seconds ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb 78e166758b4c k8s.gcr.io/pause:3.1 About a minute ago Up 50 seconds ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp 36cb38832ad8-infra |
phpコンテナの立ち上げ
php の設定ファイルを先に作成したイメージから持ってきます。
$ podman run –name tmp-php -d localhost/my-php
1 2 3 4 |
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86c1c1c0d045 localhost/my-php:latest php-fpm About a minute ago Up About a minute ago tmp-php fafd560ba33d docker.io/library/mariadb:latest mysqld 6 hours ago Up 6 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb |
$ 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
1 2 3 4 |
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fafd560ba33d docker.io/library/mariadb:latest mysqld 6 hours ago Up 6 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb 78e166758b4c k8s.gcr.io/pause:3.1 6 hours ago Up 6 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp 36cb38832ad8-infra |
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
1 2 3 4 |
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 795b2083b4b7 localhost/my-php:latest php-fpm 30 minutes ago Up 30 minutes ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp php fafd560ba33d docker.io/library/mariadb:latest mysqld 8 hours ago Up 8 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb |
nginxコンテナの立ち上げ
設定ファイルをnginxのイメージから持ってきます。
$ podman run –name tmp-nginx -d nginx
1 2 3 4 5 |
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 964796a9ec4b docker.io/library/nginx:latest nginx -g daemon o... 7 seconds ago Up 7 seconds ago tmp-nginx 795b2083b4b7 localhost/my-php:latest php-fpm 2 hours ago Up 2 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp php fafd560ba33d docker.io/library/mariadb:latest mysqld 9 hours ago Up 9 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb |
$ 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
設定ファイルを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } |
$ 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となっていたけど、必要なのか??
どちらでも同じ動きだったので、外しています。
1 2 3 4 5 |
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cdbb85baa436 docker.io/library/nginx:latest nginx -g daemon o... About a minute ago Up 59 seconds ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp nginx 795b2083b4b7 localhost/my-php:latest php-fpm 3 hours ago Up 3 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp php fafd560ba33d docker.io/library/mariadb:latest mysqld 10 hours ago Up 10 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:3306->3306/tcp mariadb |
※コンテナ立ち上げ後に設定ファイルを修正した場合は、 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で作成します。
1 2 3 |
<?php var_dump( phpinfo()); ?> |
外部のブラウザから、http://xxxxxx:8080/info.php で表示するかを確認します。
さてさて。。。
いくつかを立ち上げる場合は、docker-composeを利用しています。
podmanではpodman-composeがあります。
ただ、設定ファイル名はdocker-composeだそうですww
そちらにチャレンジします!