LoginSignup
6
7

More than 1 year has passed since last update.

【Docker】amazonlinux + nginx + php-fpm + mysql でLaravelの開発環境構築してみた。

Last updated at Posted at 2022-02-02

DockerでLaravelの開発環境を構築する際にめちゃちゃつまずいたので、
新人に同じ被害に遭ってほしく無いという思いからこの記事を書す^^

【目標】
・Docker-composeでLaravelの開発環境構築
・既存のLaravelプロジェクトの開発環境をDockerに乗り換える。

【ディレクトリ構成】

Larave_docker
 |__docker-compose.yml
 |_src
  |_LaravelプロジェクトをgitからCloneしてきたもの
 |_web
  |_Dockerfile
  |_nginx.conf
  |_php.ini
  |_www.conf

🔽制作されるコンテナは2つ🔽

①DB(mysql)コンテナ
②Nginx+phpコンテナ

順序はこう

①amazonlinuxサーバーでLaravelが動くようにする(Dockerfile作成)
②docker-compose.ymlを作成
③docker-composeで複数コンテナ同時立ち上げ
④mysqlにデーターベースを作成
⑤Laravelの.envファイル編集

①amazonlinuxサーバーでLaravelが動くようにする(Dockerfile作成)

FROM amazonlinux:2

#nginxとphpをインストール
RUN yum -y update
RUN amazon-linux-extras install -y nginx1.12 php7.4

#パッケージをインストール
RUN yum install -y php-pecl-zip php-mbstring php-xml php-xml php-curl php-gd php-bcmatch vim zip unzip curl less procps
RUN yum -y update

#Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --version=1.10.23
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

#gitインストール
RUN yum install -y git

#php.iniのmemory_limitを無制限に変更
COPY  ./php.ini /etc/php.ini

#nginxのデフォルトrootの変更
COPY ./nginx.conf /etc/nginx/nginx.conf

#php-fpmのuser groupとかの変更
COPY ./www.conf /etc/php-fpm.d/www.conf

#node.jsとnpmをインストール 
RUN curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
RUN yum install -y nodejs

変更点だけここに記載します。

php.ini

;memory_limit = 128M
memory_limit = -1  

nginx.conf

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/laravelプロジェクトディレクトリ名/public;
        client_max_body_size 30M;

        # Load configuration files for the default server block.
        # include /etc/nginx/default.d/*.conf;

        location ~* .(html|css|js|jpe?g|png|gif|svg|mpg|flv|swf)$ {
                expires 10d;
                access_log off;
                break;
        }
        location / {
                index index.php index.htm index.html;
                try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
                fastcgi_pass   unix:/var/run/php-fpm/www.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/laravelプロジェクトディレクトリ名/public$fastcgi_script_name;
                include        fastcgi_params;
        }

www。conf

;user = apache
user = nginx

;group = apache
group = nginx

これでLaravelは動く。
Laravel uiなども使える。

②docker-compose.ymlを作成

version: '3'
services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    container_name: laravel_db
    environment:
      MYSQL_ROOT_PASSWORD: root
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./src/db/mysql_data:/var/lib/mysql
    ports:
    - 3306:3306
  web:
    container_name: laravel_docker
    build: ./web/ →webディレクトリ内のDockerfileからコンテナを作成
    ports:
      - "80:80"
    volumes:
      - ./src/LaravelプロジェクトをgitからCloneしてきたもの:/var/www/Laravelプロジェクト名
    working_dir: /var/www/Laravelプロジェクト
    command: /bin/sh -c "chmod 777 -R ./storage && composer install && npm install && npm run dev && cp .env.example .env && php artisan key:generate && php-fpm && nginx -g 'daemon off;'"
    depends_on:
      - db

③docker-composeで複数コンテナ同時立ち上げ

docker-compose build up

④mysqlにデーターベースを作成

③で制作されたmysqlコンテナに入って作業します。

docker exec -it laravel_db bash

#mysqlのbashで以下を入力
mysql -u root -p mysql

Enter password:パスワードrootを入力(docker-compose.ymlで設定したパスワード)

mysql> CREATE database laravel_db(データーベース名);
mysql> SHOW databases;→制作されたか確認

⑤Laravelの.envファイル編集

DB_CONNECTION=mysql
DB_HOST=laravel_db(mysqlコンテナ名)
DB_PORT=3306
DB_DATABASE=laravel_db(④で制作したDB名)
DB_USERNAME=root →ユーザー制作してない場合はrootでアクセス
DB_PASSWORD=root →ユーザー制作してない場合はrootパスワードでアクセス
php artisan migrate 

これでテーブルが作成されればLaravelとDBの接続成功

最後に

筆者はDB接続をRDSにしたかったのですが、
うまく接続ができなかったのでこの方法を用いました。
 
EC2→RDSとEC2を踏み台にすれば接続できそうなのですが、工数かかると思って今回はこの簡単な方法にしました😄
https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4

AWSポートフォワーディング SSH Mysql などで記事出てくると、、、

※RDSのセキュリティグループのインバウンドを全ipから許可、mysqlのユーザーのアクセスip制限をどこからでもする、RDSのパブリックアクセスを許可する
でアクセスもできます。

そもそもRDSに接続しようとすると、Nginxの500エラーがでてきて、このエラーがDBにあると判断するまでに2日くらいかかってマジで時間浪費しました。。
このやろう!!

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7