変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

[VScode]リモートサーバに繋ぐ※メモ書き

VScodeでHTMLやJavaScripの作成やデバッグができるけど、リモートなサーバにはWinSCP等でコピっていたけど今はSSH接続でターミナルやファイル転送やデバッグができる。

1.SSH接続の設定を追加する

まず、左のリモートエクスプローラ(><っぽい奴)からSSHの歯車をクリック。

一番上のconfigを選択

そして適当に追記

Host {SSH接続先メニューのタイトル}
    HostName {リモートホストのIPアドレス}
    User {SSH接続時のユーザ名}
    Port 22  ※多分22でOK
    IdentityFile ~/.ssh/{秘密鍵ファイル名のハズ}

Host のタイトルを {ユーザ名}@{表示名} のように書いたら、

プロセスが、存在しないパイプに書き込もうとしました。

とかエラーになった。

{表示名}_{ユーザ名}はOKなので@だけ失敗するかもしれない。

タダの表示名では無い様だ。

Ctrl+Sで保存

2.SSH鍵ファイルの作成と転送

昔はPuTTYをインストしてKEY-GENで作って出来たものを変換して・・・だったけど、

今はWindowsのコマンドプロンプトで作成できる。

※元ネタ:SSH鍵の生成と使用ガイド(Windows対応)

> dir "%USERPROFILE%\.ssh"         ※ SSH鍵を保存する .ssh フォルダがあるか調べる
> mkdir "%USERPROFILE%\.ssh" ※ .sshフォルダが無かったら実行する
> ssh-keygen -t rsa -b 4096 -f "%USERPROFILE%\.ssh\id_rsa" -N ""    ※このコマンドで作ってくれる

出来た公開鍵を使って下のスクリプト7行を{…}内を修正した内容をコピって

PowerShellにペーストしてリモートのホストの認証リストに追記させる。

※元ネタ:Windowsでssh-copy-idっぽいことをしたい

※改行を無視させる文末の「`」の前に半角空白が必須

$sshUser = '{SSH接続ユーザ名}'
$sshHost = '{リモートホストのIPアドレス}'
cat ~/.ssh/id_rsa.pub | ssh ${sshUser}@${sshHost} `
" `
mkdir -p ~/.ssh && chmod 700 ~/.ssh && `
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys `
"

※ログインするのでパスワード入力応答あり、

これでリモートホストのフォルダを見る度にパスワード入力しなくてもいい。

リモートホストを選択し

なぜかリモートホストのプラットフォームをちゃんと選択すると

自動的に選択したプラットフォーム用のVSCode-Serverがリモートホストにインストされる

それはいいけど英語のメッセージ

和訳すればホッとする内容

これで毎回パスワード入力画面(下図)を見たくて良くなったのはとても気分がいい。

接続するとターミナルか

エクスプローラからソースを選択すれば編集できて保存もやってくれる。

デバッグもソースを手前に表示している状態でメニューの【実行】から

Node.jsを選択すれば、デバッグコンソールで

$  node  {表示してるJSファイル}

してデバッガが起動するのはいつも通り。

ブレークポイントとかウォッチ式も使える。※ import.meta.url 等一部不可

但しVSCodeで開いたフォルダがプロジェクト以外のディレクトリィだとそのディレクトリィをカレントディレクトリィとしてnodeを実行するみたいなので

privateKey: fs.readFileSync(`${__dirname}.ssh/id_rsa`), ※__dirname がホームディレクトリィ
↓
privateKey: fs.readFileSync(new URL(`.ssh/id_rsa`, import.meta.url)), ※ソースのフルパスを使う

とかちょっと修正が必要。



[xterm.js]ssh接続その2

リモートホストとPCの両方をVScodeで観れるようになると色々注意されるのが気になってきたので修正

1.CommonJSモジュールをESモジュールに変えてみる

ソースの…が気になるので見てみると

云うのでクイックフィックスしてみると

と修正候補のESモジュールに変換するをクリック。

それはそれでもいいけどね

2.負傷1

別のソースで同様に変換すると

import { WebSocket } from 'ws';
・・・
const wss = new WebSocket.Server({ port: sshInfo.wsport });

WebSocket.Server にコンストラクタ無いっすエラー

ググって他人のソースを検索してみたら

import { WebSocketServer } from 'ws';
・・・
const wss = new WebSocketServer({ port: sshInfo.wsport });

と書いていたので真似た。

3.負傷2

クイックフィックスが一気に書き換えて実行すると

別に{}を取ればいいだけなんだが

import fs from 'fs';

で実行すると

はいはいpackage.jsonもESモジュール宣言ね。

ps.2025/4/8

ブラウザ用のjsファイルもESモジュールにできるみたいだ。

しかし、TypeScriptで書いたモジュールのjsファイルは

同名の.d.tsファイルを作り、export宣言をしても、ブラウザがエラってしまう。

inportmapを作ってもダメ。



[xterm.js]ssh2接続

ブラウザとシェルはWebSocketで非同期に相互に(つまり自分勝手)に通信する。

node.jsでspawnすればシェルと繋がるけど、改行入力で1行入力(readline)っぽくシェルがやってくれると思ってたら、改行しても応答無しstdinストリームを閉じまで入力したコマンドを実行する気配が無かった、BackSpaceもそのまま渡ってしまう・・・

どうやらsshサービスが頑張ってる様だ。

node.jsからシェル起動は諦めて、ssh2サービスに繋ぐことにする。

1.WebSocketサーバーの作成

# mkdir testServer
# cd testServer
# npm init
・・・・・
# npm install ssh2            ※SSH2パッケージ
# npm install ws              ※WebSocketパッケージ
const WebSocket = require('ws');
const { sshTerm } = require('./sshTerm.js');
// SSH接続情報
const sshInfo = {
user      : '{SSHのログイン・ユーザ名}',
password  : '{SSHのログイン・パスワード}' {または} privateKey: require('fs').readFileSync('/PATH/id_rsa') ,
ipaddress : '{SSHのホストIPアドレス}',
sshport   : {SSHのポート番号},
wsport    : {WebSocketのポート番号},
httpport  : {apacheのポート番号},
httpath   : '{urlのパス}',
};
// ポート${sshInfo.wsport}でWebSocketサーバーを作成
const wss = new WebSocket.Server({ port: sshInfo.wsport });
// 案内文
console.log(`ssh ready, URL http://${sshInfo.ipaddress}:${sshInfo.httpport}/${sshInfo.httpath}`);
// WebSocketクライアント(xterm.js)接続時の処理
wss.on('connection', function connection(ws) {
  const env = process.env;
  console.log('connection WebSocket client.');
   const bash = sshTerm(ws, sshInfo);
});

passwordかprivateKeyかprivateKeyPathのいづれかを指定できる。

