Docker でのWeb環境構築:Apache, PostgreSQL連携
Apache設定の前に、
Dockerコンテナを利用して、LPIC学習やWebアプリケーション開発に最適な「Apache(Webサーバー)」「PostgreSQL(データベース)」環境を最小構成で構築しました。
構築環境の概要
| サービス | コンテナ名 | イメージ | IPアドレス | 役割 |
|---|---|---|---|---|
| Webサーバー | www.app.local |
dockerd-apache |
172.16.10.20 |
Webコンテンツ、疎通確認 |
| データベース | db.app.local |
dockerd-db |
172.16.10.30 |
PostgreSQLデータ管理 |
| ネットワーク | app_net |
Bridge | 172.16.10.0/24 |
コンテナ間通信 |
ステップ 1: ファイル構成とイメージ定義
作業ディレクトリ /home/admin/docker.d/ 内に、以下のファイル構成を作成します。
1-1. Dockerfile.apache
基本的なAlmaLinux上にApacheをインストールし、フォアグラウンドで起動します。
FROM almalinux:9
# Apacheと疎通確認ツールをインストール
RUN dnf install -y httpd bind-utils && \
dnf clean all
EXPOSE 80
# Apacheをフォアグラウンドで起動
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
1-2. Dockerfile.postgres
PostgreSQLをインストールし、設定ファイルとデータディレクトリを分離する工夫を施します。
FROM almalinux:9
# PostgreSQLをインストール
RUN dnf install -y postgresql-server bind-utils && \
dnf clean all
# 初期化された設定ファイルを /etc/postgresql へ移動
RUN mkdir -p /tmp/initdb && \
chown -R postgres:postgres /tmp/initdb && \
su - postgres -c "/usr/bin/initdb -D /tmp/initdb"
# データを管理するディレクトリを作成
RUN mkdir -p /var/lib/pgsql/data && \
chown -R postgres:postgres /var/lib/pgsql/data
# 設定ファイルを /etc/postgresql/ に移動
RUN mkdir -p /etc/postgresql && \
mv /tmp/initdb/postgresql.conf /etc/postgresql/ && \
mv /tmp/initdb/pg_hba.conf /etc/postgresql/ && \
mv /tmp/initdb/postgresql.auto.conf /etc/postgresql/
# 初期化用ディレクトリは削除
RUN rm -rf /tmp/initdb
EXPOSE 5432
USER postgres
# 起動時に設定ファイルのパスを明示的に指定
CMD ["/usr/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/etc/postgresql/postgresql.conf"]
1-3. docker-compose.yml (ベース定義)
ネットワークの全体設定とボリュームを定義します。
version: '3.8'
# サービス定義は外部ファイルに委譲
services: {}
# ネットワークとボリュームの定義
networks:
app_net:
name: private_app_net
ipam:
driver: default
config:
- subnet: 172.16.10.0/24
volumes:
db_data:
1-4. docker-compose.apache.yml (Webサービス定義)
version: '3.8'
services:
apache:
build:
context: .
dockerfile: Dockerfile.apache
network: host
container_name: www.app.local
ports:
- "80:80"
volumes:
# 各種設定・データディレクトリのマウント
- /etc/httpd/conf.d/vhosts.conf:/etc/httpd/conf.d/vhosts.conf
- /var/www/html/www:/var/www/html/www
- /var/log/httpd/:/var/log/httpd/
restart: always
networks:
app_net:
ipv4_address: 172.16.10.20
1-5. docker-compose.db.yml (DBサービス定義)
version: '3.8'
services:
db:
build:
context: .
dockerfile: Dockerfile.postgres
container_name: db.app.local
environment:
- POSTGRES_PASSWORD=lpicuser
volumes:
# データディレクトリの永続化
- /var/lib/pgsql/data:/var/lib/pgsql/data
# 設定ファイルディレクトリの永続化
- /etc/postgresql:/etc/postgresql
# ログディレクトリの永続化
- /var/log/pgsql:/var/log/pgsql
restart: always
networks:
app_net:
ipv4_address: 172.16.10.30
ステップ 2: ホスト側ディレクトリ準備と初期設定
PostgreSQLコンテナが安定して起動するためには、ホスト側の権限と設定ファイルを適切に準備する必要があります。
2-1. データディレクトリの準備と権限設定
sudo mkdir -p /etc/postgresql/
sudo chown -R xxx:xxx /etc/postgresql/ ←コンテナ内の postgres ユーザーIDを指定すること
sudo mkdir -p /var/lib/pgsql/data/
sudo chown -R xxx:xxx /var/lib/pgsql/data/ ←コンテナ内の postgres ユーザーIDを指定すること
sudo chmod -R 700 /var/lib/pgsql/data/
2-2. PostgreSQL設定ファイルの修正
ホスト側の /etc/postgresql/postgresql.conf で、起動時のロックファイルエラーと外部接続設定を回避します。
# /etc/postgresql/postgresql.conf を編集
sudo vi /etc/postgresql/postgresql.conf
# 以下の2行のコメントアウトを外し、値を修正・追記
# 1. リモート接続を許可
listen_addresses = '*'
# 2. 重要: ロックファイル/ソケットのパスをデータディレクトリ内に変更
# (/var/runへの書き込み権限エラーを回避するため)
unix_socket_directories = '/var/lib/pgsql/data'
# /etc/postgresql/pg_hba.conf を編集
sudo vi /etc/postgresql/pg_hba.conf
# ファイル末尾に、Dockerネットワークからのアクセスを許可する行を追記
host all all 172.16.10.0/24 md5
ステップ 3: 起動とDBへの接続
3-1. サービスの一括起動
すべての Compose ファイルを指定し、サービスをビルドして起動します。
docker compose -f docker-compose.yml \
-f docker-compose.apache.yml \
-f docker-compose.db.yml \
up -d --build
3-2. DBへの接続と初期ユーザー作成
/var/lib/pgsql/data にソケットが移動しているため、psql 実行時にソケットパスを明示的に指定する必要があります。
# psqlクライアントのソケットパスを明示的に指定して接続
docker exec -it --user postgres db.app.local psql -h /var/lib/pgsql/data
# psqlが起動したら、以下のコマンドを実行
CREATE USER dbadminr WITH PASSWORD 'password';
CREATE DATABASE appdb OWNER appuser;
\q
これで、WebサーバーとDBサーバが立ち上がりました。
次こそApacheの設定をしていきます!