🦥

WindowsでWSL2+Docker+PHP開発環境の構築

2022/12/10に公開

はじめに

参画当初、所属チームにMacユーザーしか居ない中でWindowsでの環境構築を行いました。
その際WSL2を使ってDocker環境を構築しましたが、WSL2を利用するのが初めてだったので、備忘録として残したい気持ちもあり、本記事を作成しました。
また、最新のWindows10とWindows11ではコマンド1つで簡単にWSL2をインストール出来ますが、裏側で何をしているかを勉強したかった事もあり、本記事ではWSL2の手動インストール方法を記載しています。

前提条件

  • 開発機はWindows11 PCとする
  • WSL2ベースのDocker Desktopを利用する
  • Dockerの操作はターミナルから行う

WSL2+Dockerのインストール

Windows Subsystem for Linux 2(WSL2)インストール

WSLを有効化する

  1. ツールバーの検索から「Windowsの機能の有効化または無効化」を検索して選択する
  2. 「Linux用Windowsサブシステム」「Windowsハイパーバイザープラットフォーム」「仮想マシンプラットフォーム」を有効にする
  3. インストール完了後「今すぐ再起動」をクリック

Linuxカーネル更新プログラムパッケージをダウンロードする

  1. 下のリンクから最新のパッケージをダウンロードします。
  1. ダウンロードした更新プログラムを実行します。

管理者特権のアクセス許可を求めるメッセージが表示されたら、「はい」を選択してインストールを実行します。

Linuxディストリビューションをインストール

  1. Microsoft Storeで「Ubuntu」を検索する
  2. 最新バージョンの「Ubuntu-22.04.1 LTS」をインストール

バージョンの記載がない「Ubuntu」は、LTSがリリースされる度に自動でアップデートされていくようなので、環境に影響がでる可能性があるため、現時点で最新のバージョンを選んでいます。

  1. Ubuntuを起動し、セットアップを完了する

ユーザー名/パスワードに任意の値を設定する
なお、ここで入力するユーザ名はWindowsのユーザ名とは関係ありません

既定の Linux ディストリビューションを設定する

Windows PowerSellで以下を実行

wsl -l -v

image

*Ubuntu-22.04にない場合は以下を実行する

wsl -s Ubuntu-22.04

nameserverの設定をする

Windows PowerShellで以下を実行し、DNSサーバーのIPアドレスをコピーする

ipconfig /all

WSL2のresolv.confをコピーしたアドレスに書き換える

vi /etc/resolv.conf
---------------------------
nameserver XXX.XXX.X.X
---------------------------

これでWSL2の設定は完了です。


Docker Desktop インストール

インストール:https://docs.docker.com/desktop/install/windows-install/

WSL2の設定を確認する

インストール完了後、Docker Desctopを起動したらSettingsで以下の設定を確認する

  1. 「Use the WSL 2 based engine」がチェックされていることを確認する

docker_wsl

  1. Dockerを使用するWSL2ディストリビューションを有効にする

image

これでWSL2+Dockerの環境は整いました。
次からDocker上にPHP環境を構築していきます。

DockerによるPHP環境構築

WSL2上に下記の構成でプロジェクトを作成し、それぞれのファイルを作成します。
また、今回DBにはPostgreSQLを使用しています。

フォルダ構成

├ docker-compose.yml
├ docker-php
│ └ app.Dockerfile
├ index.php
└ php.ini

Dockerfileの作成

FROM php:8.1.7-apache-bullseye

RUN apt-get update && \
    # pdo_pgsql を使うための依存
    apt-get install -y libpq-dev && \
    docker-php-ext-install pdo_pgsql

WORKDIR /var/www/html

docker-compose.ymlの作成

docker-compose.ymlにDB・PHPをそれぞれ動かすコンテナを作成する設定を記載します。

version: "3.8"
services:
  db:
    container_name: postgres
    image: postgres:13.6-bullseye
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C"
      TZ: Asia/Tokyo
    ports:
      - "5432:5432"
    volumes:
      - db-data:/var/lib/postgresql/data

  app:
    container_name: app
    build:
      dockerfile: docker-php/app.Dockerfile
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    working_dir: /app
    depends_on:
      - db

volumes:
  db-data:

index.phpの作成

動作確認のため phpinfo() を出力するように設定しておきます。

<?php
phpinfo();

コンテナの起動

以下のdockerコマンドを順番に実行します。

docker compose build
docker compose up -d

動作確認

http://localhost:8080/ にアクセス
phpinfoが出力されていればOK👌

コンテナからDBにアクセス

docker exec -it postgres bash
psql -h localhost -U postgres

DBに接続されればOK👌

これで環境構築は完了です!

おわりに

WSL2を利用するのは初めてでしたが、簡単にLinuxディストリビューションを起動することが出来ました。
また、以前Hyper-VベースのDockerを利用していた事がありますが、その時よりも動作が軽快に感じられます。
Dockerに関しては、環境構築が簡単にできる事やチーム開発で環境を共有しやすくするところにとてもメリットがあると思います。
WSL2+DockerでのPHP環境構築を勉強できてよかったと思いました。

BABYJOB テックブログ

Discussion