2022.08.22
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
はじめに
Docker勉強しないといけないなとは思いつつ、何から手をつけていいか分からない。
本を買ったり、調べたりしてみたものの結局よく分からない。
そんな状態からDBコンテナとPHP/Apacheコンテナを連携させて
ローカル開発環境を作れるようになるための必要最低限のことを書いていきます。
まずはこれらのイメージだけ持っておいてください
これから実際にDockerで開発環境を作るわけですが、お話のメインとなるのはDockerfileとdocker-compose.ymlの2ファイルになります。
DockerfileはDockerイメージの設計図のようなもので、Dockerfileからイメージを作ることをbuildすると言います。
ここでbuildしたイメージをもとにコンテナを生成、プロセスを起動することをrunと言います。
ここで重要なのはDockerfileからイメージが作られ、イメージからコンテナが作られることです。
また、docker-compose.ymlにはdocker composeコマンドの実行をするときの設定やコンテナの生成方法が記載されています。
docker-compose up
でdocker-compose.ymlに沿って複数のコンテナを全部起動し、
docker-compose down
でdocker-compose.ymlに沿って複数のコンテナ全部停止・破棄します。
ここで注意が必要です。docker-compose up
やdocker-compose down
は全部起動したり全部停止・破棄したりするだけですので、
起動中にdocker-compose.ymlを書き換えた場合、停止・破棄の段階で全部停止・破棄されなかったり、
誤って他のコンテナを削除してしまったりする恐れがあります。
実際にやってみる
こちらの記事を参考にさせていただきました。
Dockerで環境構築することを目的にできるだけ記述を少なくしました。
ディレクトリ構成
laravel_docker
├─┬ apache/
│ └── default.conf
├─┬ php/
│ └── Dockerfile
├── mysql/
├── src/
└── docker-compose.yml
まずはこのディレクトリ構成と同じようにファイルやディレクトリを作ってください。
Dockerfile
Dockerfileにこのように書きます。
FROM php:8.0-apache
RUN apt update \
&& apt install -y \
g++ \
libicu-dev \
libpq-dev \
libzip-dev \
libonig-dev \
zip \
zlib1g-dev \
&& docker-php-ext-install \
intl \
opcache \
pdo \
pdo_mysql \
mysqli
WORKDIR /var/www/laravel_docker
RUN a2enmod rewrite
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
FROM
でDockerHubからベースイメージをとってきます。
このイメージにさまざまなコマンドで変更を加えたものをDockerfileで定義することで、buildするイメージをカスタムできます。
続くRUN
ではDocker内でコマンドを実行します。コンテナに依存するライブラリやパッケージをインストールします。
ここではLaravelが依存するPHP拡張機能をインストールします。WORKDIR
でコンテナの作業ディレクトリを/var/www/laravel_docker
に移動します。
デフォルトでは/が設定されています。
次のRUN
でmod_rewriteというパッケージを有効化しています。
これによって、URLの書き換えやリダイレクトが可能になります。
最後にRUN
でComposer(PHPのパッケージ管理システム)をインストールします。
docker-comose.yml
次にdocker-compose.ymlにこのように書きます。
version: '3.8'
services:
database:
image: mysql:8
container_name: database
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel_docker
volumes:
- ./mysql:/var/lib/mysql
ports:
- '4306:3306'
php-apache:
container_name: php-apache
build:
context: ./php
ports:
- '8080:80'
volumes:
- ./src:/var/www/laravel_docker
- ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
depends_on:
- database
version
はスキーマバージョンを参照します。services
はサービスのリストを定義します。上に書いたものではdatebaseサービスとphp-apacheサービスが入っています。
サービス名はどのような名前でも良いです。 この名前は自動的にネットワークエイリアスとなります。
これらのサービスはdocker-compose up
でコンテナとして立ち上がります。
上のファイルではphp-apacheサービスとdatabaseサービスは異なる定義になっています。
databaseコンテナではimageを指定していますが、php-apacheコンテナではビルドコンテキストにDockerfileを指定しています。
database
image
はコンテナのビルド元をDockerに認識させます。
この場合、DockerHubからmysqlをダウンロードしてきます。
:の横の数字はタグというものでバージョンを表記するために利用されることが多いです。
今回データベースとしてMySQLを使用します。environment
には環境変数のリストを指定します。volumes
でコンピュータのディレクトリやファイルをコンテナのディレクトリやファイルにマウントできます。ports
はコンピュータのポートをコンテナのポートにマウントします。
マウントする場合、{コンピュータ側}:{コンテナ側}
の形で指定します。
今回の場合、コンピュータ側の./mysqlはDBコンテナの/var/lib/mysqlにマウントされ、
コンピュータの4306番ポートはDBコンテナの3306番ポートにマウントされます。
php-apache
build
のcontext
に利用したいDockerfileが直下にあるディレクトリを指定します。
今回はphpディレクトリ直下にDockerfileがありますので、そこを指定しています。ports
に指定のあるようにコンピュータ側の8080番ポートが80番ポートにマウントされます。
今回、コンテナ側の/var/www/laravel_dockerディレクトリにLaravelアプリケーションを作ります。
なのでvolumes
にあるように、この内容はコンピュータのsrcディレクトリに保存されます。
また、Apacheによってデフォルトで有効化されている000-default.conf
に
次に書くdefault.confをマウントすることでアプリケーションの仮想ホストの設定を同期します。depends_on
でサービス間の依存関係を示します。
これでphp-apacheコンテナより前にdatabaseコンテナを起動する必要があることをDockerに認識させます。
default.conf
最後にdefault.confを書きます。
<VirtualHost *:80>
ServerName laravel_docker
DocumentRoot /var/www/laravel_docker/public
<Directory /var/www/laravel_docker>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
の部分で80番ポートへのアクセスについての設定であることを示しています。
docker-compose.ymlのphp-apacheコンテナのportsで指定のあるように
ホスト側で8080番にアクセスすると、コンテナの80につながります。
そこでこの<VirtualHost *:80>
と</VirtualHost>
の中に書かれた設定が適用されます。
サーバのホスト名はlaravel_dockerでWeb上に公開するのは/var/www/laravel_docker/publicです。
ディレクトリ/var/www/laravel_docker配下全てで.htaccessによる変更を許可しています。
エラーログは\${APACHE_LOG_DIR}/error.log、
アクセスログはnicknameがcombinedの書式で\${APACHE_LOG_DIR}/access.logに書き出されます。
これでファイルへの記述は終わりです。
Laravelアプリケーションの設定
ファイルの記述は終わりましたので、いよいよdocker composeコマンドを使って、php-apacheコンテナとDBコンテナを立ち上げましょう。
まずはdocker-compose.ymlのおいてあるディレクトリに移動します。
次に二つのコンテナを起動します。今回は初回の起動なので–buildオプションをつけてイメージの構築からコンテナの起動まで行います。
(–buildをつけない場合、キャッシュされたイメージからコンテナを起動します。なので1回目のbuildの後で起動する場合は速く起動できます。)
-dオプションはデタッチモード(バックグラウンド)で実行します。
cd laravel_docker
docker-compose up -d --build
コンテナを立ち上げたら、次はコンテナのなかに入って作業します。
以下のコマンドでphp-apacheコンテナに入ります。
docker-compose exec php-apache /bin/bash
execの後のphp-apache
はdocker-compose.ymlのサービス名に対応しています。
なのでDBコンテナに入りたい時は今回の場合php-apache
の部分をdatabase
とすれば良いです。
※入った後はexitで抜けれます。
php-apacheコンテナのなかに入ったら、作業ディレクトリがdocker-compose.ymlの./srcのマウント先と合っているか確認します。
確認できたらLaravelのプロジェクトを作成しましょう。
composer create-project laravel/laravel .
完了するとhttp://localhost:8080/を開いてみてください。
Laravelが動いているのを確認できると思います。
また、コンピュータ側のsrcディレクトリにLaravelのプロジェクトが作成されていることと思います。
src/.envの中のデータベースに関する部分を書き換えます。
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=laravel_docker
DB_USERNAME=root
DB_PASSWORD=secret
DB_PORTはdocker-compose.ymlのports、DB_DATABASEとDB_PASSWORDはenvironmentsに記載したものを書きます。
DB_USERNAMEにはrootと入れておきます。
これで開発環境ができました。
後はモデルやコントローラを作成し、好きなように開発してください。
まだコンテナから抜けていない場合、
exit
で抜けれます。
docker-compose down
でコンテナを全て停止・破棄します。
これでDockerとLaravelを使って環境を作れたと思います。