Happy Web Engineer
【2026年版】Docker完全ガイド|docker-compose+Laravel Sail+トラブル解決|「ローカルで動くのに本番で落ちる」を一発解決
最終更新
初回公開

【2026年版】Docker完全ガイド|docker-compose+Laravel Sail+トラブル解決|「ローカルで動くのに本番で落ちる」を一発解決


はじめに

Webエンジニアとして開発を進めていくと、必ず直面するのが「環境構築の問題」です。

  • 「動くはずのアプリが、自分のPCでは動かない」
  • 「チームメンバーの環境ごとにバグが出る」
  • 「本番環境とローカル環境で挙動が違う」

こうしたトラブルを解決するために登場したのが Docker です。

この記事では、初心者でも理解できるように、Dockerを使った開発環境構築の基本ステップを解説します。


Dockerとは?

Dockerは「アプリケーションを動かすための環境」をコンテナという単位でまとめ、どこでも同じように実行できる仕組みです。

  • 従来の環境構築
     PCに直接ソフトをインストールして設定。人によって差が出やすい。
  • Dockerの環境構築
     環境をコードで定義して、誰でも同じ環境を一瞬で再現できる。

👉 これにより「動かない問題」が劇的に減ります。


Dockerのメリット

  1. 環境の再現性
    どのPCでも同じ環境をすぐに構築できる。
  2. 軽量で高速
    仮想マシンよりも軽く、立ち上げが速い。
  3. 複数環境を同時に扱える
    PHP、Node.js、MySQLなどを同時に実行できる。
  4. 本番と同じ環境を再現できる
    「ローカルでは動くけど本番で動かない」を防げる。

基本用語の理解

  • イメージ(Image)
     環境の設計図。Ubuntu + PHP + MySQLなどをまとめたもの。
  • コンテナ(Container)
     イメージを実際に実行したもの。
  • Dockerfile
     イメージを作るためのレシピ。
  • docker-compose.yml
     複数のサービス(Webサーバー、DBなど)を一括管理する設定ファイル。

Dockerのインストール

1. Docker Desktopの導入

  • Windows/Macの場合:Docker公式サイトから「Docker Desktop」をインストール
  • Linuxの場合:パッケージマネージャーでインストール

👉 インストール後、ターミナルで次を実行して確認。

docker --version

基本ステップ:Webアプリ環境を作る

ここでは Nginx + PHP + MySQL の環境を例にします。

1. ディレクトリを作成

mkdir myapp
cd myapp

2. Dockerfileを作成

php 用のDockerfileを用意。

FROM php:8.2-fpm
WORKDIR /var/www/html

👉 PHP環境の基本構成。


3. docker-compose.ymlを作成

version: '3.8'

services:
  app:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"

  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"

👉 アプリ(PHP)・Webサーバー(Nginx)・DB(MySQL)を一括で管理。


4. Nginxの設定ファイル

nginx.conf を作成。

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }
}

5. 起動する

docker-compose up -d --build

👉 ブラウザで http://localhost:8080 にアクセスするとアプリが表示される。


よく使うDockerコマンド

  • コンテナ起動:
docker-compose up -d
  • コンテナ停止:
docker-compose down
  • ログ確認:
docker-compose logs -f
  • コンテナに入る:
docker exec -it myapp_app_1 bash

👉 最低限これだけ覚えておけばOK。


初心者がつまずきやすいポイント

  1. ポートの競合
    👉 別のアプリと同じポートを使っていると起動できない。
  2. ファイル権限の問題
    👉 Mac/Linuxでよく発生。権限エラーはchmodやchownで解決。
  3. ビルドが遅い
    👉 キャッシュを活用する、不要な依存関係を減らす。

Dockerを学ぶおすすめ教材


Docker Compose 徹底解説

単一コンテナを扱う Docker コマンドに対して、Docker Composeは複数コンテナ(Web+DB+キャッシュ等)をまとめて起動・管理できる仕組みです。実務では Compose を使うのが標準で、個別の docker コマンドを叩くシーンはむしろ少ないです。

Docker と Docker Compose の違い

  • Docker:単一コンテナの操作に向く(1つのサービスだけ動かすならこれで十分)
  • Docker Compose:複数コンテナを YAMLで記述・一括操作(Webサービス構成の標準)

👉 単体で動かす → Docker / Webサービスとして動かす → Compose、と覚えると分かりやすいです。

Docker Compose を使うメリット

  • サービス定義を docker-compose.yml 1ファイルで記述可能
  • 環境構築が docker compose up -d の1コマンドで完了
  • 開発環境・ステージング・本番で設定を使い分けやすい
  • チーム全員が同じ環境を数分で再現できる

Docker Compose の基本

最小構成の docker-compose.yml は以下のような形です(Nginx + PHP + MySQL構成の例)。

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app

  app:
    build: ./app
    volumes:
      - ./app:/var/www/html

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

これだけで Nginx + PHP + MySQL の環境が立ち上がります。

よく使う Compose コマンド

  • docker compose up -d:バックグラウンドで起動
  • docker compose down:全コンテナ停止・削除
  • docker compose logs -f app:特定サービスのログを追跡
  • docker compose exec app bash:コンテナ内でシェル起動
  • docker compose build --no-cache:キャッシュ無しで再ビルド

ベストプラクティス

  • 環境変数は .env ファイルで管理(docker-compose.ymlに直書きしない)
  • ボリュームでソースコードをマウント(編集→即反映で開発効率UP)
  • depends_on で起動順を制御(DB起動後にアプリ起動 等)
  • ネットワークを明示的に定義(複数プロジェクト間の衝突回避)

