Podmanで色々なWebサーバを起動する
色々な方法で簡単なWebサーバを起動してみます。


Node.jsアプリケーション
自分でHTTPの応答を返す簡単なNode.jsアプリケーションの例です。 Alpine Linuxという超小型OSを元にしたnode-alpineという公式イメージがあるのでこれを使います。
Dockerfileをこのように作ります。

FROM node:16-alpine
WORKDIR /app
COPY . .
CMD ["node", "hello_server.js"]

hello_server.js を作ります。

const http = require("http");
const server = http.createServer(function(req, res){
    res.writeHead(200, {"Content-Type": "text-html;charset=utf-8"});
    res.end('<!DOCTYPE html>\n<html lang="ja"><head><meta charset="UTF-8"/></head><body><div>Hello World<br>こんにちは。</body></html>');
});
server.listen(17000);
console.log("Server is running!");

イメージを作って起動します。

podman build -t hellojs-image .
podman images
podman run -d --name hellojs -p 17000:17000 hellojs-image
podman logs hellojs


nginxで静的文書を配信する
PHPやPythonを使わない、HTML文書だけを配信するnginxコンテナを起動してみます。
イメージはnginx公式の物をそのまま使います。

まずホストOS上で /var/www/html/nginx-htdocs/index.html となる位置にHTML文書を用意します。

<!DOCTYPE html>
<html lang="ja">
<body>
<h3>こんにちは</h3>
<div>
Hello!! This is test nginx server.<br>
こんにちは。
</div>
</body>
</html>

コンテナを起動します。

podman run -d -p 17000:80 --name hello-nginx -v /var/www/html/nginx-htdocs:/usr/share/nginx/html:z nginx
podman ps

RHEL 9.2でSELinuxを有効にしていると、-vのオプションの末尾には":z"を付ける必要があります。 付けないと大抵「Permission denied」というエラーになります。
なお、公式サイトには":ro"を付けたコマンドラインが載っています。":ro,z"のように併用もできるみたいです。


MySQL/MariaDBクライアントを追加したApache+PHPコンテナ
Dockerfileを次のように記述します。

FROM php:8.1-apache
RUN apt-get update && apt-get install libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring

mbstringのコンパイルにはonigurumaというライブラリが必要です。 パッケージ名はoniguruma-devではなくlibonig-dev になります。
php-apache公式イメージのディストリビューションはDebianなので、上の例のようにapt-getコマンドでインストールします。

podman build -t php81-apache-image .
podman images
podman run -d --name php81 -p 17000:80 -v /var/www/html:/var/www/html:z php81-apache-image

php-apache公式イメージのDocumentRootはデフォルトで /var/www/html です。 上の例ではホストOSの /var/www/html をそのままコンテナにも見せています。
例えば /var/www/html/mysqltest.php のようなファイルを次のように作成します。

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"></head>
<body>
<?php
$pdo = new PDO("mysql:host=dbserver-hostname.nsnhnkmmkk.co.jp;port=3306;dbname=db1;charset=utf8mb4", "user1", "pass1");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = <<<SSQL
SELECT ITEM_ID, ITEM_NAME, CATEGORY_ID, SIZE_DESC, PRICE, MAKER_DESC
  FROM ITEMS WHERE CATEGORY_ID = ?
SSQL;

$st = $pdo->prepare($sql);
$st->execute([ "3" ]);
while($rset = $st->fetch(PDO::FETCH_NUM)){
    print(implode("\t", $rset) . "<br>" . PHP_EOL);
}
$st = null;
$pdo = null;
?>
</body>
</html>

またphp.iniは /usr/local/etc/php に配置します。 ここには php.ini-development と php.ini-production というファイルが初期状態で置かれているので、 どちらかを元に timezoneとかinclude_pathとかを適切に変更したファイルを php.ini として配置する必要がありますが、 ここでは省略します。

Misc. Topics Top

(first uploaded 2023/10/22 last updated 2023/10/22, URANO398)