0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker×RockyLinux 9でsystemdがちゃんと動く環境を構築する方法(失敗例つき)

Last updated at Posted at 2025-08-06

🐳 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アドレスが割り当てられるので、以下の手順になります。

  1. コンテナのIPアドレスの確認
  2. 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の設定やサービス追加

なども検討していく必要があります。これらについては別記事で解説予定です。

👉 読んでいただきありがとうございました!
この記事がどなたかの参考になれば幸いです 🙌

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?