いつもブログをご覧くださり、ありがとうございます。
少し前から、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などの開発環境にもつなげていきたいと思います。

