Dockerでローカル開発環境を構築!MAMP・Vagrantとの比較と導入手順

Webサイト制作の現場で「Docker(ドッカー)」という言葉を耳にする機会が増えていませんか?「なんだか難しそう」「MAMPやVagrantと何が違うの?」と感じているWeb制作者やサイト運営初心者の方も多いかもしれません。

Dockerは、開発環境を簡単かつ軽量に構築できる技術です。この記事では、Dockerのインストールから、具体的なテスト環境(ローカル開発環境)の構築手順、そして既存の環境構築ツールであるMAMPやVagrantとの比較まで、実用的な視点でわかりやすく解説します。

Dockerのインストールとローカル開発環境の構築

1. インストール

Docker公式サイトから「Docker Desktop」をダウンロードし、インストールします。
https://docs.docker.com/get-docker/

インストール完了後、ターミナル(またはコマンドプロンプト)を開き、「docker version」コマンドを実行して、バージョン情報が表示されればインストール成功です。

2. テスト環境構築

現在のWeb制作で使われるローカル開発環境は、主に以下の3パターンに大別されるでしょう。

  • a) MAMPを使用した、データベース不要の静的環境(HTML/PHP)
  • b) MAMP + WordPress環境
  • c) Vagrantを使用した開発環境

これらの環境を、Dockerを用いて構築する方法をご紹介します。

a) 静的環境(HTML/PHP)をDockerで再現する

MAMP(Mac, Apache, MySQL, PHP)環境のうち、データベース(MySQL)を使用しない、ApacheとPHPだけのシンプルな環境をDockerで再現します。

Dockerfileの作成

まず、任意の作業ディレクトリを作成し、その直下に「Dockerfile」という名前のファイルを作成します。

Dockerfileの設定

作成したDockerfile内に下記を記述し保存します。

FROM php:7.2-apache

FROM には、ベースとなるイメージとタグを指定します。ここでは、PHP 7.2とApacheがセットになった公式イメージを指定しています。
Docker HubはDockerコンテナのイメージを共有できるサービスです。公式イメージ以外を使用する場合は内容をよく確認しましょう。
※ 制作するWebサイトの要件(例: PHPのバージョン)に合わせて、php:5.6-apache のようにタグを変更してください。

docker buildを実行し、Dockerイメージを作成する

ターミナルでDockerfileがあるディレクトリに移動し、以下のコマンドを実行します。

docker build ./ -t php_apache_image:ver001

-t オプションで、作成するイメージに「名前:タグ」(ここでは php_apache_image:ver001)を付けます。

エラー対処: -bash: docker: command not found

もし上記のようなエラーが出た場合、Docker Desktopが起動しているか確認してください。起動していない場合、Dockerコマンドが認識されません。
起動しても解決しない場合、以下のコマンドでシンボリックリンクを作成してみてください。

# Docker Desktop がインストールされている場所から /usr/local/bin にシンボリックリンクを作成
sudo ln -s /Applications/Docker.app/Contents/Resources/bin/docker /usr/local/bin/docker
エラー対処: failed to read dockerfile

「ERROR: failed to build: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory」というエラーが出た場合、ターミナルで現在のディレクトリを確認し、Dockerfileが存在するディレクトリに移動してから再度コマンドを実行してください。

エラー対処: docker-credential-desktop not found

「ERROR: failed to build: failed to solve: error getting credentials – err: exec: “docker-credential-desktop”: executable file not found in $PATH」というエラーが出た場合、「認証情報の保存と取得にはdocker-credential-desktopというヘルパープログラムを使え」という指示について、システムがこのプログラムを見つけられていないことが原因です。

特にMacのDocker Desktop for MacではCLIツールが$PATHに登録されず、docker-credential-desktop実行ファイルを参照できないため問題が発生しがちです。以下に解決方法の一例を示します。

解決方法の一例
Docker Desktopを起動 → 画面右上の歯車アイコン → 左メニューの Advanced タブ → 「Choose how to configure the installation of Docker's CLI tools」を"user" から "System (requires password)"に変更 → ApplyをクリックしてDockerを再起動。

※"user"のままの場合は、手動でシンボリックリンクを張る必要があります。公式サイトを確認してください。
https://docs.docker.com/desktop/setup/install/mac-permission-requirements/#installing-symlinks
※その他、~/.docker/config.json を編集して、「"credsStore": "desktop",」の行を削除して、認証情報ヘルパーの設定を削除し、Dockerに認証情報の管理を任せる方法もあります。

イメージの確認

以下のコマンドを実行し、「php_apache_image」というイメージが作成されていることを確認します。

docker images

ホスト側(ローカルマシン上)に開発用ディレクトリを用意する