const { Client } = require('ssh2');
// SSH接続を確立
const sshTerm = async (ws, sshInfo) => {
  const commandName = 'bash';
  const conn = new Client();
  conn.on('ready', () => {
    // ssh2接続準備完了
    console.log('Client :: ready');
    // shell対応
    conn.shell((err, stream) => {
      if (err) throw err;
      stream.on('close', () => {
        // エラった時
        if (code !== 0) {
          console.log(`${commandName} process exited with code : ${code}.`);
        } else {
          console.log(`${commandName} process exited.`);
        }
        ws.send(`disconnected.`);
        conn.end();
      }).on('data', (data) => {
        // ssh2からデータが送られた時の処理
        console.log(`${commandName} : ${data}`);
        data = data.toString().replaceAll('\n', '\r\n');
        ws.send(data);
      });      
      // WebSocketクライアント(xterm.js)からメッセージ受信時の処理
      ws.on('message', async (message) => {
        console.log('受信したメッセージ: %s', message);
        stream.write(message);
      });      
      // WebSocketクライアント(xterm.js)クライアントから切断された時の処理
      ws.on('close', function close() {
        console.log('クライアントとの接続が切断');
        stream.end();
      });
      // Ctrl+Cで止められた時の処理      
      process.on('SIGHUP', ()=> {
        console.log('Got SIGHUP. ');
        stream.end();
        console.log('クライアントの接続をパージ');
        ws.close();
     });
     // 以上
    });
  }).connect({
    host: sshInfo.ipaddress,
    port: sshInfo.sshport,
    username: sshInfo.user,
    password: sshInfo.password {または} privateKey: sshInfo.privateKey,
  });
};
exports.sshTerm = sshTerm;
  • privateKey
    • ‘~/.ssh/id_rsa` の様な ‘~’ を使うとopenエラー。
      • 代用はprocess.env[‘HOME’]
  • privateKeyPath
    • エラってしまう。

testServerプロジェクトの雰囲気

  • testServer
    • index.html
    • sshTerm.js
      • node_modules
        • ssh2
        • ws

ここで、

# node index.js

でサーバー側の準備は終わり。

2.WebSocketクライアントの作成

クライアントはapacheのhtmlの下にtestディレクトリィを作りxtermのアドオン等を追加する。

# cd /var/www/html
# mkdir test
# cd test
# npm init
・・・
# npm install @xterm/xterm
# npm install @xterm/addon-web-links
# npm install @xterm/addon-attach
# npm install @xterm/addon-clipboard
# npm install @xterm/addon-fit
# npm install @xterm/addon-image
# npm install @xterm/addon-web-links
# npm install @xterm/addon-webgl

必要なのは、node_modules/@xterm下の cssファイル、jsファイル、mapファイルだけなので不要なファイルは削除する。

index.htmlにアドオンのファイルを追記。

<!doctype html>
  <html lang="ja">
    <meta charset="UTF-8">
    <title>xterm.js test page</title>
    <head>
      <link rel="stylesheet" href="node_modules/@xterm/xterm/css/xterm.css" />
      <script src="node_modules/@xterm/xterm/lib/xterm.js"></script>
      <script src="node_modules/@xterm/addon-web-links/lib/addon-web-links.js"></script>
      <script src="node_modules/@xterm/addon-attach/lib/addon-attach.js"></script>
      <script src="node_modules/@xterm/addon-clipboard/lib/addon-clipboard.js"></script>
      <script src="node_modules/@xterm/addon-fit/lib/addon-fit.js"></script>
      <script src="node_modules/@xterm/addon-image/lib/addon-image.js"></script>
      <script src="node_modules/@xterm/addon-web-links/lib/addon-web-links.js"></script>
      <script src="node_modules/@xterm/addon-webgl/lib/addon-webgl.js"></script>
      <script src="test.js"></script>
    </head>
    <body>
      <div id="terminal"></div>
    </body>
  </html>

test.jsにもアドオンの初期化等を追記

// 初期化処理
const sshInfo = {
wsport    : {WebSocketのポート番号},
};
window.addEventListener('load', () => {
  const term = new Terminal();
  //
  term.open(document.getElementById('terminal'));
  term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ');  
  // addon  
  // @xterm/addon-attach
  // initialization
  const webSocket = new WebSocket(`ws://${location.hostname}:${sshInfo.wsport}`);
  const attachAddon = new AttachAddon.AttachAddon(webSocket);
  term.loadAddon(attachAddon);
  // @xterm/addon-clipboard
  // initialization
  const clipboardAddon = new ClipboardAddon.ClipboardAddon();
  term.loadAddon(clipboardAddon);
  // @xterm/addon-fit
  // initialization
  const fitAddon = new FitAddon.FitAddon();
  term.loadAddon(fitAddon);
  fitAddon.fit();
  // @xterm/addon-image
  // customize as needed (showing addon defaults)
  const customSettings = {
    enableSizeReports: true,    // whether to enable CSI t reports (see below)
    pixelLimit: 16777216,       // max. pixel size of a single image
    sixelSupport: true,         // enable sixel support
    sixelScrolling: true,       // whether to scroll on image output
    sixelPaletteLimit: 256,     // initial sixel palette size
    sixelSizeLimit: 25000000,   // size limit of a single sixel sequence
    storageLimit: 128,          // FIFO storage limit in MB
    showPlaceholder: true,      // whether to show a placeholder for evicted images
    iipSupport: true,           // enable iTerm IIP support
    iipSizeLimit: 20000000      // size limit of a single IIP sequence
  }
  // initialization
  const imageAddon = new ImageAddon.ImageAddon(customSettings);
  term.loadAddon(imageAddon);
  // @xterm/addon-web-links
  term.loadAddon(new WebLinksAddon.WebLinksAddon());
  // @xterm/addon-webgl
  term.loadAddon(new WebglAddon.WebglAddon());
});

new ClipboardAddon.ClipboardAddon()とか変な書き方になってるのは

サンプルソースでは new ClipboardAddon() なので実行するとコンストラクタが無いエラーになる。

ブラウザのJavaScriptではグローバルな宣言は、windowオブジェクトにぶら下がるので、

Chromeの開発ツールの監視でwindow値を見ると ClipboardAddon が見つかる

見た感じではClipboardAddon オブジェクトにClipboardAddon クラスがぶら下がっている感じだったのであの様に new している。

多分、TypeScriptのコードをビルドしたソース(というかESModuleコード全般)をJavaScriptから利用するとexportsした名前の下にexportsしたい対象がブラ下がる様に見えるらしい。

/var/www/html/testプロジェクトの雰囲気

  • test
    • index.html
    • test.js
      • node_modules
        • (いっぱい)

後はブラウザから http://localhost/test/ を開く。

topコマンドやviコマンドも普通に使える。

ブラウザで複数のセッションを開けるけど、多人数で使うのは無理。

とても少ないコードでここまで動くのは大助かり。

もっとも

VisualStudioCodeのSSH接続でソース修正やデバッグができるので

もう不要と云えば不要だけどね。

ps.2025/4/9

アドオンがうまく動作していなかったけど、参考を見て紛れてるミスを訂正したらマウスホバーでリンク表示とかCtrl+クリックでジャンプ出来る様になった。



[xterm.js]文字を入力できるだけのサンプル

概ねxterm.jsのサンプルの通りにやってみた。

# mkdir test
# cd test
# npm init ※プロジェクトを初期化

# npm install @xterm/xterm
<!doctype html>
  <html lang="ja">
    <meta charset="UTF-8">
    <title>xterm.js test page</title>
    <head>
      <link rel="stylesheet" href="node_modules/@xterm/xterm/css/xterm.css" />
      <script src="node_modules/@xterm/xterm/lib/xterm.js"></script>
      <script src="test.js"></script>
    </head>
    <body>
      <div id="terminal"></div>
    </body>
  </html>
