LoginSignup
34
42

More than 5 years have passed since last update.

DockerでLaravel+PHP5.6+MySQL5.6+Apacheの環境構築

Last updated at Posted at 2017-01-17

環境情報

ホスト

  • macOS Sierra
  • Docker for Mac

目指す構成

  • Apache
  • MySQL(Ver.5.6)
  • PHP(Ver.5.6)

ホスト側には、phpがなくても動作させられるようにする。

コンテナの構成

種類 docker hub コンテナ、タグ
PHP https://hub.docker.com/_/php/ php:5.6-apache
MySQL https://hub.docker.com/_/mysql/ mysql:5.6

※MySQL用のデータコンテナは、MySQLと同じものをベースに利用する。

最終的なファイル構成

project
├── Dockerfile
│     config
│     └── apache2
│         └── sites-available
│             ├── 000-default.conf
│             └── default-ssl.conf
├── docker-compose.yml
└── laravel-app
     └── laravelのアプリを配置

※MySQLコンテナのように、起動時に、Apacheの設定を変更する方法は調査できず。

Apache設定ファイルを取得・変更

% mkdir -p config/apache2/sites-available
% cd config/apache2/sites-available
% docker run --name php-apache-tmp php:5.6-apache true
% docker cp php-apache-tmp:/etc/apache2/sites-available/000-default.conf .
% vi 000-default.conf
差分は以下。
-  DocumentRoot /var/www/html
+  DocumentRoot /var/www/html/public

% docker cp php-apache-tmp:/etc/apache2/sites-available/default-ssl.conf .
% vi default-ssl.conf
差分は以下。
-    DocumentRoot /var/www/html
+    DocumentRoot /var/www/html/public

% docker rm php-apache-tmp

Dockerfileの作成

Dockerfile
FROM php:5.6-apache

# PHPのインストール
RUN apt-get update \
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
        openssl libssl-dev \
        libxml2-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql mbstring xml tokenizer zip \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

# apacheのrewriteを有効にする
RUN cd /etc/apache2/mods-enabled \
    && ln -s ../mods-available/rewrite.load

# composerのインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get install -y git && composer global require "laravel/installer=~1.1"

WORKDIR /var/www/html

docker-compose.ymlの作成

docker-compose.yml
laravel:
  container_name: laravel
  build: .
  ports:
   - "80:80"
  environment:
    # bargeでは、/usr/local/binも追加しておかないと起動できない。
    PATH: ${PATH}:/usr/local/bin:/root/.composer/vendor/bin
  volumes:
    - ./laravel-app:/var/www/html
    - ./config/apache2/sites-available:/etc/apache2/sites-available
  links:
    - laravel-db

laravel-db:
  image: mysql:5.6
  container_name: laravel-mysql5.6
  command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --init-connect="SET NAMES utf8" --innodb_file_per_table=1 --innodb_file_format=BARRACUDA
  environment:
    MYSQL_ROOT_PASSWORD: rootpassword
    MYSQL_DATABASE: laravel
    MYSQL_USER: local
    MYSQL_PASSWORD: password
  ports:
    - "13306:3306"
  volumes_from:
    - laravel-dbdata

laravel-dbdata:
  image: mysql:5.6
  container_name: laravel-mysql5.6-dbdata
  command: echo "Data-only container for laravel MySQL5.6"

参考

上記docker-compose.ymlをdockerコマンドにすると下記になる。

# MySQL用データボリュームコンテナの起動
% docker run --name laravel-mysql5.6-dbdata mysql:5.6 echo "Data-only container for mysql5.6"

# MySQLの起動
% docker run -d --name laravel-mysql5.6 -e "MYSQL_ROOT_PASSWORD=rootpassword" -e "MYSQL_DATABASE=laravel" -e "MYSQL_USER=local" -e "MYSQL_PASSWORD=password" -p 13306:3306 --volumes-from laravel-mysql5.6-dbdata mysql:5.6 --character-set-server=utf8 --collation-server=utf8_general_ci --init-connect="SET NAMES utf8" --innodb_file_per_table=1 --innodb_file_format=BARRACUDA

# LaravelAppサーバの起動
% docker run -d --name laravel -e "PATH=${PATH}:/root/.composer/vendor/bin" -p 80:80 --link laravel-mysql5.6:laravel-mysql5.6 -v "$(pwd)"/laravel-app:/var/www/html -v "$(pwd)"/config/apache2/sites-available:/etc/apache2/sites-available laravel_laravel
# もしくは下記
% docker run -d --name laravel -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.composer/vendor/bin" -p 80:80 --link laravel-mysql5.6:laravel-mysql5.6 -v "$(pwd)"/laravel-app:/var/www/html -v "$(pwd)"/config/apache2/sites-available:/etc/apache2/sites-available laravel_laravel

buildして起動

% docker-compose build
% docker-compose up

Laravelプロジェクトの生成

% docker-compose run laravel laravel new sample-app
% mv sample-app laravel-app

下記URLにアクセスしてlaravelの画面が表示されるか確認する。

開発時によく使いそうなコマンド(メモ)

% docker-compose run laravel composer install
% docker-compose run laravel php artisan key:generate
% docker-compose run laravel php artisan migrate

MySQLの設定

% docker exec -it laravel env | grep MYSQL
<省略>
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_ENV_MYSQL_PASSWORD=password
MYSQL_ENV_MYSQL_USER=local
MYSQL_ENV_MYSQL_DATABASE=laravel
<省略>

% cp .env.sample .env
% vi .env
上記確認したMySQLの値を設定

その他メモ

コンテナのターミナルに入る。

  • 実行中のコンテナに入るには、execを使用する。
  • 未実行のコンテナに入るには、runを使用する。
% docker run --rm -it php:5.6-apache /bin/bash
% docker run --rm -it mysql:5.6 /bin/bash
% docker exec -it laravel /bin/bash
% docker exec -it laravel-mysql5.6 /bin/bash

どのコンテナにも紐付いていないvolumeの一覧を見る、又は削除する。

% docker volume ls -qf "dangling=true"
% docker volume ls -qf "dangling=true" | xargs docker volume rm
34
42
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
34
42