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 zone が Asia/Tokyo,System clock synchronized が yes になっていることを確認する.
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とコンテナイメージの更新方法なども準備する必要がある.