// 初期化処理
window.addEventListener('load', () => {
  var term = new Terminal();
  term.open(document.getElementById('terminal'));
  term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ');
  // 何かが送られた時
  term.onData((data) => {
    // とりあえず画面に書く
    if(data === '\r') {
      // 改行して欲しいから差替え
      term.write('\r\n');
    } else {
      term.write(data);
    }
  });
  // 何かキーが押された時
  term.onKey((e) => {
    // 特に何もしない
  });
});

上の2ファイルとnode_modulesディレクトリィをapacheのドキュメントルートのtestフォルダにコピー

  • {apacheのDocumentRoot}
    • test
      • index.html
      • test.js
      • node_modules
        • @xterm
          • xterm
            • css
              • xterm.css
            • lib
              • xterm.js

で、ブラウザからhttp://localhost/testで

【Enter】で行頭へジャンプするけど改行しないのでスクリプトで改行コードを追加した。

【Del】と【BackSpace】キーは無反応。

右クリックでコピペは出来るが【切り取り】は無反応。

複数行で貼り付けると、改行混ざってるからちゃんと置換しないとダメか。

// 初期化処理
window.addEventListener('load', () => {
  var term = new Terminal();
  term.open(document.getElementById('terminal'));
  term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ');
  // 何かが送られた時
  term.onData((data) => {
    // とりあえず画面に書く
    data = data.replaceAll('\r', '\r\n');  // 改行コードの置換
    term.write(data);
  });
  // 何かキーが押された時
  term.onKey((e) => {
    // 特に何もしない
  });
});

中途半端だけどnode.js入れたついでにlinuxシェルと繋げてみるか?

そのためのアドインがTypeScriptで出来てるっぽいのでどうしたものか?



[sed]面白い使い方

1.見たいところを抽出

# sed -n '開始行,終了行p' ファイル名

-nオプション:指定した行だけ表示する。-nとpコマンドの表記は重複するトコがお茶目
オプションは、-n, –quiet, –silent のいづれかでOK
例:sed -n ‘1,4p’ file
‘…’はシェルに特定の文字やパターンを変換させない指示なので’1,4p’なら1,4pでも構わない
例:sed -n 1,4p file

sed -n '/{開始行のパターン}/,/{開始行のパターン}/p' ファイル名

たまに逆のやり方が必要になるかもしれない

sed -n '/{開始行のパターン}/,/{開始行のパターン}/!p' ファイル名

例:sed -n ‘/start/,/end/p’ file

# sed -n '/<Directory \/>/,/<\/Directory>/p' /etc/httod/conf/httpd.conf
<Directory />
    AllowOverride none
    Require all denied
</Directory>
#

2.その範囲の中で特定のパターンを置換する

AllowOverride noneやRequire all deniedは何度の出現するので

http.confの

<Directory />と</Directory>の行の間の

AllowOverride noneをAllowOverride allに書き換えるなら

sed -i '/{開始行のパターン}/,/{開始行のパターン}s/{置換元パターン}/{置換後パターン}/' ファイル名

-iでファイルを上書きするので要バックアップ

# cp httpd.conf httpd.conf.bk ※バックアップは大事

# sed -n '/<Directory \/>/,/<\/Directory>/s/AllowOverride none/AllowOverride all/ p' httpd.conf
    AllowOverride all

で置換したテキストが表示されたので

注意深く修正して上書きする

# cp httpd.conf httpd.conf.bk ※バックアップは大事

# sed -i '/<Directory \/>/,/<\/Directory>/s/AllowOverride none/AllowOverride all/' httpd.conf
# diff  httpd.conf.bk httpd.conf
108c108
<     AllowOverride none
---
>     AllowOverride all
#

うっかり後ろのpを消し忘れるとコピーコマンドpが誤爆する

# sed -i '/<Directory \/>/,/<\/Directory>/s/AllowOverride none/AllowOverride all/ p' httpd.conf
# diff  httpd.conf.bk httpd.conf
108c108,109
<     AllowOverride none
---
>     AllowOverride all
>     AllowOverride all
#


[podman]AlmaLinux9+apache

AlmaLinux9+apacheのイメージを作ってみる。

podmanの使い方としては、

  • mariaDBコンテナ
  • apacheコンテナ

とした方が良いかなと思うから。

FROM  almalinux:latest
RUN   dnf -y update
RUN   dnf -y install httpd
#COPY  httpd.conf /etc/httpd/conf/httpd.conf
RUN   systemctl enable httpd
#
RUN   dnf clean all;
EXPOSE 80 443
CMD [ "/sbin/init" ]

を作って

# podman build -t almalinux9_apache .
STEP 1/7: FROM almalinux:latest
STEP 2/7: RUN   dnf -y update
--> Using cache a2b577abfca6c6300e9f168092f69ba20ea7a88d6149f315be56de91a4380bf7
--> a2b577abfca6
STEP 3/7: RUN   dnf -y install httpd
Last metadata expiration check: 21:24:28 ago on Wed Apr  2 17:57:08 2025.
・・・
Installed:
  almalinux-logos-httpd-90.5.1-1.1.el9.noarch                                   
  apr-1.7.0-12.el9_3.x86_64                                                     
  apr-util-1.6.1-23.el9.x86_64                                                  
  apr-util-bdb-1.6.1-23.el9.x86_64                                              
  apr-util-openssl-1.6.1-23.el9.x86_64                                          
  httpd-2.4.62-1.el9_5.2.x86_64                                                 
  httpd-core-2.4.62-1.el9_5.2.x86_64                                            
  httpd-filesystem-2.4.62-1.el9_5.2.noarch                                      
  httpd-tools-2.4.62-1.el9_5.2.x86_64                                           
  libbrotli-1.0.9-7.el9_5.x86_64                                                
  mailcap-2.1.49-5.el9.noarch                                                   
  mod_http2-2.0.26-2.el9_4.1.x86_64                                             
  mod_lua-2.4.62-1.el9_5.2.x86_64                                               

Complete!
--> 76f7cccc93f3
STEP 4/7: RUN   systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
--> 8071a49560fc
STEP 5/7: RUN   dnf clean all;
26 files removed
--> 9cde52251b3b
STEP 6/7: EXPOSE 80 443
--> 91aa7de1ab1c
STEP 7/7: CMD [ "/sbin/init" ]
COMMIT almalinux9_apache
--> 1d4a7b70300c
Successfully tagged localhost/almalinux9_apache:latest
1d4a7b70300c7fda2a4dfea9dd5e02a5645a4e9236e326543838e9ffe3351af3

ではコンテナを作成

# podman run -d -it --name almalinux9_apache_contener_work \
 -p 80:80 \
 almalinux9_apache
603e81035435f7078243160754c72c621324151e3ccb0e1dd80d5f4d1e1362f0

ログも異常なし。

コンテナ内の

  • /etc/httpd/conf
  • /etc/httpd/conf.d
  • /var/www

を圧縮して取り出してホストの各保存ディレクトリィに展開しコンテナを作り直し

# podman run -d -it --name almalinux9_apache_contener \
 -p 8080:80 \ ※80:80だとエラるので8080
 -v '/{www保存ディレクトリィ※事前作成済}:/var/www' \
 -v '/{conf保存ディレクトリィ※事前作成済}:/etc/httpd/conf' \
 -v '/{conf.d保存ディレクトリィ※事前作成済}:/etc/httpd/conf.d' \
 almalinux9_apache
7b6fe5be65cedc24e4821f9edb2246ba7444d0f953d1b0185ded091083acae8a

# firewall-cmd --add-port=8080/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all ※設定内容の確認

これでホスト側で設定やコンテンツを編集しやすくなった(笑

# podman exec almalinux9_apache_contener systemctl reload httpd
# podman exec almalinux9_apache_contener systemctl restart httpd

は長いからコンテナの停止・起動でいいや



[podman]AlmaLinux9+mariaDB

podmanでAlmaLinux9のイメージに普通にmariaDBをインストする手順でDockerfileを作ってみる。

が、コンテナがすぐ終了してしまい原因も解らない。

/bin/bash起動させたコンテナにアタッチしてsystemctl start mariadbもsystemdが動いてないとエラる。

Docker.ioのmariadbのコンテナの様にmariadbdを実行させてもダメ。

起動コマンドはsystemctlを使う都合上systemdが起動しないといけないので、”/sbin/init”が適切のハズ

でもコンテナで/sbin/initしてもダメ。

どういう訳かDockerfileで/sbin/initしなければいけないらしい。

と気が付くまでに

結構な時間が過ぎていた。(笑

FROM  almalinux:latest
RUN   dnf -y update
RUN   dnf -y install mariadb mariadb-server
COPY  carset.cnf /etc/my.cnf.d/charset.cnf
RUN   systemctl enable mariadb
RUN   dnf clean all;
# コンテナでport指定が必須なのでEXPOSEは注意書き程度の意味
EXPOSE 3306
CMD [ "/sbin/init" ]

コンテナ内でsystemdを実行する方法 の記事で、podman run のマニュアルが抜粋されてた。

# man podman run
・・・
--systemd=true | false | always
       Run container in systemd mode. The default is true.
              • true enables systemd mode only when the command executed inside the container is systemd, /usr/sbin/init, /sbin/init or /usr/local/sbin/init.
              • false disables systemd mode.
              • always enforces the systemd mode to be enabled.
       Running the container in systemd mode causes the following changes:
              • Podman mounts tmpfs file systems on the following directories
                • /run
                • /run/lock
                • /tmp
                • /sys/fs/cgroup/systemd (on a cgroup v1 system)
                • /var/lib/journal
              • Podman sets the default stop signal to SIGRTMIN+3.
              • Podman sets container_uuid environment variable in the container to the first 32 characters of the container ID.
              • Podman does not mount virtual consoles (/dev/tty\d+) when running with --privileged.
              • On cgroup v2, /sys/fs/cgroup is mounted writeable.
       This allows systemd to run in a confined container without any modifications.
       Note  that  on SELinux systems, systemd attempts to write to the cgroup file system. Containers writing to the cgroup file system are denied by default.  The container_manage_cgroup boolean must
       be enabled for this to be allowed on an SELinux separated system.
       setsebool -P container_manage_cgroup true
・・・

podman run –systemd=trueオプションがデフォなので、/sbin/initを指定すれば動く(ハズが動かない

この記事と同じようにDockerfileを使ってpodman buildすれば動くので、良しとしよう。

コピー元のデータベースのキャラセットの設定ファイルを作る

[mysqld]
character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

でイメージを作ってみる。

# podman build -t almalinux9_mariadb .
STEP 1/8: FROM almalinux:latest
STEP 2/8: RUN   dnf -y update
AlmaLinux 9 - AppStream                         5.4 MB/s |  15 MB     00:02    
AlmaLinux 9 - BaseOS                            2.8 MB/s |  17 MB     00:06    
AlmaLinux 9 - Extras                             12 kB/s |  13 kB     00:01    
Dependencies resolved.
・・・
Upgraded:
  glibc-2.34-125.el9_5.3.alma.1.x86_64                                          
  glibc-common-2.34-125.el9_5.3.alma.1.x86_64                                   
  glibc-minimal-langpack-2.34-125.el9_5.3.alma.1.x86_64                         
  libxml2-2.9.13-6.el9_5.2.x86_64                                               
  systemd-252-46.el9_5.3.alma.1.x86_64                                          
  systemd-libs-252-46.el9_5.3.alma.1.x86_64                                     
  systemd-pam-252-46.el9_5.3.alma.1.x86_64                                      
  systemd-rpm-macros-252-46.el9_5.3.alma.1.noarch                               
  tzdata-2025b-1.el9.noarch                                                     

Complete!
--> a2b577abfca6
STEP 3/8: RUN   dnf -y install mariadb mariadb-server
Last metadata expiration check: 0:00:19 ago on Wed Apr  2 17:57:08 2025.
Dependencies resolved.
・・・
Installed:
・・・
  mariadb-3:10.5.27-1.el9_5.x86_64                                              
  mariadb-backup-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-common-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-connector-c-3.2.6-1.el9_0.x86_64                                      
  mariadb-connector-c-config-3.2.6-1.el9_0.noarch                               
  mariadb-errmsg-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-gssapi-server-3:10.5.27-1.el9_5.x86_64                                
  mariadb-server-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-server-utils-3:10.5.27-1.el9_5.x86_64                                 
  mysql-selinux-1.0.13-1.el9_5.noarch                                           
・・・
Complete!
--> daf71bdc14ab
STEP 4/8: COPY  carset.cnf /etc/my.cnf.d/charset.cnf
--> a96ac4f1bfb3
STEP 5/8: RUN   systemctl enable mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
--> 50f6b0d16b83
STEP 6/8: RUN   dnf clean all;
26 files removed
--> 4aa9969087df
STEP 7/8: EXPOSE 3306
--> ac9094cd3dad
STEP 8/8: CMD [ "/sbin/init" ]
COMMIT almalinux9_mariadb
--> 7a06b67a56a2
Successfully tagged localhost/almalinux9_mariadb:latest
7a06b67a56a2ff8c30a436a53a64735ff9f04780b1c4649c06584f5d99327929
# STEP 1/8: FROM almalinux:latest
STEP 2/8: RUN   dnf -y update
AlmaLinux 9 - AppStream                         5.4 MB/s |  15 MB     00:02    
AlmaLinux 9 - BaseOS                            2.8 MB/s |  17 MB     00:06    
AlmaLinux 9 - Extras                             12 kB/s |  13 kB     00:01    
Dependencies resolved.
・・・
Upgraded:
  glibc-2.34-125.el9_5.3.alma.1.x86_64                                          
  glibc-common-2.34-125.el9_5.3.alma.1.x86_64                                   
  glibc-minimal-langpack-2.34-125.el9_5.3.alma.1.x86_64                         
  libxml2-2.9.13-6.el9_5.2.x86_64                                               
  systemd-252-46.el9_5.3.alma.1.x86_64                                          
  systemd-libs-252-46.el9_5.3.alma.1.x86_64                                     
  systemd-pam-252-46.el9_5.3.alma.1.x86_64                                      
  systemd-rpm-macros-252-46.el9_5.3.alma.1.noarch                               
  tzdata-2025b-1.el9.noarch                                                     

Complete!
--> a2b577abfca6
STEP 3/8: RUN   dnf -y install mariadb mariadb-server
Last metadata expiration check: 0:00:19 ago on Wed Apr  2 17:57:08 2025.
Dependencies resolved.
・・・
Installed:
・・・
  mariadb-3:10.5.27-1.el9_5.x86_64                                              
  mariadb-backup-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-common-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-connector-c-3.2.6-1.el9_0.x86_64                                      
  mariadb-connector-c-config-3.2.6-1.el9_0.noarch                               
  mariadb-errmsg-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-gssapi-server-3:10.5.27-1.el9_5.x86_64                                
  mariadb-server-3:10.5.27-1.el9_5.x86_64                                       
  mariadb-server-utils-3:10.5.27-1.el9_5.x86_64                                 
  mysql-selinux-1.0.13-1.el9_5.noarch                                           
・・・
Complete!
--> daf71bdc14ab
STEP 4/8: COPY  carset.cnf /etc/my.cnf.d/charset.cnf
--> a96ac4f1bfb3
STEP 5/8: RUN   systemctl enable mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
--> 50f6b0d16b83
STEP 6/8: RUN   dnf clean all;
26 files removed
--> 4aa9969087df
STEP 7/8: EXPOSE 3306
--> ac9094cd3dad
STEP 8/8: CMD [ "/sbin/init" ]
COMMIT almalinux9_mariadb
--> 7a06b67a56a2
Successfully tagged localhost/almalinux9_mariadb:latest
7a06b67a56a2ff8c30a436a53a64735ff9f04780b1c4649c06584f5d99327929

無事出来上がったのでコンテナを作って起動してみる

# podman run -d -it --name almalinux9_mariadb_contener \
 -p 3306:3306 \
 -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 \
 -v '{データベース保存ディレクトリィ※事前作成済}:/var/lib/mysql' \
 almalinux9_mariadb
900c3b58d5e7147e888f03674392df4fd6293de21d8c45a36e9ccda7c89fa50a

ログを見ると ※動作環境に依存

[FAILED] Failed to start MariaDB 10.5 database server.

See 'systemctl status mariadb.service' for details.

不穏な雰囲気が・・・

# podman exec almalinux9_mariadb_contener systemctl status mariadb.service
# mariadb.service - MariaDB 10.5 database server
     Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Wed 2025-04-02 16:46:32 UTC; 2min 7s ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
    Process: 23 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
    Process: 46 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=1/FAILURE)
        CPU: 349ms

Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[112]: chown: changing ownership of '/var/lib/mysql': Operation not permitted
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[87]: Cannot change ownership of the database directories to the 'mysql'
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[87]: user.  Check that you have the necessary permissions and try again.
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[46]: Initialization of MariaDB database failed.
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[46]: Perhaps /etc/my.cnf is misconfigured or there is some problem with permissions of /var/lib/mysql.
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[46]: Initialization of MariaDB database was not finished successfully.
Apr 02 16:46:32 90b2f5aeb4b0 mariadb-prepare-db-dir[46]: Files created so far will be removed.
Apr 02 16:46:32 90b2f5aeb4b0 systemd[1]: mariadb.service: Control process exited, code=exited, status=1/FAILURE
Apr 02 16:46:32 90b2f5aeb4b0 systemd[1]: mariadb.service: Failed with result 'exit-code'.
Apr 02 16:46:32 90b2f5aeb4b0 systemd[1]: Failed to start MariaDB 10.5 database server.

MariaDB が起動しない場合の対処方法 でググってみると、

ディレクトリィのオーナが気に入らないダケみたいなのでchown -R mysql:mysqlで丸ごと更新。

# podman exec almalinux9_mariadb_contener chown -R mysql:mysql /var/lib/mysql
# podman exec almalinux9_mariadb_contener systemctl start mariadb
# podman exec almalinux9_mariadb_contener systemctl status mariadb.service
● mariadb.service - MariaDB 10.5 database server
     Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled)
     Active: active (running) since Wed 2025-04-02 16:51:09 UTC; 18s ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
    Process: 120 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
    Process: 142 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS)
    Process: 251 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS)
   Main PID: 230 (mariadbd)
     Status: "Taking your SQL requests now..."
      Tasks: 20 (limit: 1638)
     Memory: 75.5M
        CPU: 1.081s
     CGroup: /system.slice/mariadb.service
             └─230 /usr/libexec/mariadbd --basedir=/usr

Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: The second is mysql@localhost, it has no password either, but
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: you need to be the system 'mysql' user to connect.
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: After connecting you can set the password, if you would need to be
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: able to connect as any of these users with a password and without sudo
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: See the MariaDB Knowledgebase at https://mariadb.com/kb
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: Please report any problems at https://mariadb.org/jira
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: The latest information about MariaDB is available at https://mariadb.org/.
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: Consider joining MariaDB's strong and vibrant community:
Apr 02 16:51:08 90b2f5aeb4b0 mariadb-prepare-db-dir[181]: https://mariadb.org/get-involved/
Apr 02 16:51:09 90b2f5aeb4b0 systemd[1]: Started MariaDB 10.5 database server.

