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?

LPIC 202合格に向けて、Docker でのWeb環境構築

Posted at

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をインストールし、フォアグラウンドで起動します。

Dockerfile.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をインストールし、設定ファイルとデータディレクトリを分離する工夫を施します。

Dockerfile.postgres
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 (ベース定義)

ネットワークの全体設定とボリュームを定義します。

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サービス定義)

docker-compose.apache.yml
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サービス定義)

docker-compose.db.yml
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の設定をしていきます!

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?