プロジェクト

全般

プロフィール

20260714 podmanとRootless実行 » 履歴 » バージョン 2

sylow castle, 2026/07/14 08:49

1 1 sylow castle
# 20270714 podmanとRootless実行
2
3
一週間ぐらい時間がたち忘れそうなので吐き出しておく
4
5
## podmanのRootless実行
6
7
### systemd周りの話
8
9
podmanはdockerと違いデーモンがいないらしい。おかげでルート権限なしで実行できるがデーモンがいないからリスタートとかしてくれない。
10
代わりにSystemdで管理させるのが主流だとか。やったことをメモしておく
11
12
```
13
cd /etc/redmine
14
podman generate systemd --name redmine --files
15
```
16
17
これでpodmanがsystemd用のserviceユニットファイルを出力してくれる。出力するファイル名は「container-redmine.service」
18
試してないけど --newオプションをつけるとコンテナの生成から消滅まで面倒見てくれるようになるらしい。
19
20
systemd管理じゃルートユーザーじゃん?ってことでSystemdは一般ユーザーでも使えるので登録していく。
21
systemdは/home/username/.config/systemdの下にあるserviceファイルも見てくれる。
22
動かすのはredmineユーザーなのでredmineユーザーの配下に作る
23
24
```
25
#redmineユーザーはpasswd上ログインシェルが/sbin/nologinなのでログインシェルを指定(-sオプション)してsuしている
26
sudo su - redmine -s /bin/bash
27
cd /home/redmine/.config/systemd/
28
ln -s /etc/redmine/containe-redmine.service redmine.service
29
systemctl --user daemon-reload
30
systemctl --user enable --now container-my-container.service
31
```
32
33
とここでsystemctlコマンドを実行するところでsystemctlがDBus云々というエラーを出す。ようは「環境変数足りないから実行できない」とごねている。以下のような環境変数の設定が必要らしい
34
```
35
export XDG_RUNTIME_DIR=/run/user/$(id -u)
36
```
37
38
何やっているかというとsystemdがアプリケーション内での通信に使うDBusという仕組みを使えるように環境変数に指定が必要とのこと。
39
40
```
41
vim /home/redmine/.bashrc
42
#以下を末尾に追記
43
if [ -z "$XDG_RUNTIME_DIR" ]; then
44
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
45
fi
46
```
47
して追記して永続化。
48
49
### オマケ:
50
以下のようにユーザーを切り替えればsystemcttlが使えるらしい。知らんかったよ。罠か。
51
52
```
53
sudo machinectl shell redmine@
54
```
55
56
### OS起動時の自動起動用設定
57
58
このままだとOS起動時じゃなくてSSHなどのログイン時じゃないと起動してくれないらしい(Gemini談)のでOS起動時にsystemdが起動するように設定を仕込む。
59
大したことじゃなくOSのユーザーに設定をちょっと入れるだけ。具体的には以下
60
61
```
62
sudo loginctl enable-linger redmine
63
```
64
--------------
65
66
## Gemini曰く:
67
68
まさにおっしゃる通りです!そこに気づかれるのは素晴らしいセンスだと思います。
69
70
サーバーを構築・管理する側(IaC:AnsibleやTerraformなど)の視点から見ると、一般ユーザーごとに `loginctl enable-linger` を叩いたり、それぞれの `~/.bashrc` や `~/.config/systemd/user/` にファイルを配って回るのは、管理の手間(運用コスト)が肥大化して完全に「重い」仕様です。
71
72
そのため、実務や本番環境では、ご想像の通り「コンテナ実行専用のユーザーを1人だけ作って、そこで集中管理する」という設計(コンテナ専用ユーザーパターン)がよく使われます。
73
74
---
75
76
## 「コンテナ専用ユーザー」による集中管理のイメージ
77
78
例えば、ホスト側に `container-runner` という一般ユーザーを**1人だけ**作ります。
79
80
* **Redmine、Nginx、DBなど、すべてのシステム(コンテナ)をこの `container-runner` ユーザーの持ち物として動かします。**
81
* IaC(Ansibleなど)で設定を自動化する対象も、このユーザー1人分だけで済みます。
82
83
### ディレクトリ構成のイメージ(集中管理)
84
85
コンテナ専用ユーザーのホームディレクトリの中で、プロジェクトごとにディレクトリを分けて管理します。
86
87
```text
88
/home/container-runner/
89
├── .config/systemd/user/        <-- systemdのユニットファイルはここに集約
90
│   ├── container-redmine.service
91
│   ├── container-db.service
92
│   └── container-nginx.service
93
94
└── app-projects/                <-- docker-composeファイルをプロジェクトごとに配置
95
    ├── redmine/
96
    │   └── docker-compose.yml
97
    ├── wordpress/
98
    │   └── docker-compose.yml
99
    └── wiki/
100
        └── docker-compose.yml
101
102
```
103
104
---
105
106
## これによるIaC(自動化)のメリット
107
108
この構成にすると、OS(ホスト)側のセットアップ(IaC)が劇的にシンプルになります。自動化すべきタスクは以下の3つだけで固定されます。
109
110
1. **共通ユーザーの作成とLingerの有効化(OS側で1回だけ)**
111
```bash
112
useradd -m container-runner
113
loginctl enable-linger container-runner
114
115
```
116
117
118
2. **`.bashrc` への罠回避コードの埋め込み(1回だけ)**
119
```bash
120
echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> /home/container-runner/.bashrc
121
122
```
123
124
125
3. **あとは、このユーザーの配下に `docker-compose.yml` と `.service` ファイルを流し込むだけ。**
126
127
新しいアプリ(コンテナ)を追加したくなっても、新しいLinuxユーザーを作る必要はありません。`container-runner` の中に新しいディレクトリを作って compose ファイルを置き、systemdファイルを1枚追加するだけで完結します。
128
129
---
130 2 sylow castle
131
132
### 2. systemdユニットファイル
133
134
systemdにも、実は「システム全体で共有するけれど、実行は一般ユーザーに任せる」ためのグローバルなユーザー用ディレクトリが用意されています。個人のホームディレクトリに置く必要はありません。
135
配置先: /etc/systemd/user/
136
137
例: /etc/systemd/user/container-redmine.service
138
139
ここに置かれたユニットファイルは、redmine ユーザーが systemctl --user を実行したときにも自動的に読み込まれます(ホームディレクトリを汚しません)。