無事起動できたらしい。

# ls -l mysql
total 122920
-rw-rw---- 1 100026 100026     24576 Apr  3 01:51 aria_log.00000001
-rw-rw---- 1 100026 100026        52 Apr  3 01:51 aria_log_control
-rw-rw---- 1 100026 100026       972 Apr  3 01:51 ib_buffer_pool
-rw-rw---- 1 100026 100026 100663296 Apr  3 01:51 ib_logfile0
-rw-rw---- 1 100026 100026  12582912 Apr  3 01:51 ibdata1
-rw-rw---- 1 100026 100026  12582912 Apr  3 01:51 ibtmp1
-rw-rw---- 1 100026 100026         0 Apr  3 01:51 multi-master.info
drwx------ 2 100026 100026      4096 Apr  3 01:51 mysql
srwxrwxrwx 1 100026 100026         0 Apr  3 01:51 mysql.sock
-rw-rw---- 1 100026 100026        16 Apr  3 01:51 mysql_upgrade_info
drwx------ 2 100026 100026        20 Apr  3 01:51 performance_schema

mysql.sockが0バイトなのが気になるが、mariadbコマンドが使えるかな?

# podman exec -it almalinux9_mariadb_contener mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.27-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.001 sec)

MariaDB [(none)]> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.003 sec)

MariaDB [(none)]> exit
Bye
# 

なので多分OK。

でも【停止】させた表示が少し気になるので コンテナに-it は付けない方がいいかも。

         Unmounting /etc/hostname...
         Unmounting /etc/hosts...
         Unmounting /etc/resolv.conf...
         Unmounting /run/.containerenv...
         Unmounting /run/lock...
         Unmounting /run/secrets...
         Unmounting Temporary Directory /tmp...
         Unmounting /var/lib/mysql...
         Unmounting var-log-journal.mount...
[FAILED] Failed unmounting /etc/hostname.
[FAILED] Failed unmounting /etc/hosts.
[FAILED] Failed unmounting /etc/resolv.conf.
[FAILED] Failed unmounting /run/.containerenv.
[FAILED] Failed unmounting /run/lock.
[FAILED] Failed unmounting /run/secrets.
[FAILED] Failed unmounting Temporary Directory /tmp.
[FAILED] Failed unmounting /var/lib/mysql.
[FAILED] Failed unmounting var-log-journal.mount.
[  OK  ] Stopped target Swaps.
[  OK  ] Reached target System Shutdown.
[  OK  ] Reached target Unmount All Filesystems.
[  OK  ] Reached target Late Shutdown Services.
         Starting System Halt...
Sending SIGTERM to remaining processes...
Sending SIGKILL to remaining processes...
All filesystems, swaps, loop devices, MD devices and DM devices detached.
Halting system.
Exiting container.
 disconnected 

ps.2025/4/3

mysqlユーザが作られていない場合

mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin

であれば

