icon
Docker + Laravelの開発環境を構築する

参考

開発環境

  • windows 11
  • Docker for Desktop

手順

Docker for Desktopをインストール


ツリー構造を作成

<ProjectFolder>
└ docker-config
  ├ mysql
  │ └ my.conf
  ├ nginx
  │ ├ Dockerfile
  │ └ default.conf
  └ php
    ├ Dockerfile
    └ php.ini

Dockerfile等の設定を記述する

# MySQLサーバーへの設定
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# タイムゾーン
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# mysql8.0用に認証変更
default-authentication-plugin = mysql_native_password


# エラーログの設定
# log-error = /var/log/mysql/mysql-error.log

# スロークエリログ
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# 実行ログ
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

# mysqlオプションの設定
[mysql]
default-character-set = utf8mb4

# mysqlクライアントツールの設定
[client]
default-character-set = utf8mb4

server {
index index.php index.html;
# ルートパスを設定
root /var/www/laravel/public;

location / {
# ルートパスを設定
root /var/www/laravel/public;
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass web:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

FROM alpine:3.6

# nginxのインストール
RUN apk update && \
apk add --no-cache nginx
RUN mkdir -p /run/nginx
# RUN apk add openssl
# ADD ssl /etc/nginx/ssl

# フォアグラウンド
CMD nginx -g "daemon off;"

#バージョン指定
FROM php:7.2-fpm
# php.ini を /usr/local/etc/php/ にコピー
COPY php.ini /usr/local/etc/php/

# Composer をインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# パッケージ群をインストール
RUN apt-get update \
&& apt-get install -y \
gcc \
make \
libpng-dev \
git \
unzip \
vim \
libmcrypt-dev \
mariadb-client \
curl \
gnupg \
openssl \
zlib1g-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring zip

# NPM・Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash
RUN apt-get install -y nodejs

# xdebug をインストールxdebug
RUN pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug

# カレントディレクトリを /var/www に設定
WORKDIR /var/www
ADD . /var/www
RUN chown -R www-data:www-data /var/www

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[xdebug]
xdebug.remote_enable = On
xdebug.remote_port = 9001
xdebug.remote_autostart = On
xdebug.remote_host = 192.168.99.1
xdebug.profiler_output_dir = "/tmp"
xdebug.max_nesting_level= 1000
xdebug.idekey = "PHPSTORM"

version: '3' 

services:

web:
build: ./docker-config/php
container_name: app_php
volumes:
- ./laravel:/var/www/laravel
working_dir: /var/www/laravel
depends_on:
- mysql

nginx:
image: nginx
container_name: app_nginx
build: ./docker-config/nginx
ports:
- "81:80"
volumes:
- .:/var/www
- ./docker-config/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- web

mysql:
image: mysql:8.0
container_name: app_db
ports:
- 3306:3306
environment:
MYSQL_DATABASE: development
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: m_user
MYSQL_PASSWORD: m_user
TZ: 'Asia/Tokyo'

volumes:
- ./docker-config/mysql/data:/var/lib/mysql
- ./docker-config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf

depends_on:
- mysql-volume

mysql-volume:
image: busybox
volumes:
- ./docker-config/mysql/data:/var/lib/mysql

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: app_pma
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=root
links:
- mysql
ports:
- 8080:80
volumes:
- /sessions

Docker Composeでコンテナを立ち上げる

docker-compose up -d --build

オプション説明

コマンド説明
docker-composeDocker Compose のバイナリです。このコマンドを使い Docker コンテナ上の複数のサービスを管理します。
upコンテナの作成と起動
-dデタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示
--buildコンテナを開始前にイメージを構築する

トラブルシューティング

An attempt was made to access a socket in a way forbidden by its access permissions
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:80 -> 0.0.0.0:0: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
こんなエラーが出た場合、ポートが別のプロセスによって使われている可能性が高い為、そのプロセスをキルするか、別ポート(httpなら 80 ⇒ 81・82 )に変更することをお勧めする

Laravelプロジェクトをインストール

コンテナのコンソールに接続

docker exec -it app_php bash

Laravelプロジェクトをインストール

composer create-project "laravel/laravel"