docker-composeでcentosベースのlaravel開発環境を構築してみる

f:id:miya15:20180909171239p:plain

前提条件

  • ホスト側でdockerとdocker-composeが使えること
  • ゲスト側OSはcentos7
  • フレームワークはlaravel5.6
  • データベースはmysql5.7

ホスト側ファイル構成

/laraveldev
 /web
  /Dockerfile
 /docker-compose.yml

web用コンテナイメージの準備

$ mkdir laraveldev
$ mkdir laraveldev/web
$ vim laraveldev/web/Dockerfile
FROM centos:7

# apacheとphp7.2のインストール
RUN yum -y update
RUN yum -y install epel-release unzip vim git
RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum -y --enablerepo=remi-php72 install php php-devel php-mbstring php-mysql php-gd php-pdo php-pear php-process php-soap php-xml php-bcmath php-pecl-zip
RUN yum -y install httpd-devel

# composerのインストール
WORKDIR /tmp
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
RUN useradd developer
RUN groupadd web
RUN gpasswd -a apache web
RUN gpasswd -a developer web
RUN chown -R apache:web /var/www
RUN chmod g+ws -R /var/www

# composerでlaravelのインストール
USER developer
RUN composer global require "laravel/installer"
RUN echo 'PATH=$PATH:$HOME/.composer/vendor/bin' >> ~/.bashrc
RUN source ~/.bash_profile

# プロジェクトの作成
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel mysite "5.6.*"

USER root
RUN chmod g+ws -R /var/www/mysite

# apacheの設定変更
RUN sed -i -e 's#DocumentRoot "/var/www/html"#DocumentRoot "/var/www/mysite/public"#' /etc/httpd/conf/httpd.conf
RUN echo $'\n\
<Directory "/var/www/mysite/public">\n\
    AllowOverride All\n\
    Require all granted\n\
</Directory>\n\
' >> /etc/httpd/conf/httpd.conf
RUN systemctl enable httpd

# データベースの設定
RUN sed -i -e 's/DB_HOST=127.0.0.1/DB_HOST=db/' \
-e 's/DB_DATABASE=homestead/DB_DATABASE=dbmysite/' \
-e 's/DB_USERNAME=homestead/DB_USERNAME=umysite/' \
-e 's/DB_PASSWORD=secret/DB_PASSWORD=password/' \
/var/www/mysite/.env
RUN sed -i -e "s/env('DB_HOST', '127.0.0.1')/env('DB_HOST', 'db')/" \
-e "s/env('DB_DATABASE', 'forge')/env('DB_DATABASE', 'dbmysite')/" \
-e "s/env('DB_USERNAME', 'forge')/env('DB_USERNAME', 'umysite')/" \
-e "s/env('DB_PASSWORD', '')/env('DB_PASSWORD', 'password')/" \
/var/www/mysite/config/database.php

CMD ["/sbin/init"]

docker-compose化

$ vim laraveldev/docker-compose.yml
version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - 3306:3306
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: dbmysite
      MYSQL_USER: umysite
      MYSQL_PASSWORD: password

  web:
    depends_on:
      - db
    build: ./web
    volumes:
      - web_data:/var/www/mysite
    ports:
      - 80:80
    restart: always

volumes:
  db_data:
  web_data:

ビルドと起動

$ cd laraveldev
$ docker-compose build
$ docker-compose up -d

おまけ

  • コンテナに入る
    • $ docker exec -it laraveldev_web_1 /bin/bash
  • mysiteのホスト側ディレクト
    • $ ls /var/lib/docker/volumes/laraveldev_web_data/_data/
  • dbのホスト側ディレクト
    • $ ls /var/lib/docker/volumes/laraveldev_db_data/_data/