(例: /Users/xxx/webDevelop/_docker-test

docker runを実行し、コンテナを起動する

ターミナルで以下を実行します。

docker run -d -p [ローカルのポート]:[コンテナ側のポート] -v [ローカル側のパス]:[コンテナ側のパス] --name [コンテナの名前] [イメージ名]

▼実行例
docker run -d -p 18080:80 -v /Users/xxx/webDevelop/_docker-test:/var/www/html --name php_apache_container php_apache_image:ver001

※ オプション解説
-d: バックグラウンドで実行
-p: ポートを指定(ローカル側:コンテナ側)
-v: ディレクトリをマウント(ローカル側:コンテナ側)
--name: コンテナに名前を指定

ブラウザでアクセスし、表示を確認する

実行例の場合、ローカルのポートは「18080」、作業パスは「/Users/xxx/webDevelop/_docker-test」に設定しました。
ブラウザで http://localhost:18080/ にアクセスし、ローカルの作業パス内のファイルが表示されていれば成功です。

※確認用のPHPファイルを作成しておくと便利です。例えば、以下の内容を持つ「index.php」ファイルを作成し、ローカルの作業パス内に保存します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * { margin: 0; padding: 0; }
        body { font-family: Arial, sans-serif; background-color: #f5f5f5; padding: 20px; }
        .congratulations {
            font-size: 80px; font-weight: bold; text-align: center; margin-bottom: 20px;
            background: linear-gradient(90deg, #FFD700, #FFA500, #FFD700, #FFA500, #FFD700);
            background-size: 200%;
            -webkit-background-clip: text; background-clip: text;
            -webkit-text-fill-color: transparent;
            animation: gradientShift 3s infinite;
        }
        @keyframes gradientShift { 0%, 100% { background-position: 0; } 50% { background-position: 100%; } }
        .info-text { margin-bottom: 30px; font-size: 18px; line-height: 1.8; text-align: center; }
    </style>
</head>
<body>
    <div class="congratulations">Congratulations!</div>
    <div class="info-text">
        DockerでPHP7.2+apache環境を構築しました。<br>
        以下にPHP情報が表示されれば成功です。
    </div>
    <?php phpinfo(); ?>
</body>
</html>

コンテナとイメージの削除(参考)

不要になったコンテナやイメージは以下のコマンドで削除できます。

# ステータス確認
docker ps -a

# コンテナの停止
docker stop [コンテナ名 または コンテナID]

# コンテナの削除(停止しているコンテナのみ)
docker rm [コンテナ名 または コンテナID]

# イメージの削除(※このイメージを使っているコンテナがないこと)
docker rmi [イメージ名 または イメージID]

# 強制削除する場合は -f オプションを追加します

Docker Composeで管理を簡略化する

ここまでの手順は、「Docker Compose」というツールを使うと、さらに便利になります。Docker Composeは、複数のコンテナ構成や設定を.ymlファイルで管理できるツールです。

docker-compose.ymlを作成する

先ほどのDockerfileと同じディレクトリに「docker-compose.yml」ファイルを作成し、docker run で実行していた内容を専用の書式で記述します。

/dir-sample(任意のディレクトリ)
 Dockerfile
 index.php(確認用サンプルファイル)
 docker-compose.yml

▼docker-compose.yml の記述例

version: '3'
services:
  php_apache:
    build: ./
    image: php_apache-image-dcyml
    container_name: php_apache-dcyml
    ports:
      - "13000:80"
    volumes:
      - /Users/xxx/webDevelop/_docker-test:/var/www/html

書き終えたら、ターミナルでdocker-compose.ymlのあるディレクトリへ移動し、以下のコマンドを実行します。

# イメージのビルド
docker-compose build

# コンテナの起動(-d はバックグラウンド実行)
docker-compose up -d

http://localhost:13000/ にアクセスし、サイトが表示されれば成功です。

Docker Composeの停止・削除コマンド

# 停止
docker-compose stop

# 削除(コンテナのみ)
docker-compose rm -f

# 停止、削除、ネットワーク削除をすべて実行
docker-compose down

# イメージも合わせて削除する場合
docker-compose down --rmi all

b) MAMP + WordPress環境をDockerで再現する

次に、WordPress環境をDockerで再現します。WordPressはWebサーバー(Apacheなど)とデータベース(MySQLなど)が必要なため、Docker Composeを使って2つのコンテナを連携させるのが一般的です。

📌 重要: DBはDockerコンテナ内に存在します
以下で構築するMySQLデータベースはDockerコンテナ内のみに存在し、あなたのMac上には直接インストールされません。コンテナを削除するとDBも消えますが、docker-compose.ymlに記載される volumes: 設定(例: ./.db_data:/var/lib/mysql)によって、ホストマシン上の.db_dataディレクトリにデータが永続化されるため、コンテナを再起動してもデータは保持されます。

任意のディレクトリに移動し、「docker-compose.yml」ファイルと「.env」ファイル(環境変数を格納するファイル)を用意します。

▼docker-compose.yml ファイル

version: "3.3"
services:
  db:
    image: mysql:5.7
    container_name: wp_db_sample
    volumes:
      - ./.db_data:/var/lib/mysql
    ports:
      - "3308:3306"
    restart: always
    env_file: .env
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wp_wordpress_sample
    volumes:
      - /Users/xxx/webDevelop/wp-sample:/var/www/html
    ports:
      - "38005:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
    env_file: .env
volumes:
  db_data: {}

▼.envファイル

MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress

WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
WORDPRESS_DB_NAME=wordpress

.envファイルを使わない場合は、docker-compose.ymlenv_file: .envの箇所を削除し、environment: の配下に.envファイルの内容を直接記述します。

ファイルを保存したら、ターミナルでそのディレクトリに移動し、以下のコマンドでビルドと起動を一度に行います。

docker-compose up --build -d

http://localhost:38005 にアクセスし、WordPressの初期設定画面が表示されれば成功です。

既存データベース(DB)のインポート方法

既存サイトのDBをインポートしたい場合、新しい環境はまだ空っぽです。以下のいずれかの方法でDBデータをインポートする必要があります。

1. Docker経由でMySQLにアクセスする方法
  • docker ps -a でMySQLコンテナの名前(例: wp_db_sample)を確認します。
  • ターミナルで「docker exec -it wp_db_sample bash」を実行し、MySQLコンテナ内に入ります。
  • コンテナ内でMySQLコマンドを使い、DBをインポートします。
2. Sequel ProなどのGUIツールでアクセスする方法

DB管理ツール(Sequel ProやTablePlusなど)から接続することも可能です。

  • ホスト: 127.0.0.1
  • ユーザー、パスワード、DB名: .envファイルに記述したもの(今回はすべて wordpress
  • ポート: docker-compose.ymldb サービスの ports: で指定したローカル側(左側)のポート(今回は 3308

c) Vagrantを使用した開発環境の代替

Vagrantで構築していたような、特定のミドルウェアやライブラリを必要とする複雑な環境についても、Dockerは有効な選択肢です。

Vagrant環境と同様に、プロジェクト固有のdocker-compose.ymlをGitなどで共有すれば、メンバーは「git clone」し、「docker-compose up --build -d」を実行するだけで、同じ環境を即座に立ち上げることができます。

MAMP、Vagrantとの比較・制作環境への適合性

MAMP環境との比較

「どちらも有効だが、手軽さならMAMPに軍配が上がるケースもある」という印象です。

MAMPは一度設定してしまえば、アプリを起動するだけで複数のローカルサイトにアクセスできます。一方、Docker(特にDocker Compose)はプロジェクトごとに「docker-compose up」を実行する手間が発生します。

ただし、DockerはプロジェクトごとにPHPやMySQLのバージョンを完全に分離できるため、「案件AはPHP 7.4、案件BはPHP 8.1」といった環境の違いをMAMPよりクリーンに管理できる強力なメリットがあります。

また、ディスク容量の圧迫という観点でも注意が必要です。MAMPは複数のプロジェクトで共有する一つのPHP・MySQLをインストールするため、ディスク使用量は比較的少なく抑えられます。一方、Dockerは環境ごとにイメージやコンテナが作成されるため、プロジェクト数が増えるとディスク容量を消費しやすくなります。一般的には、プロジェクト1つあたり500MB~2GB程度のストレージが消費されるため、10個のプロジェクトを並行して開発している場合には、5GB~20GB程度のディスク容量が必要になることもあります。ローカルマシンのストレージが限られている場合(特にSSD容量が256GB以下のMacBook)は、この点を考慮する必要があります。

Vagrant環境との比較

「Dockerの方が起動が速く軽量だが、環境の安定性や再現性はVagrantが有利な場合もあった(要継続検証)」という印象です。

VagrantもDockerも「環境を立ち上げる」という手間は同じですが、仮想マシン全体を起動するVagrantに比べ、Dockerは起動が非常に高速です。

環境構築の容易さについては、Dockerはコマンド一つで実行できる手軽さがあります。しかし、DB連携などが複雑になってくると、Vagrantの方が(慣れている分)安定して構築できるケースもあるかもしれません。

とはいえ、新規に環境構築が必要な案件については、軽量さとポータビリティ(環境の持ち運びやすさ)の観点から、積極的にDockerを試していく価値は非常に高いと言えるでしょう。

よくある質問(FAQ)

Q1. Dockerを学ぶメリットは何ですか?

A1. 最大のメリットは「環境構築の再現性」と「軽量さ」です。Dockerfileやdocker-compose.ymlファイルさえあれば、誰でも(OSの違いをある程度吸収しつつ)同じ開発環境を素早く構築できます。これにより「自分のPCでは動いたのに、他の人のPCや本番サーバーでは動かない」といった問題を大幅に減らすことができます。

Q2. MAMPとDocker、初心者はどちらから始めるべきですか?

A2. もし「まずは手軽にPHPやWordPressを動かしてみたい」というレベルであれば、設定がシンプルなMAMPから始めるのが分かりやすいかもしれません。一方で、「将来的にチーム開発やさまざまなバージョンの環境を扱うWeb制作者」を目指すのであれば、少し学習コストはかかりますが、Dockerを早めに学んでおくことを強くおすすめします。

Q3. 既存のMAMPやVagrantの環境を、そのままDockerに移行できますか?

A3. 「そのまま」移行することはできません。Dockerで同じ環境を「再現する」ための設定(Dockerfileやdocker-compose.ymlの作成)が別途必要になります。この記事で紹介したように、使用しているPHPのバージョン、必要なライブラリ、WordPressのファイル、データベースの情報を整理し、Docker用の設定ファイルに落とし込んでいく作業が発生します。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら