UbuntuにDockerとPHPの開発環境を構築する|Docker ComposeでPHPを動かすまで

,

本記事は広告が含まれる場合があります。

いつもブログをご覧くださり、ありがとうございます。

少し前から、Ubuntuをインストールした物理マシンにSambaを導入し、WindowsやMacから利用できるファイルサーバーを構築しました。
また、SSHを利用して、普段使っているMacやWindowsからUbuntuへ接続し、コマンドラインで操作できる環境も整えています。せっかくUbuntuマシンを用意したので、今度はこのマシンをWeb開発の検証・開発環境としても活用したいと思います。

自分自身の備忘録も兼ねて、実際に行った手順をまとめます。

この記事について

この記事に掲載しているIPアドレス、ユーザー名、ディレクトリ名などは、実際の環境とは異なる説明用の値に置き換えています。

この記事では、UbuntuサーバーのIPアドレスを次のようにしています。

192.168.1.100

ご自身の環境に合わせて読み替えてください。

今回使用したUbuntuは以下のバージョンです。

Ubuntu 24.04.5 LTS

また、MacまたはWindowsからUbuntuへSSH接続できる状態を前提としています。


まずはUbuntu上でPHPを実行してみる

Dockerを導入する前に、まずUbuntuへ直接PHPをインストールして、簡単なPHPプログラムを動かしてみます。

PHPがインストールされているか確認します。

php -v

PHPがインストールされていない場合は、パッケージ情報を更新します。

sudo apt update

続いてPHPをインストールします。

sudo apt install php

インストール後、もう一度確認します。

php -v

PHPのバージョン情報が表示されればインストール完了です。


PHPのテスト用ディレクトリを作成する

今回はホームディレクトリの下に workspace/php-test というディレクトリを作成しました。

mkdir -p ~/workspace/php-test
cd ~/workspace/php-test

現在いるディレクトリは、次のコマンドで確認できます。

pwd

次のように表示されます。

/home/ユーザー名/workspace/php-test

hello.phpを作成する

nano を使って簡単なPHPファイルを作成します。

nano hello.php

以下を入力します。

<?php

echo "Hello PHP!\n";

nano では、

Ctrl + O
↓
Enter
↓
Ctrl + X

の順番で操作すると、ファイルを保存して終了できます。

作成したPHPを実行します。

php hello.php

次のように表示されれば成功です。

Hello PHP!

これでUbuntu上からPHPをコマンドラインで実行できるようになりました。


PHPの開発用Webサーバーを起動する

次は、コマンドラインではなくMacやWindowsのブラウザからPHPへアクセスしてみます。

PHPには開発・テスト用途に利用できる組み込みWebサーバーがあります。

php-test ディレクトリで以下を実行します。

php -S 0.0.0.0:8000

PHPの開発用Webサーバーが8000番ポートで起動します。

MacやWindowsのブラウザから、次のURLへアクセスします。

http://192.168.1.100:8000/hello.php

ブラウザに、

Hello PHP!

と表示されれば成功です。

この時点では、Ubuntuに直接インストールしたPHPが hello.php を実行しています。

PHPの組み込みWebサーバーは開発・検証用途のものです。本番環境用のWebサーバーとして利用するものではありません。また、この記事ではLAN内での検証を想定しています。

Webサーバーを終了する場合は、ターミナルで Ctrl + C を押します。


UbuntuにDocker Engineをインストールする

ここからDockerを導入していきます。

今回はUbuntuのパッケージに含まれる docker.io ではなく、Docker公式リポジトリからDocker Engineをインストールしました。

まず必要なパッケージをインストールします。

sudo apt update
sudo apt install ca-certificates curl

Docker公式のGPGキーを保存するディレクトリを作成します。

sudo install -m 0755 -d /etc/apt/keyrings

GPGキーを取得します。

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc

読み取り権限を設定します。

sudo chmod a+r /etc/apt/keyrings/docker.asc

続いてDocker公式リポジトリを登録します。

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

パッケージ情報を更新します。

sudo apt update

今回の環境では、次のようにDocker公式リポジトリが認識されました。

ヒット: https://download.docker.com/linux/ubuntu noble InRelease

Ubuntu 24.04のコードネームは noble です。


Docker Engineをインストールする

続いてDocker Engine本体をインストールします。

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

インストールできたら、Dockerサービスの状態を確認します。

sudo systemctl status docker

次のように、

Active: active (running)

と表示されればDockerが起動しています。

systemctl status の表示画面は q キーで終了できます。


hello-worldコンテナを動かしてみる

Dockerが正常に動作するか確認します。

sudo docker run hello-world

初回は hello-world イメージがローカルに存在しないため、Docker Hubから自動的にダウンロードされます。

最終的に、

Hello from Docker!
This message shows that your installation appears to be working correctly.

と表示されれば成功です。

これでDocker Engineが正常に動いていることを確認できました。


Dockerコンテナ上でPHPを実行する

ここからが今回試してみたかったところです。

先ほど作成した、

~/workspace/php-test/hello.php

を、今度はUbuntuに直接インストールしたPHPではなく、Dockerコンテナ内のPHPから実行してみます。

テスト用ディレクトリへ移動します。

cd ~/workspace/php-test

次のコマンドを実行します。

sudo docker run --rm \
  -v "$PWD:/app" \
  -w /app \
  php:8.4-cli \
  php hello.php

初回は php:8.4-cli のDockerイメージがダウンロードされます。

最終的に、

Hello PHP!

と表示されれば成功です。


Dockerのコマンドでは何をしているのか?

今回のコマンドを少し分解してみます。

