🐳 RockyLinux 9.x のDockerコンテナを開発・検証で使えるように構築する(初心者向け解説入り)
📖 はじめに
前回は systemdが有効になっているRockyLinux 9.xのDockerコンテナ の構築方法をご紹介しましたが、あれはあくまで「最低限の構成」でした。
弊社のSaaS「XD.GWORTH」では、個人用の開発・検証環境としてDockerコンテナも利用しています。
今回は、Dockerコンテナを初めて自分で作る方でも分かるように、開発・検証環境としてより実用的なコンテナを構築するための設定ポイントを、理由や背景も含めて丁寧に解説します。
⚙️ 前提条件
項目 | 内容 |
---|---|
ホストOS | WSL上のUbuntu |
コンテナOS | RockyLinux 9.x |
Dockerバージョン | 24.0.2 |
イメージタグ | qiita:20250820 |
コンテナ名 | qiita-20250820 |
SSH接続ユーザー | k-hata-tb(rootログイン不可) |
SSH認証方式 | 鍵認証のみ |
- イメージタグ・コンテナ名以外は前回と同じです。
- SSH鍵ファイルは前回作成したものを流用します。
🔑 実用的なコンテナ構築のポイント
1. SSH接続ユーザーにsudo権限を付与
多くの管理作業やサービスの再起動にはroot
権限が必要です。しかし、直接root
でSSH接続するのは安全面で推奨されません。
そこで、一般ユーザーに管理者権限(sudo)を付与します。
手順は以下の通りです:
-
sudoのインストール
RockyLinuxの最小構成イメージにはsudo
が入っていません。dnf install -y sudo
-
ユーザーをwheelグループに追加
wheel
グループに所属するユーザーはsudo権限を持てます。usermod -aG wheel k-hata-tb
-
パスワードなしでsudoを使えるよう設定
設定ファイル/etc/sudoers
に以下を追加します。echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Dockerfileにまとめて書くとこうなります:
RUN dnf install -y sudo && \
usermod -aG wheel k-hata-tb && \
echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
⚠️ セキュリティ注意
実本番環境では NOPASSWD:ALL
の設定は避け、必要最小限の権限のみ付与することを推奨します。
2. タイムゾーンをAsia/Tokyoに設定
初期状態のRockyLinuxはUTC(協定世界時)になっています。
日本時間で動かしたい場合は、タイムゾーンをAsia/Tokyo
に変更します。
確認方法:
date
# 出力例
Tue Aug 12 10:27:13 UTC 2025
/etc/localtime
はタイムゾーン情報ファイルへのシンボリックリンクです。
これをAsia/Tokyo
用に差し替えます:
sudo ln -sfn /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
再確認:
date
# 出力例
Tue Aug 12 19:51:59 JST 2025
コンテナ再起動後も反映させるため、Dockerfileにも追加:
RUN ln -sfn /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
💡 補足
コンテナ起動時に-e TZ=Asia/Tokyo
を指定する方法もありますが、この方法はディストリビューションによって挙動が異なる場合があります。
3. 最低限必要なパッケージを事前インストール
開発・検証で必要になるツールをあらかじめ入れておくと効率的です。
まず、必要なリポジトリを有効化:
dnf config-manager --set-enabled crb
dnf install -y epel-release
最低限入れておくと便利なパッケージ例:
分類 | パッケージ名 | 説明 |
---|---|---|
ビルドツール | gcc, gcc-c++, make, autoconf, flex, bison, readline, readline-devel | C/C++開発環境 |
圧縮ツール | gzip, bzip2, zip, unzip | ファイル圧縮/解凍 |
ネットワーク | curl, wget, net-tools, iproute, rsync, procps | ネットワーク・プロセス管理 |
ユーティリティ | diffutils, sudo, expect, which, git, vim | 作業効率化ツール |
セキュリティ | openssl | 暗号化・証明書管理 |
システム | systemd, chrony, openssh-server | サービス管理・時刻同期・SSH |
🛠 コンテナのビルド手順
実用的なコンテナ構築のポイント を踏まえて以下のようにしてコンテナのビルド手順を説明します。
setup.sh(構築用スクリプト)
このスクリプトはコンテナのビルド時に実行し、必要な設定を自動で行います。
#!/bin/sh
# 実行コマンドでエラーが発生したら、その時点で停止します
set -e
LANG=C
export LANG
# リポジトリ有効化とパッケージインストール
dnf config-manager --set-enabled crb
dnf install -y epel-release
dnf update -y
dnf install -y \
gcc gcc-c++ flex bison autoconf make \
gzip bzip2 zip unzip \
curl-minimal wget net-tools iproute procps rsync \
diffutils sudo which expect git \
vim readline readline-devel \
openssl \
systemd
# 不要なsystemdユニット削除(コンテナでは不要なため)
rm -f /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service
rm -f /lib/systemd/system/multi-user.target.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
# ユーザー作成とSSH鍵設定
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
usermod -aG wheel k-hata-tb
echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# TimeZone設定
ln -sfn /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# キャッシュクリア
dnf clean all
※他に必要なパッケージや設定が事前に分かっているのであれば、setup.sh
に追記してください。
Dockerfile
setup.sh
をコンテナのビルド時に実行させる設定を追加しています。
また、今回は作成したコンテナ上でWebサーバーも稼働することを想定してアクセス可能なポートに80
と443
を追加してあります。
FROM rockylinux/rockylinux:9
COPY setup.sh /usr/local/src/
COPY .ssh/docker.key.pub /tmp/
RUN /usr/local/src/setup.sh
EXPOSE 22
EXPOSE 80
EXPOSE 443
CMD ["/usr/sbin/init"]
コンテナのビルドコマンドはイメージ名が違うだけで前回と同じです
docker build --rm -t qiita:20250820 .
# ビルドオプション
# --rm: ビルド中の中間コンテナを自動削除
# -t: イメージにタグを指定
これで、より実用的なDockerコンテナがビルドできました。
コンテナの起動とオプション
このコンテナの構成では、ポートが外部に公開されていないために、dockerを動かしているWSL上のUbuntuからしかSSH接続やHTTPアクセスができません。同じWindows上から使い慣れたターミナルソフトやブラウザーからアクセスできるようにすると、より使いやすくなります。
- SSH接続 : Windowsのターミナルソフト(PuttyやTera Termなど)
- HTTPアクセス : Windowsのブラウザー
からアクセスするための起動オプションについて説明します。
🌐 コンテナのポートを公開とアクセス
WindowsからもSSH・HTTPアクセスできるようにコンテナの起動オプションに以下を追加します。
指定するオプション | 設定内容 |
---|---|
-p 22:22 |
SSH(22)を公開 |
-p 80:80 |
HTTP(80)を公開 |
-p 443:443 |
HTTPS(443)を公開 |
--hostname local.docker-test-web.jp |
コンテナのホスト名の定義 |
コンテナ起動時に指定できるオプションの詳細については以下を参照してください。
https://docs.docker.jp/engine/reference/run.html
何故、-p
と--hostname
オプションを指定するのか?
-pオプション
指定する値は、(ローカルホストのポート):(コンテナのポート)
となります。
22:22
が指定された場合は、ローカルホスト(Windows)の22番ポートにアクセスするとコンテナの22番ポートに転送されます。
これにより、Windows上のターミナルソフトにて以下に接続することでコンテナにSSH接続が出来ます。
- ホスト名 : localhost
- ポート番号 : 22
80:80
および443:443
についてはWindows上のブラウザーでコンテナ内のWebサーバーにアクセスするための設定です。
--hostnameオプション
指定された値をコンテナのホスト名とします。
-p
オプションの指定でローカルホストにアクセスすることでコンテナのWebサーバーにアクセスできるようになりましたが、URLが以下のように変わり、わかりやすくなります:
-
--hostname
なし :https://localhost/~
-
--hostname
あり :https://local.docker-test-web.jp/~
📝 hosts
ファイルへの追加
local.docker-test-web.jp
を有効にするためには、Windows上のhosts
ファイルに以下を追加する必要があります。
127.0.0.1 local.docker-test-web.jp
▶️ コンテナ起動コマンド
起動オプションを追加した起動コマンドは以下のとおりです。
docker run -itd \
--privileged \
--name qiita-20250820 \
-p 22:22 \
-p 80:80 \
-p 443:443 \
--hostname local.docker-test-web.jp \
qiita:20250820
📂 [参考] ボリュームのマウント
本記事では触れませんでしたが、-v
オプション(書式:-v ホスト側のパス:コンテナ側のパス
)を指定することで、ローカルホスト上のディレクトリをコンテナ内から参照・更新できるようになります。
今回作成したコンテナはWebサーバーが稼働していることを前提としていますので、-v
オプションを利用すると以下のような利点があります。
- 開発・検証したいWebアプリケーションのリポジトリがローカルホストにある場合、コンテナOSから直接参照できます。これにより、VS Codeなどで修正したコードの動作確認をすぐに行えます。
- WebアプリやWebサーバーのログをローカルホストに保存できます。これにより、コンテナを再起動してもログファイルが消えず、効率的なデバッグが可能になります。
📝 まとめ
今回の記事では、RockyLinux 9.xのDockerコンテナをより実用的な構成へ強化するためのポイントを紹介しました。
- sudo権限付きユーザーの作成と理由
- タイムゾーン設定の永続化
- 開発に必要なパッケージの事前インストール
- ポート公開による外部アクセス
これらを組み合わせれば、すぐに使える本格的な開発・検証環境を構築できます。
前回の記事も参考にしてください。
👉 読んでいただきありがとうございました!
この記事がどなたかの参考になれば幸いです。また、「もっと良い構築方法があるよ!」などコメントをいただけると嬉しいです。🙌