# adduser --uid 27 --home-dir /var/lib/mysql --comment "MySQL Server" --system --user-group --shell /sbin/nologin mysql
※uidが10000以下を指定する場合は --system が必須
※groupaddコマンドで事前にグループを作る必要があるけど --user-group で同名同IDのグループを作ってもらう方が楽

で同じ内容がpasswdにできる(ハズ

うまくできなかったらuserdel mysqlで消してコマンドを見直してやり直し。

/var/lib/mysqlディレクトリィが出来ていなかったら

多分-v xxx:/var/lib/mysqlオプションを付けたコンテナの作成時にエラると思うので

# mkdir /var/lib/mysql
# chown -R mysql:mysql /var/lib/mysql

で作りcommitでイメージを作成。

新たにコンテナを作成してうまくいったら最後に

以上の追加した処理をDockerfileに組み込んでalmalinux:latestから一発でイメージが作れる様にすると良いと思う。

# podman build -t almalinux9_mariadb .

Docerfileで

RUN podman-generate-systemd 

するといいらしいけど、今は非推奨で

RUN podman-systemd.unit – systemd units using Podman Quadlet

を使うといいらしいけどね。



[podman]AlmaLinux:lastest

1.起動しないコンテナ?

# podman search almalinux:latest
NAME                                   DESCRIPTION
docker.io/almalinux/almalinux          DEPRECATION NOTICE: This image is deprecated...
docker.io/library/almalinux            The official build of AlmaLinux OS.
docker.io/almalinux/9-base             AlmaLinux 9 Base container image
docker.io/almalinux/8-base             AlmaLinux OS 8 official base image
docker.io/almalinux/9-minimal          AlmaLinux 9 minimal container image
docker.io/almalinux/9-init             AlmaLinux 9 Init container image
docker.io/almalinux/9-micro            AlmaLinux 9 Micro container image

docker.io/library/almalinuxが良さそうな気がしたので、イメージをダウンロードして以前やった様に・・・

# podman pull docker.io/library/almalinux:latest
# podman run -d \
    --name almalinux9 \
    almalinux:latest    ※The official build of AlmaLinux OS.

とやってみると、コンテナが終了してて【起動】ボタンを押しても起動しない。

ググってみると、

# podman run -d \
    --name almalinux9 \
    -it \               ※ --interactive(-i) + --tty(-t) => -it
    almalinux:latest    ※The official build of AlmaLinux OS.

と–interactive(-i)「対話式プロセス」と–tty(-t)「疑似端末割当」のオプションを付けると起動してくれる。Debian系では無くても起動してたけどRedHat系では付けておいた方が良さそう。

2.アタッチして抜けるとコンテナが【終了】※どのコンテナでも

アタッチしてバージョンを確認してexitするとコンテナが止まってしまうので

【Ctrl】+【p】と【Ctrl】+【q】を続けて押して、そっと抜ける方がいい。

# podman attach almalinux9
# cat /etc/redhat-release 
AlmaLinux release 9.5 (Teal Serval)
※Ctrl-p & Ctrl-q で抜けるとコンテナは「実行中」のままになる

3.とりあえず中を覗きたいだけの場合

# podman run -a \
    --name almalinux9a \
    -it \
    --rm \
    docker.io/almalinux/9-minimal
✔ docker.io/library/almalinux9a:latest
Trying to pull docker.io/library/almalinux9a:latest...
Error: initializing source docker://almalinux9a:latest: reading manifest latest in docker.io/library/almalinux9a: requested access to the resource is denied

と終了後にコンテナを削除するオプションを付けるといいかもとやってみると毎回イメージをダウンロードで失敗するので、 -aは現状使えない。ググってみると-aのオプションを説明してる記事も無かった。

# podman run -d \
    --name almalinux9a \
    -it \
    --rm \
    almalinux:latest
# podman attach almalinux9a
# exit

とちょっと面倒になってる。

–rmについては1行コマンドを実行する分にはそれなりに使える

$ podman run --rm almalinux:latest ls -alF /etc
total 884
drwxr-xr-x 46 root root   4096 Mar  7 07:53 ./
dr-xr-xr-x  1 root root     17 Apr  1 23:00 ../
-rw-------  1 root root      0 Mar  7 07:53 .pwd.lock
-rw-r--r--  1 root root     14 Mar  7 07:53 BUILDTIME
-rw-r--r--  1 root root     94 Jan 31  2022 GREP_COLORS
drwxr-xr-x  5 root root     51 Mar  7 07:52 X11/
・・・

でも非同期でコマンドを実行してるらしく、シェルは期待したようには動かない。

# podman run --rm almalinux:latest /bin/bash
# ※即終了&コンテナ削除

ps.2025/4/5

cockpit-podmanの画面で次第にディスクの使用量が増えていくけど、見えない何かが増えている?

# podman images ※で状況を見る
・・・(tag無しがいっぱい)・・・
# docker image prune


[WordPress]podmanでサイトを作る

cockpitのpodmanアプリケーションを使うと毎回画面でチョコマカと手入力が必要なので今回はpodmanをコマンドラインから使ってサイトを作ってみる。

1.podの作成

podを作る際に、ホストのポートからコンテナのポートへの転送も指定する。

ついでに外部へのポート開放もする。

# podman pod create -p 20080:80 -p 20443:443 -p 20090:8090 --name wordpress_pod
cee956541b051b84e15e7ac5e347a6aeb572b0aef16084954818e725f038cb1b

# firewall-cmd --add-port=20080/tcp --permanent ※永続的解放
# firewall-cmd --add-port=20443/tcp --permanent ※永続的解放
# firewall-cmd --add-port=20090/tcp --permanent ※永続的解放 phpMyAdmin用
# firewall-cmd --reload
# firewall-cmd --list-all ※設定を確認

※2025/4/1 phpMyAdminの設定を追記

2.イメージのダウンロード

mariaDBとwordpressのイメージをダウンロードする

# podman pull docker.io/mariadb:latest
Trying to pull docker.io/library/mariadb:latest...
Getting image source signatures
Copying blob 597f7afe50fe done   | 
Copying blob 5a7813e071bf done   | 
Copying blob 5db80086e4da done   | 
Copying blob bdecd990c29c done   | 
Copying blob 901fe9394c00 done   | 
Copying blob 43eb19e1b102 done   | 
Copying blob e1dede558384 done   | 
Copying blob 5c3a22df929b done   | 
Copying config a914eff5d2 done   | 
Writing manifest to image destination
a914eff5d2eb4c650a4e787e453d52a4ffba977632bd624cc6e63d0c9c4c2d65

# podman pull docker.io/wordpress:latest
Trying to pull docker.io/library/wordpress:latest...
Getting image source signatures
Copying blob e4ca7ebe0914 done   | 
Copying blob 6e909acdb790 done   | 
Copying blob dacb60b59038 done   | 
Copying blob 5db2c4b6137b done   | 
Copying blob 64450047668b done   | 
Copying blob 4d6386e035f7 done   | 
Copying blob 3dc5d9089396 done   | 
Copying blob 1778f52baa09 done   | 
Copying blob a5d9cb1c80ec done   | 
Copying blob b116c8459f57 done   | 
Copying blob 8f8ddda3587a done   | 
Copying blob f432ea27fc70 done   | 
Copying blob 6a5a37a900f3 done   | 
Copying blob 4f4fb700ef54 done   | 
Copying blob 57c6ea19af98 done   | 
Copying blob ae777a0ca433 done   | 
Copying blob 5f19650adea9 done   | 
Copying blob 177323f85a94 done   | 
Copying blob fe638a1d1db7 done   | 
Copying blob f4abcace8187 done   | 
Copying blob 729bf49a9314 done   | 
Copying blob cac8b814902b done   | 
Copying config 52bb3e7315 done   | 
Writing manifest to image destination
52bb3e73152ae8a92ef5a7d0589d923aa3c46538c8494b644b8cf2f5ceba2d37

# podman pull docker.io/phpmyadmin:latest
Trying to pull docker.io/library/phpmyadmin:latest...
Getting image source signatures
Copying blob 6e909acdb790 skipped: already exists  
Copying blob 64450047668b skipped: already exists  
Copying blob 4d6386e035f7 skipped: already exists  
Copying blob e4ca7ebe0914 skipped: already exists  
Copying blob dacb60b59038 skipped: already exists  
Copying blob a5d9cb1c80ec skipped: already exists  
Copying blob 1778f52baa09 skipped: already exists  
Copying blob 3dc5d9089396 skipped: already exists  
Copying blob b116c8459f57 skipped: already exists  
Copying blob 8f8ddda3587a skipped: already exists  
Copying blob 6a5a37a900f3 skipped: already exists  
Copying blob 4f4fb700ef54 skipped: already exists  
Copying blob f432ea27fc70 skipped: already exists  
Copying blob 2356864ac4b9 done   | 
Copying blob 28fa232eddfc done   | 
Copying blob a084403b2fe2 done   | 
Copying blob 69286ddc9ea5 done   | 
Copying blob 21d6bc6af9fd done   | 
Copying blob 5db2c4b6137b skipped: already exists  
Copying blob 5fb8db322bbb done   | 
Copying config 052506f2de done   | 
Writing manifest to image destination
052506f2de4d5532efb7c1b24b9a4311d6b5ccef006e344449f8fe633d3bbacc

※2025/4/1 phpMyAdminの設定を追記

podman diff イメージ名 で1つ1つファイル構成を見るものいいけど、

podman inspect イメージ名 の方が楽な気がする。

# podman inspect mariadb:latest
# podman inspect wordpress:latest 
# podman inspect phpmyadmin:latest

※2025/4/1 phpMyAdminの設定を追記

3.コンテナの設定

https://hub.docker.com/_/mariadb でmariadbコンテナで設定する環境変数等を調べ、コンテナを作成し実行する。

"Volumes": {
    "/var/lib/mysql": {}
},
# podman run -d \
    --pod wordpress_pod \
    --name mariadb \
    --restart=unless-stopped \
    -e MARIADB_RANDOM_ROOT_PASSWORD=1 \
    -e MARIADB_USER={WordPressで使うユーザ名} \
    -e MARIADB_PASSWORD={WordPressで使うユーザのパスワード} \
    -e MARIADB_DATABASE={WordPressで使うデータベース名} \
    -e TZ=Asia/Tokyo \
    -v {データベースを保存する作成済みの空ディレクトリィ}:/var/lib/mysql \
    wordpress:latest

とりあえずwordpressイメージにcerbotをインストしたイメージを作成 ※追記 2025/4/1

FROM wordpress:latest
RUN apt update -y
RUN apt install -y certbot python3-certbot-apache
RUN apt clean                     ※キャッシュ消去
RUN rm -rf /var/lib/apt/lists/*   ※ログ消去
podman build -t wordpress_certbot .

https://hub.docker.com/_/wordpress でwordpressコンテナで設定する環境変数等を調べ、コンテナを作成し実行する

"WorkingDir": "/var/www/html",
# podman run -d \
    --pod wordpress_pod \
    --name wordpress \
    --restart=unless-stopped \
    -e WORDPRESS_DB_NAME={WordPressで使うデータベース名} \
    -e WORDPRESS_DB_USER={WordPressで使うユーザ名} \
    -e WORDPRESS_DB_PASSWORD={WordPressで使うユーザのパスワード} \
    -e WORDPRESS_DB_HOST={mariaDBのコンテナ名} \
    -v {wordpressのhtmlを保存する作成済みの空ディレクトリィ}:/var/www/html  \
    wordpress_certbot 

ブラウザで、http://{podmanをインストしたホストのIPアドレス}:20080 を開くと

が見れる(ハズ。

さらに必須情報を行い、

【WordPressをインストール】ボタンを押し

となれば、後はログインでジャンプして

先のユーザ名とパスワードを入力して【ログイン】ボタンを押すと

が見れる(ハズ

cockpit-podmanで出来上がりを見ると

※既にpod終了済

ここでworspress_podの右端の縦点なメニューで起動とか終了で簡単に運用。

バックアップするディレクトリィは、上の -v オプションで指定したディレクトリィの2つ。

-v {データベースを保存する作成済みの空ディレクトリィ}:   ※コンテナ上のパスは/var/lib/mysql
-v {wordpressのhtmlを保存する作成済みの空ディレクトリィ}: ※コンテナ上のパスは/var/www/html

ps.2025/3/31

SSLについて

コンテナのOSを調べたら

# podman exec -ti wordpress /bin/bash
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"

Debian 12らしい、ググってみると

# apt install -y certbot python3-certbot-apache

でうまくいくらしいのでwordpress_cerbotイメージを作った。

コンテナを作る度にcerbotのインストを繰り返さずに済むらしい。

この時点ではまだcerbotの初期設定は行っていないので、WANから接続できる状況にした上で初期設定を行い、

# podman exec -ti wordpress /bin/bash
# certbot run

成功したら、いつもの様にコンテナを再起動して本当に大丈夫なのか?(要確認

ps.2025/4/1

phpMyAdminを忘れていた。残念だが、wordpressのaptリポジトリィを調べてみると

  • cat /etc/apt/sources.list.d/debian.sources
    • http://snapshot.debian.org/archive/debian/
    • http://snapshot.debian.org/archive/debian-security/

しかないので、wordpressイメージにphpMyAdmin付きのDockerfileでbuildしてもエラってしまうので

# podman pull docker.io/phpmyadmin:latest
Trying to pull docker.io/library/phpmyadmin:latest...
Getting image source signatures
Copying blob 6e909acdb790 skipped: already exists  
Copying blob 64450047668b skipped: already exists  
Copying blob 4d6386e035f7 skipped: already exists  
Copying blob e4ca7ebe0914 skipped: already exists  
Copying blob dacb60b59038 skipped: already exists  
Copying blob a5d9cb1c80ec skipped: already exists  
Copying blob 1778f52baa09 skipped: already exists  
Copying blob 3dc5d9089396 skipped: already exists  
Copying blob b116c8459f57 skipped: already exists  
Copying blob 8f8ddda3587a skipped: already exists  
Copying blob 6a5a37a900f3 skipped: already exists  
Copying blob 4f4fb700ef54 skipped: already exists  
Copying blob f432ea27fc70 skipped: already exists  
Copying blob 2356864ac4b9 done   | 
Copying blob 28fa232eddfc done   | 
Copying blob a084403b2fe2 done   | 
Copying blob 69286ddc9ea5 done   | 
Copying blob 21d6bc6af9fd done   | 
Copying blob 5db2c4b6137b skipped: already exists  
Copying blob 5fb8db322bbb done   | 
Copying config 052506f2de done   | 
Writing manifest to image destination
052506f2de4d5532efb7c1b24b9a4311d6b5ccef006e344449f8fe633d3bbacc
# podman run -d \
    --pod ssiscirine_pod \
    --name phpmyadmin \
    --restart=unless-stopped \
    -e PMA_ARBITRARY=1 \
    -e PMA_HOSTS={mariadbコンテナ名} \
    -e PMA_USER={root} \
    -e PMA_PASSWORD={rootのパスワード} \ ※mariadbでrootパスワードをランダム生成した場合は毎回ログからコピペになる。
    -e APACHE_PORT=8090 \
    -v {phpMyAdminのsessionsを保存する作成済みの空ディレクトリィ}:/sessions:rw \
    phpmyadmin:latest
3dbb9be21d3b146a2430079b3e2158c5b267a751062198d400dc6594cb3dd128

※他のボリュームオプションに指定したディレクトリィはオーナが書き換わるが、このsessionsのボリュームオプションを指定した場合のディレクトリのオーナが書き換わらないので最初は888にしないとエラる。セッションファイルが作られた後は755に戻しても大丈夫っぽい。

※APACHE_PORTを付け忘れるとコンテナ同士で80ポートがコンフリクトしてしまう。

厄介なのがpodのポート変換を後付けする方法が見つからなかったので全部再生成しないといけない。

# {podの作成}
# {ポート開放}
# {mariadbコンテナの作成}     ※ログにrootのパスワード生成が載ってるか要チェック
# {wordpressコンテナの作成}
# {phpmyadminコンテナの作成} ※rootのパスワードを修正が必要な場合もある

それは嫌な場合は、wordpressコンテナからphpmyadminコンテナに転送するといいかもしれない。

# a2enmod proxy
# a2enmod proxy_http
# service apache2 restart
ProxyRequests Off
ProxyPass /phpMyAdmin/ http://phpMyAdmin:8090
ProxyPassReverse /phpMyAdmin/ http://phpMyAdmin:8090

でもLAN内でしか使わないからpodから作りなおすけどね。(笑

となると

残念ながらイメージが2.43GBに増えコンテナも315MBに増えた。



[WordPress]cockpit-podmanでサイトを作る

まず、色々ぐぐってみると

podmanのCLIで組んでる方が多く、

cockpit-podmanアプリでwordpressサーバを作ってるとこは少なかった。

しかもコンテナのイメージのバージョンの差異のせいか?

環境変数の設定が微妙にうまくいかなかったりするので、

ココの記事の内容も当てにできないと思います。

地道にDockerの各コンテナイメージの説明をよく読んだ方が良さそうです。

そんな訳で・・・

  • データベースはMariaDBが良いかな
  • WordPress自体がPHPで出来ている

ということで2つのイメージで組み立てることにする。

  1. Podを作る
    • コンテナ同士の通信をしやすくする為
      • IPアドレスを共有するのでコンテナ毎にポート開放する手間が不要
      • Pod内のコンテナ同士の識別はIPアドレスではなくコンテナ名を使用
      • pod起動終了で中のコンテナが一斉に起動終了するのは便利
      • 最重要:pod作成時に必要なポート開放をする必要がある
        • 最初はpod無しで試した方が絶対安全(だと思う
          • ポート開放等の設定ミスや漏れがあれば全部やり直し
            • Configureファイルを作り
              • podmamのコマンドでエラー&リトライが近道
  2. MariaDBのコンテナを作る
    • 他のDBでもいいけどAlmaLinuxにリポジトリィにある
    • 初期設定は環境変数設定のみ
      • コンテナのコンソールでシェルが動いてない
        • podman exec mysql で設定不可
  3. WordPressのコンテナを作る
    • 初期設定は環境変数設定のみ
      • コンテナのコンソールでシェルが動いてない
        • WordPressの展開も困難
        • PHPインストとini調整
        • Apache設定不可

の手順で作成する。

1.Podを作る

cockpitのPodmanアプリのコンテナーの右端の【Podの作成】ボタンからこんな風に作る。

とりあえずホスト側でポートマッピングしたホストポートを解放。

# firewall-cmd --add-port=20080/tcp --permanent
# firewall-cmd --add-port=20443/tcp --permanent
# firewall-cmd --reload

2.MariaDBのコンテナを作る

イメージのとこの【新規イメージのダウンロード】ボタンでイメージをダウンロードしておく。

podのとこの【podでのコンテナーの作成】ボタンで・・・

wordpressコンテナからmariadbコンテナ名で接続先を指定するので、コンテナ名は「mariadb」とか判りやすいものにしておく。

DockerのMariaDBのページに環境変数の設定がある。

ここで

  1. MARIADB_ROOT_PASSWORD={ルートのパスワード}
  2. MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1
  3. MARIADB_RANDOM_ROOT_PASSWORD=1

のいづれかが必要と書いてあるけど、試した感じでは1.のrootパスワード指定ではWordPressからデータベースにアクセスできなかった。

とりあえず、環境変数で初期設定

MARIADB_RANDOM_ROOT_PASSWORD=1
MARIADB_USER={WordPressで使うユーザ名}
MARIADB_PASSWORD={WordPressで使うユーザのパスワード}
MARIADB_DATABASE={WordPressで使うデータベース名}
TZ=Asia/Tokyo ※日本の場合

コンテナの画面では「変数の追加」ボタンを押すと「一括インポート・・・」の説明が出るので、上の環境変数設定を丸ごとペーストすると楽。

コンテナを作り直す度にデータベースが空になると面倒なので、ボリュームを指定してホストに残るようにする。

ホストパス             コンテナーパス 
{ホスト側のディレクトリィ}  /var/lib/mysql

改めてmariadbコンテナを作る時は初期設定済みなのでボリュームだけ指定すればいい。(ハズ

3.WordPressのコンテナを作る

イメージのとこの【新規イメージのダウンロード】ボタンでイメージをダウンロードしておく。

podのとこの【podでのコンテナーの作成】ボタンで・・・

wordpressもdockerのページを見ると

環境変数がいっぱい必要らしい

WORDPRESS_DB_NAME={WordPressで使うデータベース名}
WORDPRESS_DB_USER={WordPressで使うユーザ名}
WORDPRESS_DB_PASSWORD={WordPressで使うユーザのパスワード}
WORDPRESS_DB_HOST={mariaDBのコンテナ名}

毎回htmlも空になると面倒なので、ボリュームを指定しホストに残す。

ホストパス               コンテナーパス 
{ホスト側のディレクトリィ}  /var/www/html 

改めてwordpressコンテナを作る時は初期設定済みなのでボリュームだけ指定すればいい。(ハズ

注意点としては・・・

/var/www/htmlの下にwp-config.phpが作成されるまで待つこと。

さっさとコンテナを止めたり削除すると作成されないので、環境変数の設定が必要になる。

とりあえず、ここまで無事2個のコンテナが起動できていれば

さーて、ここまでは無事成功したけど・・・

ボリューム指定でホストからwp-config.phpが見れるので再設定できるかな?と思いきや

暗号化されているので再設定するよりコンテナを作り直した方が安心できそう。

ブログの移行をするつもりなら

移行プラグインを使うしかない。

ここまでやってやっと気が付く。

podmanのCLIでpodやコンテナを作って

cockpit-podmanでやることはpodの起動と終了だけにした方が

絶対楽だ(合掌

イメージだけで1Gバイトあるけど

CPUの使用率やメモリ消費量は低いのは

助かる。

ブラウザで記事をちょっと書いた感じでは異様に遅いとかないので、

podmanにブログを移行するのも悪くないかもしれない。




top