sudo docker run --rm \
  -v "$PWD:/app" \
  -w /app \
  php:8.4-cli \
  php hello.php

--rm は、PHPの実行が終わったら作成したコンテナを自動的に削除する指定です。

-v "$PWD:/app" では、Ubuntu側の現在のディレクトリを、コンテナ内の /app としてマウントしています。

-w /app は、コンテナ内での作業ディレクトリを /app にしています。

php:8.4-cli が今回使用するPHP 8.4のDockerイメージです。

そして最後の、

php hello.php

がコンテナ内で実行するコマンドです。

つまり、

Ubuntu
│
├── ~/workspace/php-test/
│       └── hello.php
│
└── Docker
       └── PHP 8.4コンテナ
              │
              └── /app/hello.php
                       ↑
                       │ ボリュームマウント
                       │
                  Ubuntu側のファイル

という構成になります。

Ubuntu上に置いているPHPファイルを、Dockerコンテナ内のPHPで実行しているわけです。


DockerのPHPへブラウザからアクセスする

次はDockerコンテナ内でPHPの開発用Webサーバーを起動してみます。

sudo docker run --rm \
  -p 8001:8000 \
  -v "$PWD:/app" \
  -w /app \
  php:8.4-cli \
  php -S 0.0.0.0:8000

ここでは新しく、

-p 8001:8000

という指定が登場します。

これはUbuntu側の8001番ポートを、Dockerコンテナ側の8000番ポートへ接続する指定です。

構成としては、

Mac / Windows
      │
      │ http://192.168.1.100:8001
      ▼
Ubuntu Server
      │
      │ 8001
      ▼
Docker Container
      │
      │ 8000
      ▼
PHP Development Server
      │
      ▼
hello.php

となります。

MacやWindowsのブラウザから、

http://192.168.1.100:8001/hello.php

へアクセスします。

Hello PHP! が表示されれば成功です。

試しにUbuntu側の hello.php を、

<?php

echo "Hello Docker PHP!";

に変更して保存します。

ブラウザをリロードすると、

Hello Docker PHP!

へ変更されました。

これはUbuntu側のファイルをDockerコンテナへボリュームマウントしているためです。

ファイルをDockerコンテナへコピーし直さなくても、Ubuntu側のファイル変更がそのままDocker側に反映されます。


Docker ComposeでPHP環境を起動する

ここまでの方法でもPHPを実行できますが、毎回、

sudo docker run --rm \
  -p 8001:8000 \
  -v "$PWD:/app" \
  -w /app \
  php:8.4-cli \
  php -S 0.0.0.0:8000

と入力するのは少し大変です。

そこでDocker Composeを使って、この設定をファイルにまとめてみます。

php-test ディレクトリで、

nano compose.yaml

を実行します。

以下の内容を記述します。

services:
  php:
    image: php:8.4-cli
    ports:
      - "8001:8000"
    volumes:
      - .:/app
    working_dir: /app
    command: php -S 0.0.0.0:8000

これでディレクトリ構成は、

php-test/
├── compose.yaml
└── hello.php

となります。


Docker Composeを起動する

次のコマンドを実行します。

sudo docker compose up

今回の環境では、

✔ Network php-test_default Created
✔ Container php-test-php-1 Created
Attaching to php-1
php-1 | PHP 8.4 Development Server (http://0.0.0.0:8000) started

と表示されました。

再びブラウザから、

http://192.168.1.100:8001/hello.php

へアクセスします。

ブラウザに、

Hello Docker PHP!

と表示されれば、Docker Composeを使ったPHP開発環境の完成です。

アクセスするとDocker側のログにも、

[200]: GET /hello.php

と表示されます。


Docker Composeでよく使うコマンド

今回の環境では、今後次のコマンドをよく使うことになりそうです。

# 起動
sudo docker compose up

# バックグラウンドで起動
sudo docker compose up -d

# 起動状態を確認
sudo docker compose ps

# ログを確認
sudo docker compose logs

# 停止・コンテナなどを削除
sudo docker compose down

docker compose up をフォアグラウンドで実行している場合は、Ctrl + C でも停止できます。


まとめ

今回はUbuntuマシンをWeb開発環境として活用するため、PHPとDockerの基本的な環境を構築してみました。

最初にUbuntuへ直接PHPをインストールして、

php hello.php

からスタートしました。

その後Dockerを導入し、

Ubuntuに直接インストールしたPHP
        ↓
Dockerコンテナ内のPHP
        ↓
DockerのPHPへブラウザからアクセス
        ↓
Docker Composeで環境を定義

という順番で試してみました。

最初からDocker Composeだけを使うよりも、Ubuntu上のPHPとDocker上のPHPをそれぞれ動かして比較してみることで、Dockerがどの部分を担当しているのか理解しやすかったです。

特に今回、

  • Dockerイメージ
  • コンテナ
  • ボリュームマウント
  • ポートマッピング
  • Docker Compose

といったDockerの基本的な仕組みを、実際にPHPを動かしながら確認できました。

現時点ではPHP単体のシンプルな環境ですが、次はDocker ComposeにMySQLを追加して、PHP + MySQLの開発環境を構築してみたいと思います。
そこからPHPからMySQLへの接続やデータの登録・取得を試し、最終的にはLaravelやWordPressなどの開発環境にもつなげていきたいと思います。

お問い合わせはこちらから

南大阪を中心に活動しているシステムエンジニアです。これまでの経験から、ビジネス課題について一緒になって考え、課題解決のためにサポートさせていただきます。些細なご相談でも構いません。当方に期待することやご相談内容についてお聞かせください。

トップへ戻る