| |
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 として配置する必要がありますが、
ここでは省略します。

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