Laravel Sail — PHP開発者向けDockerラッパー

Laravel プロジェクトを Docker 環境で動かすなら、Laravel Sailを使うのが最も簡単です。SailはLaravel公式が提供するDocker Compose のラッパーで、PHP・MySQL・Redis・Mailhog などWeb開発に必要な一式を1コマンドで構築できます。

Laravel Sail とは?

  • Laravel 公式が提供するDocker開発環境ツール
  • 内部的には Docker Compose のラッパー(薄い抽象化)
  • PHP/Composer をローカルにインストール不要
  • Laravel プロジェクト新規作成時に標準で導入可能

Laravel Sail の導入方法

Laravel プロジェクトを新規作成する場合:

curl -s "https://laravel.build/example-app" | bash
cd example-app
./vendor/bin/sail up -d

既存プロジェクトに追加する場合:

composer require laravel/sail --dev
php artisan sail:install
./vendor/bin/sail up -d

よく使う Sail コマンド

  • sail up -d:環境起動
  • sail down:環境停止
  • sail artisan ...:Laravel の artisan コマンド実行
  • sail composer ...:composerコマンド実行
  • sail npm ...:Node のnpmコマンド実行
  • sail test:PHPUnitテスト実行
  • sail shell:コンテナ内のシェルに入る

Sail で利用できる主要サービス

  • MySQL / PostgreSQL / MariaDB(RDB選択可能)
  • Redis / Memcached(キャッシュ)
  • Meilisearch / Typesense(検索エンジン)
  • Mailhog(メール送信確認)
  • MinIO(S3互換ストレージ)

👉 Laravel 開発では自前の docker-compose.yml を書くより、Sailを使うほうが圧倒的に早いです。


実務での活用例

  • 開発環境の共有:チーム全員が同じ環境で開発可能
  • テスト環境構築:自動テストをDockerで実行
  • CI/CDとの連携:GitHub ActionsやGitLab CIと組み合わせて自動デプロイ

👉 「環境構築が一瞬で終わる」ことで、開発スピードが大幅に上がります。


トラブルシューティング集

Docker を使っていて遭遇する典型的な問題と解決法をまとめます。

ポートが既に使われている

エラー: Bind for 0.0.0.0:80 failed: port is already allocated

解決: 既存プロセスを特定して停止、または Compose の ports を別ポートに変更(例: "8080:80")

ボリュームマウントが反映されない

Mac/Windows で特に起こりやすい問題。Docker Desktop の設定でファイル共有が有効か確認し、docker-compose.yml のパスがプロジェクトルートからの相対パスで正しいかチェックしてください。

パーミッションエラーで書き込み不可

Linux ホストで頻発。コンテナ内の UID とホストの UID 不一致が原因。
Dockerfile で USER $UID のような指定を加える、または chown で所有者を調整します。

動作が異常に遅い(Mac/Windows)

Mac/Windows の Docker Desktop は Linux VM 経由で動くため、ホストとコンテナ間のファイル同期がボトルネックになります。
解決: ソースコード以外の node_modules などを volume mount から除外する、Mutagen / docker-sync 等の高速同期ツールを使う。

キャッシュで古いイメージが使われる

docker-compose.yml を修正したのに反映されない場合、以下を試す:

docker compose down
docker compose build --no-cache
docker compose up -d

よくある質問(FAQ)

Q. なぜDockerを使うべきなのですか?

「自分のPCでは動くのに本番で動かない」という開発者永年の悩みを根本解決できるからです。Docker を使えば、開発環境・ステージング・本番環境を完全に同一化できるため、「環境依存バグ」が激減します。

Q. 仮想マシン(VirtualBoxなど)とDockerの違いは?

仮想マシンは「ハードウェア仮想化」でOS全体を含むため重い(数GB)。Dockerは「プロセス仮想化」でOSをホストと共有するため軽量(数十MB〜数百MB)で起動も秒単位です。

Q. WindowsでDockerを使う場合の注意点は?

WSL2(Windows Subsystem for Linux 2)上で動かすのが推奨です。Docker Desktopのインストール時に WSL2 統合を有効化してください。ファイルシステムの性能向上とLinuxとの互換性が得られます。

Q. 本番環境でもDockerは使えますか?

はい、むしろ現代のWeb本番環境では標準です。Kubernetes・AWS ECS・Google Cloud Run・Fly.io など、Dockerコンテナを本番で動かすプラットフォームが豊富にあります。開発環境と本番環境の構成を揃えやすいのが最大のメリットです。

Q. Laravel Sailと自前のdocker-compose.ymlどちらを使うべき?

Laravelプロジェクトなら 基本Sailで十分です。独自の環境構成が必要な場合のみ自前のdocker-compose.ymlを書きましょう。Sailは「学習コスト最小・初速最速」で、カスタマイズは Sail からの発展形としてあとから学べます。


まとめ

  • Dockerは 「動かない問題」を解決する環境構築ツール
  • メリット:再現性・軽量・本番と同じ環境
  • 基本ステップ:Dockerfile → docker-compose.yml → 起動
  • 実務では開発・テスト・本番運用すべてに活用できる

👉 Webエンジニアを目指すなら、Dockerは避けて通れないスキルです。

関連記事

👉 個人開発・副業に最適なサーバー完全ガイド
👉 【2026年版】Node.jsが動くレンタルサーバー比較
👉 【2026年版】Webフレームワーク選び完全ガイド
👉 【2026年版】プログラミング言語選び完全ガイド
👉 【2026年版】エンジニア学習リソース完全ガイド