🐳 RockyLinux 9.xのDockerコンテナでsystemdを使う方法
🚀 はじめに
Dockerを利用して開発やテストを行う方の中には、「本番環境に近い構成でコンテナを構築したい」と考える方も多いでしょう。
本記事では、RockyLinux 9.xベースのDockerコンテナで systemd を有効にし、以下のような環境を実現する手順を紹介します。
- ホストからのSSH接続が可能
- 正確な時刻同期(Chronyによる)
👤 想定読者
- Dockerの基礎知識がある方
- RockyLinux 9系で本番に近い動作検証環境を構築したい方
⚙️ 前提条件
| 項目 | 内容 |
|---|---|
| ホストOS | WSL上のUbuntu |
| ゲストOS | RockyLinux 9.x |
| Dockerバージョン | 24.0.2 |
| イメージタグ | qiita:20250806 |
| コンテナ名 | qiita-20250806 |
| SSH接続ユーザー |
k-hata-tb(rootログイン不可) |
| SSH認証方式 | 鍵認証のみ |
SSHの認証で必要になる鍵ファイルは事前作業として、以下のコマンドで作成しました。
🔑 鍵ファイルの作成(ホストOS)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
ssh-keygen -C "" -N "" -t ed25519 -f docker.key
では、実際にsystemdがちゃんと動き、SSH接続が出来るまでを順を追って説明します。
まずは コンテナ作成(その1) を実践します。
🧪 コンテナ作成(その1)
📌 考慮すべきポイント
- SSHや時刻同期のため
initシステムが必要 -
/usr/sbin/initを CMD で指定し、--privilegedで実行する - 公開鍵の配置とユーザー作成が必要
📄 初回Dockerfile
FROM rockylinux/rockylinux:9
COPY .ssh/docker.key.pub /tmp
RUN useradd k-hata-tb && \
mkdir /home/k-hata-tb/.ssh && \
chmod 700 /home/k-hata-tb/.ssh && \
mv /tmp/docker.key.pub /home/k-hata-tb/.ssh/authorized_keys && \
chmod 600 /home/k-hata-tb/.ssh/authorized_keys && \
chown -R k-hata-tb:k-hata-tb /home/k-hata-tb/.ssh
EXPOSE 22
CMD ["/usr/sbin/init"]
🛠️ ビルドと起動
docker build --rm -t qiita:20250806 .
docker run -itd --privileged --name qiita-20250806 qiita:20250806
ビルドは成功、起動させると、、、 エラーが発生 、コンテナは起動しませんでした。
❗ エラーメッセージ
docker: Error response from daemon: ...
exec: "/usr/sbin/init": stat /usr/sbin/init: no such file or directory: unknown.
🔍 原因と対処
- 原因 → デフォルトで用意されているRockyLinux 9.xのイメージには、
systemdが含まれていない - 対処 → コンテナのビルド時に明示的に
systemdのインストールが必要
コンテナ作成(その1) でのエラーを回避するための原因と対処に従って
コンテナ作成(その2) を実施します。
✅ コンテナ作成(その2)
📌 追加の考慮点
-
systemd,openssh-server,chronyをインストール -
systemdが参照するunitファイルから、Dockerコンテナで不要になるファイルを削除
📝 改良Dockerfile
FROM rockylinux/rockylinux:9
RUN dnf install -y systemd && \
rm -f /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service && \
rm -f /lib/systemd/system/multi-user.target.wants/* && \
rm -f /etc/systemd/system/*.wants/* && \
rm -f /lib/systemd/system/local-fs.target.wants/* && \
rm -f /lib/systemd/system/sockets.target.wants/*udev* && \
rm -f /lib/systemd/system/sockets.target.wants/*initctl* && \
rm -f /lib/systemd/system/basic.target.wants/* && \
rm -f /lib/systemd/system/anaconda.target.wants/* && \
dnf install -y chrony openssh-server && \
systemctl enable chronyd && \
systemctl enable sshd
COPY .ssh/docker.key.pub /tmp
RUN useradd k-hata-tb && \
mkdir /home/k-hata-tb/.ssh && \
chmod 700 /home/k-hata-tb/.ssh && \
mv /tmp/docker.key.pub /home/k-hata-tb/.ssh/authorized_keys && \
chmod 600 /home/k-hata-tb/.ssh/authorized_keys && \
chown -R k-hata-tb:k-hata-tb /home/k-hata-tb/.ssh
EXPOSE 22
CMD ["/usr/sbin/init"]
🛠️ ビルドと起動
docker build --rm -t qiita:20250806 .
docker run -itd --privileged --name qiita-20250806 qiita:20250806
今回はエラーメッセージも出力されずに起動完了。
ちゃんと起動されているかを確認します。
✅ 起動確認
docker ps
期待される出力(例):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
495058f06e62 qiita:20250806 "/usr/sbin/init" 25 seconds ago Up 16 seconds 22/tcp qiita-20250806
コンテナの起動が確認できたので、ホストからのSSH接続を試みます。
起動したコンテナには動的にIPアドレスが割り当てられるので、以下の手順になります。
- コンテナのIPアドレスの確認
-
sshコマンドでコンテナに接続
🔐 SSH接続確認
docker exec -it qiita-20250806 /usr/bin/hostname -i # IP確認
ssh -i .ssh/docker.key k-hata-tb@172.17.0.4
sshコマンドを実行すると、以下のようにコンテナに接続できたことが確認できました!
The authenticity of host '172.17.0.4 (172.17.0.4)' can't be established.
ED25519 key fingerprint is SHA256:VjiLa1/uCe8B****************OaiAbyWpMk6qnJA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.17.0.4' (ED25519) to the list of known hosts.
[k-hata-tb@495****06e62 ~]$
📝 補足
- Docker ×
systemdに関する多くのドキュメントではコンテナの起動コマンドにて/sys/fs/cgroupのボリュームマウントを推奨していますが、今回の環境では不要でした。 - 理由:
- Docker 20.10以降を使用
- RockyLinux 9.x の cgroup が v2
🚨 コンテナが起動しない場合
dockerやコンテナで使用するRockyLinuxのバージョンによっては、コンテナ作成(その2) の手順でもコンテナが起動しない場合もあるかと思います。
コンテナが起動しない場合は、以下の起動コマンドを試しては如何でしょうか?
docker run \
-itd \
--privileged \
--name qiita-20250806 \
--tmpfs /tmp \
--tmpfs /run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
qiita:20250806
-vオプションでホストの/sys/fs/cgroupを読み取り専用でボリュームマウントしてます。
この起動コマンドでもコンテナが起動しない場合は起動失敗時のログを確認して対処方法を検討してください。
起動失敗時のログ確認:
docker logs qiita-20250806
🧩 まとめ
RockyLinux 9.x コンテナで systemd を有効にし、SSH接続や時刻同期を可能にする方法を紹介しました。特に次の点が重要でした:
- コンテナで
systemdを動かすには、必要なパッケージのインストールと不要なunitファイルの削除が必須 -
/usr/sbin/initをCMDに指定し、--privilegedオプションで起動する - 公開鍵認証でSSH接続できるユーザーを作成する
- Dockerのバージョンやcgroupの違いにより、起動方法が変わる可能性がある
本記事の手順をベースにすることで、より実用的な検証環境をDockerで構築する足がかりになるはずです。
この環境をさらに実用的にするためには、
-
sudo権限の追加 - 固定IP化や名前解決の導入
- TimeZoneの設定やサービス追加
なども検討していく必要があります。これらについては別記事で解説予定です。
👉 読んでいただきありがとうございました!
この記事がどなたかの参考になれば幸いです 🙌