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?

RockyLinux 9.x Docker環境をより実用的にする構築手順(初心者向け)

Last updated at Posted at 2025-08-20

🐳 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)を付与します。

手順は以下の通りです:

  1. sudoのインストール
    RockyLinuxの最小構成イメージにはsudoが入っていません。

    dnf install -y sudo
    
  2. ユーザーをwheelグループに追加
    wheelグループに所属するユーザーはsudo権限を持てます。

    usermod -aG wheel k-hata-tb
    
  3. パスワードなしで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サーバーも稼働することを想定してアクセス可能なポートに80443を追加してあります。

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コンテナがビルドできました。


:zap: コンテナの起動とオプション

このコンテナの構成では、ポートが外部に公開されていないために、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権限付きユーザーの作成と理由
  • タイムゾーン設定の永続化
  • 開発に必要なパッケージの事前インストール
  • ポート公開による外部アクセス

これらを組み合わせれば、すぐに使える本格的な開発・検証環境を構築できます。
前回の記事も参考にしてください。

👉 読んでいただきありがとうございました!

この記事がどなたかの参考になれば幸いです。また、「もっと良い構築方法があるよ!」などコメントをいただけると嬉しいです。🙌

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?