初学者向けのものです。初学者がわからなくなるコマンド叩いていたらローカル側なのかコンテナ側なのかわからなくなってグチャグチャにならないように、ローカル側でのみコマンド実行すれば良いように構築しています。
前提
- 本番環境向けの最適化された設定ではないので、Dockerイメージをそのまま本番利用はしないように注意ください
- Macユーザ向けです
- 以下、インストール済みであること
- nginx,php-fpm,composer,mysqlの環境を作ります
インストール
ホームディレクトリに移動して、プロジェクトフォルダを作成
projectsフォルダが無いことを確認してください
HogeApp
は自由に変更して大丈夫です
$ cd ~
$ mkdir -p projects/HogeApp/{docker,src}
こんなフォルダができる
projects
└── HogeApp
├── docker
└── src
docker用ディレクトリを作成
$ cd ~/projects/HogeApp/docker
$ mkdir -p {nginx/conf.d,php-fpm,mysql-data}
Nginxの設定
Dockerfile(Nginx)
$ vim nginx/Dockerfile
以下を保存
nginx/Dockerfile
FROM nginx:1.15.9-alpine
EXPOSE 80
RUN apk update && apk upgrade \
&& rm -r /var/cache/apk/*
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY ./conf.d/php-upstream.conf /etc/nginx/conf.d/php-upstream.conf
nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format json_combined escape=json '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log /var/log/nginx/access.log json_combined;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
server_tokens off;
server_names_hash_max_size 512;
include /etc/nginx/conf.d/*.conf;
}
nginx/conf.d/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/public;
index index.php index.html index.htm;
charset utf-8;
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|svg|mp3)$ {
try_files $uri =404;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HOME /var/www;
include fastcgi_params;
}
}
nginx/conf.d/php-upstream.conf
upstream php-upstream {
server php-fpm:9000;
}
php-fpm/Dockerfile
FROM php:7.3-fpm-alpine
# Install PHP extensions
RUN apk update && apk upgrade --update && apk --no-cache add \
git \
vim less \
icu-dev \
autoconf \
make \
g++ \
gcc \
mysql-client \
&& rm -r /var/cache/apk/*
RUN docker-php-ext-install -j$(nproc) \
iconv \
intl \
mbstring \
pdo_mysql
COPY ./php.ini /usr/local/etc/php/conf.d/my-php.ini
COPY ./php-fpm.conf /usr/local/etc/php-fpm.d/my-php-fpm.conf
php-fpm/php.ini
; timezone
date.timezone = Asia/Tokyo
; error reporing
log_errors = On
error_log = /dev/stderr
display_errors = Off
; mbstring
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
php-fpm/php-fpm.conf
[www]
pm.status_path = /phpfpm_status
docker-composeの設定
$ cd ~/projects/HogeApp
$ vim docker-compose.yml
以下を保存
docker-compose.yml
version: "3"
services:
nginx:
build: ./docker/nginx
container_name: "nginx"
ports:
- "8080:80"
restart: always
volumes:
- ./src:/var/www
depends_on:
- php-fpm
php-fpm:
build: ./docker/php-fpm
container_name: "php-fpm"
restart: always
volumes:
- ./src:/var/www
working_dir: /var/www
links:
- mysql
depends_on:
- mysql
composer:
image: composer:1.8
container_name: "composer"
volumes:
- ./src:/var/www
working_dir: /var/www
mysql:
image: mysql:5.7
container_name: "mysql"
ports:
- 33306:3306
restart: always
volumes:
- ./docker/mysql-data:/var/lib/mysql
environment:
MYSQL_DATABASE: hoge-db
MYSQL_USER: hoge-user
MYSQL_PASSWORD: hoge-password
MYSQL_ROOT_PASSWORD: root
TZ: "Asia/Tokyo"
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
以下の環境変数部分はアプリに合わせて変更してください
environment:
MYSQL_DATABASE: hoge-db
MYSQL_USER: hoge-user
MYSQL_PASSWORD: hoge-password
MYSQL_ROOT_PASSWORD: root
ここまでの作成ファイルたちとフォルダ構成
projects
└── HogeApp
├── docker
│ ├── mysql-data
│ ├── nginx
│ │ ├── Dockerfile
│ │ ├── conf.d
│ │ │ ├── default.conf
│ │ │ └── php-upstream.conf
│ │ └── nginx.conf
│ └── php-fpm
│ ├── Dockerfile
│ ├── php-fpm.conf
│ └── php.ini
├── docker-compose.yml
└── src
コンテナ起動
$ cd ~/projects/HogeApp
$ docker-compose up -d
ズラズラっとコマンドが流れて最後にこれが出ればOK
Creating composer ... done
Creating mysql ... done
Creating php-fpm ... done
Creating nginx ... done
念の為、起動確認
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------
composer /bin/sh /docker-entrypoint ... Exit 0
mysql docker-entrypoint.sh mysql ... Up 0.0.0.0:33306->3306/tcp, 33060/tcp
nginx nginx -g daemon off; Up 0.0.0.0:8080->80/tcp
php-fpm docker-php-entrypoint php-fpm Up 9000/tcp
この時点では、http://localhost:8080/にアクセスしても
File not found.
となっているはず。
Laravelインストール
$ cd ~/projects/HogeApp
$ docker-compose run composer global require laravel/installer
$ docker-compose run composer create-project --prefer-dist laravel/laravel .
まぁまぁ時間かかるので、待ちます・・・
おわったら、srcフォルダにlaravelのファイル郡ができています。
もし以下エラーが出たら、別のネットワーク(テザリングとか、会社とかスタバとか)で試してください。
※この記事を見てもらう想定の「某学校」の人たちは絶対エラーなります。
[Composer\Downloader\TransportException]
The "https://repo.packagist.org/packages.json" file could not be downloaded: failed to open stream: Network unreachable
ディレクトリのパーミッション変更
$ chmod -R a+w src/storage/*
確認
http://localhost:8080/にアクセスすると
Laravelの設定
.env
ファイルをいじって、設定していきます。
$ vim src/.env
src/.env
- APP_NAME=Laravel
+ APP_NAME=ご自身のアプリの名称に変更
- APP_URL=http://localhost
+ APP_URL=http://localhost:8080
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
- DB_DATABASE=homestead
- DB_USERNAME=homestead
- DB_PASSWORD=secret
+ DB_DATABASE=hoge-db # ← docker-compose.ymlのenvironmentで設定したやつ
+ DB_USERNAME=hoge-user
+ DB_PASSWORD=hoge-password
最終的なフォルダ構成
projects
└── HogeApp
├── docker
│ ├── mysql-data
│ ├── nginx
│ │ ├── Dockerfile
│ │ ├── conf.d
│ │ │ ├── default.conf
│ │ │ └── php-upstream.conf
│ │ └── nginx.conf
│ └── php-fpm
│ ├── Dockerfile
│ ├── php-fpm.conf
│ └── php.ini
├── docker-compose.yml
└── src
├── app
├── ~省略~
└── vendor
あとはローカルのsrcフォルダ配下のLaravelを触っていけば基本的にOKです!
開発時の注意点
コマンドはdocker-compose.yml
ファイルがあるフォルダで実行してください
composerの実行
docker-compose run
をコマンドの頭につけてください
$ docker-compose run composer dump-autoload
artisanの実行
docker-compose exec php-fpm
をコマンドの頭につけてください
$ docker-compose exec php-fpm php artisan route:list
コンテナの起動/終了
$ docker-compose up -d
$ docker-compose down
コンテナにログインしたいとき
$ docker-compose exec php-fpm /bin/ash
最後に
ご自身のアプリに合わせて必要応じてRedisやphpmyadminなどをdockerイメージで追加して、拡張していってください。