LoginSignup
0
0

More than 3 years have passed since last update.

Ubuntu上Docker(docker-compose)を使ってmysql8,https対応、redis使用のngnix+Laravel環境構築

Last updated at Posted at 2020-08-01

今まではLaravelのローカル開発環境はVagrant+VirtualBox+Homesteadを使ったが,Vagrant,VirtualBox,OSのバージョンアップにより、数時間をかけて環境を作り直したことがあります。今回は、Dockerを使ったので、下記の記事を参考しながら、環境構築をしてみました。
docker-composeでLaravelの開発環境を整える方法とその解説
とてもわかり易い記事ですが、開発に必要なhttps対応や、Mysql8とRedisなど必要な設定対応がなかったので、メモとしてを整理しました。
★ベストプラクティスかどうか分からないので、ご指摘ください。

読む対象:
* docker + laravel 開発者で、 HomesteadからDockerへ移行したい方
* nginxのhttps対応、Mysql8の設定、redisの設定、何れが必要な方

ホストマシンOS
Ubuntu18.0.4

全体目次:
手順
初期のフォルダー構造
docker-compose.yaml設定
phpコンテナのDockerfile設定
nginxのhttps対応
project source codeダウンロード
mysql8対応設定
redisコンテナと設定
動作確認

手順

初期のフォルダー構造

まず/home/user/の下に初期のフォルダー構造を作成します。

├── docker
│   └── web
│       └── default.conf
|   └── php
|       └── Dockfile
|   └── mysql
├── docker-compose.yml
└── project

※ projectフォルダーはproject(laravel)source code を入れるところ
ファイル~/docker/docker-compose.yaml, ~/docker/web/default.conf, ~/php/Dockfileの設定は下記になります。

docker-compose.yaml設定

~/docker/docker-compose.yaml設定
version: '3'
services:
  web:
    image: nginx:1.18.0
    container_name: web
    ports:
      - 443:443
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./server.crt:/etc/nginx/server.crt
      - ./server.key:/etc/nginx/server.key
      - .:/var/www/html
  app:
    build: ./php
    container_name: app
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
  mysql:
    build: ./mysql

 image: mysql:8
    container_name: mysql
    environment:
      MYSQL_DATABASE: databasename
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/mysql-confd:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql

  redis:
    image: redis:3.2.12-alpine # 以前はlatestだった
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: unless-stopped
volumes:
        mysql-data:

nginxのhttps対応

(1)~/docker/web/default.conf設定

default.conf設定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ;
    server_name localhost;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;

    root  /var/www/html/project;
    index index.php index.html index.htm;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        try_files $uri $uri/ /index.php$is_args$args; }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

(2)sslキーを作成
自己署名証明書でhttpsアクセスができるコンテナを作るためにsslキーが必要になります。

$cd ~/docker
$openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365

を実行したら、server.keyとserver.crtを~/dockerの下に確認できました。

phpコンテナのDockerfile設定]

FROM php:7.2-fpm

# install 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 \
git \
zip \
unzip \
vim

RUN docker-php-ext-install pdo_mysql

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install mysqli pdo pdo_pgsql

RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get update \
    && apt-get install -y nodejs

#Add user for laravel application
RUN groupadd -g 1000 teiri && \
    useradd -u 1000 -ms /bin/bash -g teiri teiri


# Install Node
RUN apt-get update &&\
    apt-get install -y --no-install-recommends gnupg &&\
    curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
    apt-get update &&\
    apt-get install -y --no-install-recommends nodejs &&\
    npm config set registry https://registry.npm.taobao.org --global &&\
    npm install --global gulp-cli

project source codeダウンロード

※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成

$mkdir ~/docker/projectname
$cd ~/docker/projectname

git初期化

$cd ~/docker
$git init

laravelプロジェクトのソースコード取得

$git remote add origin 追加したいリポジトリ
$git clone リポジトリのURL

~/docker/projectnameのフォルダーが作成されることが確認できます。
laravelインストール

composer installでcomposer.jsonに定義されているlaravel framesなど必要なパッケージをインストールします。

$composer install

※Homesteadの環境よりずっと速い!

mysql8対応設定

.envファイルを設定

必要があれば、DBの設定をdocker-compose.yamlと一致するようにします
例:

DB_HOST="mysql"
DB_PORT=3306
DB_DATABASE="databasename"
DB_USERNAME="homestead"
DB_PASSWORD="secret"

MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルトなので、
もしmysql 5.* からmysql8に変更した場合は認証方式の設定を変更する必要があります。

(1)mysqlのコンテナに入る

コンテナを起動

$docker-composer up -d

コンテナ一覧を確認する
docker-compose ps
image.png

$docker exec -it {mysql_container_name} bash

(2)rootユーザとしてログイン,passwordはdocker-compose.yamlの中の設定一致する必要があります。

$mysql -uroot -p

認証方式を変更

 ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

注)↑のコマンドに使うユーザとパスワードはdocker-compose.yamlに設定された内容が一致する必要があります。

image.png

変更を反映するために、コンテナ再起動

$docker-compose down
$docker-compose up -d

プロジェクトのデータベーステーブル作成
appコンテナに入る

docker exec -it --user {username} app bash

cd project フォルダー

cd /var/www/html/project
$ php artisan migrate

必要なSeed data作成

$ php artisan db:seed

redisコンテナと設定

redisのIPアドレス確認
docker inspect redis | grep "IPAddress"
image.png

.envでRedis設定

REDIS_HOST="172.23.0.2"
REDIS_PASSWORD="null"
REDIS_PORT="6379"

動作確認

最後にブラウザで確認サイト確認
https://localhost

0
0
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
0
0