DockerとGitを使って本番運用するWebサーバーを作るために,AlmaLinuxの初期設定と必要なツールの導入を行う.

この記事ではAlmaLinux 9を想定し,作業ユーザーを ec2-user,ホスト名を one-coder.com とする.環境が異なる場合は適宜読み替える.

この記事で準備する構成

本番Webサーバーでは,Gitでソースコードと設定ファイルを管理し,Docker Composeを使って各種サービスを起動する構成を前提とする.

Webアプリケーション,データベース,リバースプロキシなどは,原則としてサービスごとに個別のコンテナへ入れて運用する.本番サーバーへアプリケーションの実行環境やミドルウェアを直接インストールすることは避け,ホスト側に置くものをGit,Docker Engine,Docker Composeなど,コンテナの管理に必要なものへ絞る.

1AlmaLinux 2├── Git 3├── Docker Engine 4└── Docker Compose 5 ├── Webアプリケーション 6 ├── データベース 7 └── リバースプロキシ

各コンテナの構成はDockerfileとComposeファイルで管理し,サービス間の通信にはComposeが作るネットワークを使う.データベースやアップロードファイルなど,コンテナを作り直しても残す必要があるデータは,ボリュームまたはホスト側へマウントしたディレクトリに保存する.環境ごとの設定値や認証情報などの秘密情報はGitへ含めず,本番サーバー側で管理する.

コンテナ内へ入ってプログラムを直接修正する運用は行わない.変更するときはソースコードや設定ファイルを更新し,新しいイメージをビルドしてコンテナを作り直す.これにより,開発環境と本番環境の差を小さくし,別のサーバーでも同じ構成を再現しやすくなる.

この記事では,この構成の土台となるOS,Docker,Git,ネットワーク,SELinuxの設定を行う.アプリケーション固有の設定や起動手順は扱わず,Webサーバーとして利用できる環境を整えるところまでを範囲とする.

OSを更新する

最初に,インストール済みのパッケージを更新する.

1sudo dnf -y upgrade 2sudo reboot

再起動後,もう一度SSHでログインする.

ホスト名を変更する

1sudo hostnamectl set-hostname one-coder.com 2hostnamectl

hostnamectl の出力で Static hostname が変更されていることを確認する.ホスト名を変更しても,DNSレコードは自動では作成されない.外部から one-coder.com で接続するには,別途DNSを設定する必要がある.

タイムゾーンを設定する

1sudo timedatectl set-timezone Asia/Tokyo 2timedatectl

Time zoneAsia/TokyoSystem clock synchronizedyes になっていることを確認する.

Gitをインストールする

1sudo dnf -y install git 2git --version

サーバー上でコミットを作成する可能性がある場合は,名前とメールアドレスも設定する.ソースコードの取得だけに使うなら必須ではない.

1git config --global user.name "Your Name" 2git config --global user.email "you@example.com"

Dockerをインストールする

Docker公式のRPMリポジトリを追加し,Docker Engine,Buildx,Docker Composeプラグインをインストールする.

1sudo dnf -y install dnf-plugins-core 2sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3 4sudo dnf -y install \ 5 docker-ce \ 6 docker-ce-cli \ 7 containerd.io \ 8 docker-buildx-plugin \ 9 docker-compose-plugin

Dockerを起動し,OS起動時にも自動で立ち上がるようにする.

1sudo systemctl enable --now docker 2sudo systemctl status docker

現在のユーザーが sudo なしで Docker を操作できるよう,docker グループへ追加する.

1sudo usermod -aG docker "$(id -un)"

グループ設定を反映するため,一度ログアウトしてから再ログインする.その後,動作を確認する.

1docker run --rm hello-world 2docker compose version

docker グループのユーザーは,実質的にroot相当の操作ができる.本番環境では追加するユーザーを必要最小限にする.

ファイアウォールを確認する

必要なポートだけを公開する.SSH,HTTP,HTTPSを使用する例は次のとおり.クラウド上では,OS側のfirewalldだけでなく,セキュリティグループなどの受信ルールも確認する.

1sudo systemctl enable --now firewalld 2sudo firewall-cmd --permanent --add-service=ssh 3sudo firewall-cmd --permanent --add-service=http 4sudo firewall-cmd --permanent --add-service=https 5sudo firewall-cmd --reload 6sudo firewall-cmd --list-all

Dockerで公開したコンテナポートは,firewalldの設定だけでは意図どおり制限できない場合がある.アプリケーションの内部ポートは外部へ直接公開せず,Nginxなどのリバースプロキシを介してHTTPまたはHTTPSで公開する.

SELinuxを確認する

1getenforce

本番環境では,原則として Enforcing のまま運用する.ただし,初期構築時はSELinuxによって通信やファイルアクセスが拒否されると,疎通確認の切り分けが複雑になることがある.その場合は,一時的に Permissive へ変更して動作を確認する方法もある.

1# 一時的にPermissiveへ変更する 2sudo setenforce 0 3 4# Enforcingへ戻す 5sudo setenforce 1

setenforce による変更は再起動すると元へ戻る.ボリュームのマウントで権限エラーになる場合は,SELinuxを完全に無効化する前に,マウント指定の :Z や適切なSELinuxコンテキストを検討する.

初期設定後の確認

1hostnamectl 2timedatectl 3git --version 4docker version 5docker compose version 6sudo systemctl is-enabled docker 7sudo systemctl is-active docker

ここまでで,DockerとGitを使って本番運用するWebサーバーの土台が整う.実際の運用では,TLS証明書,ログの保存,バックアップ,監視,OSとコンテナイメージの更新方法なども準備する必要がある.

参考