Contents
Overview
Podman を使用して phpIPAM を構築します。一般的に docker-compose を使用して構築されるようですが、今回は Podman なので Pod を使用するようにこちらを読み替えて手順化しています。
なお、この構築方法にはホストキャンで「0 new hosts discovered!」と表示される問題があります。コンテナで作成しているからかもしれませんが継続調査中です。
上記について、–privilegedをつけて起動するとホストスキャンが実行できるため、capabilityの問題であることがわかりました。ただ、–privilegedではセキュリティの問題があるため、最低限、–cap-add NET_RAW –cap-add NET_ADMINを付与することで解決しました。あとで全体的に整理します。
Pod
最初に Pod を作成します。今回は 10001 ポートを phpipam-www (外部に公開するコンテナ) に転送します。
myadmin@ubuntu:~$ sudo podman pod create -n phpipam-pod -p 10001:443 myadmin@ubuntu:~$ sudo podman pod ls
MariaDB
MariaDB コンテナを作成します。
myadmin@ubuntu:~$ sudo podman run -d --pod phpipam-pod --name phpipam-mariadb \ -e 'TZ=Asia/Tokyo' \ -e 'MYSQL_ROOT_PASSWORD=password' \ -v phpipam-db-data:/var/lib/mysql \ docker.io/library/mariadb myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
phpipam-www
phpipam-www コンテナを作成します。
ディレクトリの作成とファイルの配置
設定ファイル関連は bint mount にします。TLS 証明書を配置( TLS 証明書の作成はこちらを参照)します。Apache の設定ファイルを作成しています。
myadmin@ubuntu:~$ sudo mkdir -p /opt/container/phpipam/phpipam/apache2/conf.d myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/{issued/si1230.com.crt,private/si1230.com.key} /opt/container/phpipam/phpipam/apache2/conf.d myadmin@ubuntu:~$ sudo tee /opt/container/phpipam/phpipam/apache2/conf.d/ssl.conf <<"EOF" LoadModule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so SSLRandomSeed startup file:/dev/urandom 512 SSLRandomSeed connect builtin Listen 443 SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES:!ADH SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES:!ADH SSLHonorCipherOrder on SSLProtocol all -SSLv3 SSLProxyProtocol all -SSLv3 SSLPassPhraseDialog builtin SSLSessionCache "shmcb:/var/cache/mod_ssl/scache(512000)" SSLSessionCacheTimeout 300 <VirtualHost _default_:443> DocumentRoot "/var/www/localhost/htdocs" ServerName phpipam.si1230.com:443 ServerAdmin webmaster@si1230.com ErrorLog logs/ssl_error.log TransferLog logs/ssl_access.log SSLEngine on SSLCertificateFile /etc/apache2/conf.d/si1230.com.crt SSLCertificateKeyFile /etc/apache2/conf.d/si1230.com.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/var/www/localhost/cgi-bin"> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> EOF
コンテナの実行
phpipam-web コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run --cap-add NET_RAW --cap-add NET_ADMIN -d --pod phpipam-pod --name phpipam-web \ -e 'TZ=Asia/Tokyo' \ -e 'IPAM_DATABASE_HOST=127.0.0.1' \ -e 'IPAM_DATABASE_PASS=password' \ -e 'IPAM_DATABASE_WEBHOST=%' \ -v phpipam-logo:/phpipam/css/images/logo \ -v phpipam-ca:/usr/local/share/ca-certificates:ro \ -v /opt/container/phpipam/phpipam/apache2/conf.d/si1230.com.crt:/etc/apache2/conf.d/si1230.com.crt:ro \ -v /opt/container/phpipam/phpipam/apache2/conf.d/si1230.com.key:/etc/apache2/conf.d/si1230.com.key:ro \ -v /opt/container/phpipam/phpipam/apache2/conf.d/ssl.conf:/etc/apache2/conf.d/ssl.conf:ro \ docker.io/phpipam/phpipam-www myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
phpipam-cron
phpipam-cron コンテナを作成します。
myadmin@ubuntu:~$ sudo podman run --cap-add NET_RAW --cap-add NET_ADMIN -d --pod phpipam-pod --name phpipam-cron \ -e 'TZ=Asia/Tokyo' \ -e 'IPAM_DATABASE_HOST=127.0.0.1' \ -e 'IPAM_DATABASE_PASS=password' \ -e 'SCAN_INTERVAL=1h' \ -v phpipam-ca:/usr/local/share/ca-certificates:ro \ docker.io/phpipam/phpipam-cron myadmin@ubuntu:~$ sudo podman ps
phpIPAM へのアクセス確認
以下で phpIPAM にアクセスできます(DNS や hostsに事前に登録しておく)。TLS のため、FQDN でアクセスすべき(ブラウザで警告が出るため)ですが、IP アドレスでも問題はありません。初回アクセス時に phpIPAM のインストーラーが起動します。インストーラーの操作は、このようなアプリケーションの構築に慣れていればそれほど悩むことではないと思いますので省略します。
https://phpipam.si1230.com:10001
systemd
systemd で phpIPAM を管理します。
systemd ユニットファイル
systemd ユニットファイルを生成します。コマンドオプションはいくつかありますが、通常は以下で十分でしょう。
myadmin@ubuntu:~$ cd /etc/systemd/system && sudo podman generate systemd -f -n phpipam-pod && cd
/etc/systemd/system/pod-phpipam-pod.service
/etc/systemd/system/container-phpipam-cron.service
/etc/systemd/system/container-phpipam-web.service
/etc/systemd/system/container-phpipam-mariadb.service
systemd ユニットファイルの有効化
systemd を再起動して、追加したユニットファイルを読み込みます。
myadmin@ubuntu:~$ sudo systemctl daemon-reload
systemd を使用した Podman の操作
systemd から phpipam-pod を操作してみます。
myadmin@ubuntu:~$ sudo systemctl status pod-phpipam-pod.service myadmin@ubuntu:~$ sudo systemctl start pod-phpipam-pod.service myadmin@ubuntu:~$ sudo systemctl stop pod-phpipam-pod.service myadmin@ubuntu:~$ sudo systemctl restart pod-phpipam-pod.service
systemd の自動起動設定
システム起動時に phpipam-pod が起動するように systemd を設定します。
myadmin@ubuntu:~$ sudo systemctl enable pod-phpipam-pod.service myadmin@ubuntu:~$ sudo systemctl is-enabled pod-phpipam-pod.service enabled
クリーンアップ
これまでの環境をクリーンナップするコマンドです。
sudo rm /etc/systemd/system/pod-phpipam-* sudo rm /etc/systemd/system/container-phpipam-* sudo systemctl daemon-reload sudo podman rm -f phpipam-cron phpipam-web phpipam-mariadb sudo podman volume rm phpipam-ca phpipam-logo phpipam-db-data sudo podman pod rm phpipam-pod sudo rm -r /opt/container/phpipam