はじめに
前回、EC2に直接PHPやDBをインストールしましたが、今後の拡張性(WordPress移行やCI/CD)を考えて、Docker化に挑戦しました。
1. 準備:Docker と Docker Compose の導入
Amazon Linux 2023 に Docker をインストールします。
sudo dnf install -y docker #最初から入っているかも
sudo systemctl start docker
sudo usermod -aG docker ec2-user
※反映には一度ログアウトが必要です。
また、最新の docker-compose もインストールしました。
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. ハマりポイント:Buildx のバージョンエラー
docker-compose up を実行した際、以下のエラーに遭遇しました。
compose build requires buildx 0.17.0 or later
原因
Amazon Linux 2023の標準リポジトリにあるDockerのバージョンが古い。
今回使った docker-compose.yml の書き方には、最新のビルドエンジン(Buildx)が必要だったため、手動で最新の部品を差し込む必要あり(標準アップデートされていれば必要ないかも)
解決策:
Buildx プラグインを最新バージョンに手動でアップデートすることで解消しました。
詳細な手順↓
1. プラグインを置くフォルダを作成
mkdir -p ~/.docker/cli-plugins/
2. 最新の Buildx をダウンロード
curl -SL https://github.com/docker/buildx/releases/download/v0.17.1/buildx-v0.17.1.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
3. 実行権限を与える
chmod +x ~/.docker/cli-plugins/docker-buildx
4. バージョンを確認
docker buildx version
v0.17.1以上だったらOK
3. 各種設定ファイルの作成
プロジェクトルートに以下のファイルを配置しました。
docker-compose.yml
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
app:
build:
context: .
dockerfile: ./docker/php/Dockerfile
volumes:
- .:/var/www/html
working_dir: /var/www/html
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: ${DB_DATABASE}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
docker/php/Dockerfile
FROM php:8.3-fpm
# PostgreSQL接続用の拡張機能をインストール
RUN apt-get update && apt-get install -y \
libpq-dev \
&& docker-php-ext-install pdo_pgsql
# Composerをインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
4. 設定のポイント:.env の修正
Dockerコンテナ間では 127.0.0.1 は「自分自身のコンテナ」を指してしまいます。
そのため、DB_HOST を docker-compose.yml で定義したサービス名 db に書き換えます。これでコンテナ間通信が可能になります。
DB_CONNECTION=pgsql
DB_HOST=db
5. コンテナの起動とマイグレーション
準備ができたらコンテナを起動します。
docker-compose up -d --build
コンテナの外(EC2)から、コンテナの中(app)に向かってコマンドを投げます。
docker-compose exec app php artisan migrate
これで無事にテーブルが作成されました!
あとがき
次はWordpress用のコンテナを作ろうと思います。