環境情報
ホスト
- 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