M1チップMacでDocker+Laravel Step2:Dockerfileとyml
その1はこちらから:
M1チップMacでDocker+Laravel Step1:Dockerの導入
ディレクトリの作成
web_tutorial
├── docker-compose.yml
├── apache
│ └── sites-available
├── env
│ └── .env.mysql
├── php
│ └── Dockerfile
└── src
作業用のディレクトリを用意しましょう。最終的にLaravelプロジェクトがインストールされるのはsrc
直下になります。
docker-compose.ymlの用意
ここではそれぞれのコンテナへの設定などをしていきます。
version: "3.9"
services:
web:
build:
context: .
dockerfile: ./php/Dockerfile
container_name: local_web
volumes:
- ./src:/var/www/html
ports:
- 8080:80
env_file: env/.env.mysql
db:
platform: linux/x86_64
image: mysql:8.0.26
container_name: local_db
environment:
MYSQL_HOST: db
MYSQL_DATABASE: local_db
MYSQL_USER: local_user
MYSQL_PASSWORD: local_password
MYSQL_ROOT_PASSWORD: local_password
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
web: ブロック
build: -> dockerfile:
build:
dockerfile: ./php/Dockerfile
このコンテナはこのディレクトリにあるDockerfileを使って導入(build)するよという指定。
volumes:
volumes:
- ./src:/var/www/html
左側が自分のローカル内ディレクトリのパス。右側はDockerコンテナ内のディレクトリ。
これはローカルの./src
をDockerコンテナ内の/var/www/html
として使うよという指定。
env_file:
env_file: env/.env.mysql
これはこのコンテナ内で使用する環境変数を設定するための指定です。右側のファイル内に書かれている環境変数を使うよという指定です。
db: ブロック
platform:
platform: linux/x86_64
MacのM1チップではこれを指定しておかないとコンテナ立ち上げ時に下記エラーになり動かなくなります。
no matching manifest for linux/arm64/v8 in the manifest list entriesno matching manifest for linux/arm64/v8 in the manifest list entries
volumes:
volumes:
- db-data:/var/lib/mysql
dbのデータをどこに保持するかの指定をします。
これもwebブロックの時の同じで、左側がローカル、右側がDockerコンテナ内ディレクトリになります。一つ異なるのはdb-data
部分。
これはDockerアプリのボリュームというデータの保存場所です。
Dockerはもう一度コンテナを作り直りなおすと、保存されたコンテナ内のデータも全て消えてしまいます。それを永続化するためにこのボリュームを使います。
version: "3.9"
services:
~~~略~~~
volumes:
db-data:
そして、こちらがそのボリュームの作成をするための指定です。
db-data
は/var/lib/docker/volumes...
に作成されます。
ちなみにymlファイルはインデントで階層が決まるのでservices:
と同じ階層になるように書かないと下記エラーで動かなくなります。
services.volumes Additional property db-data is not allowed
Dockerfileの用意
webコンテナで設定した下記ファイルを実際に用意します。
build:
dockerfile: ./php/Dockerfile
/php/Dockerfile 内容
FROM php:7.4.22-apache
RUN rm /etc/apt/preferences.d/no-debian-php
# Install git
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y git net-tools vim \
zip unzip libzip-dev && \
apt-get clean
# Set apache mod_rewrite
RUN a2enmod rewrite
# Install php extension
RUN docker-php-ext-install mysqli pdo pdo_mysql zip
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install NPM & node
RUN curl -sl https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get install -y nodejs build-essential
これはwebコンテナで使用するアプリケーションをインストールするためのものです。Dockerコンテナは基本的にLinuxベースで動いているので、apt
で必要なものを入れていきます。
また、この時点でLaravelをインストールするために必要になるComposerも入れています。
.envファイルの用意
こちらも、webコンテナで設定した下記ファイルを実際に用意していきましょう。
env_file: env/.env.mysql
env/.env.mysql 内容
MYSQL_HOST=db
MYSQL_DATABASE=local_db
MYSQL_USER=local_user
MYSQL_PASSWORD=local_password
MYSQL_ROOT_PASSWORD=local_password
いよいよdocker-compose up
これで環境を構築するための準備ができました。
最後にdocker-compose.yml
ファイルと同じ階層で、下記コマンドを実行します。
kafeine@Bean-Mac web_tutorial % docker-compose up
すこし時間がかかりますが、しばらくすると下記のようなものが表示されます。
Starting local_db ... done
Starting local_web ... done
Attaching to local_db, local_web
...
これで立ち上げが完了したので、次に下記アドレスにアクセスします。
http://localhost:8080
しかし、現時点ではファイルが何もなくforbiddenになってしまうので./src
にindex.php
を作成します。
ついでにphp
とDB
への接続ができているかを確認するため、内容はこのようにします。
<?php
echo 'Docker Local';
$dsn = 'mysql:host='.$_ENV['MYSQL_HOST']
.';dbname='.$_ENV['MYSQL_DATABASE'];
$dbh = new PDO($dsn, $_ENV['MYSQL_USER'], $_ENV['MYSQL_PASSWORD']);
foreach($dbh->query('SHOW databases') as $row) {
echo '<pre>';
print_r($row);
echo '</pre>';
}
phpinfo();
再びhttp://localhost:8080
に接続すると画像のような表示になります。
が、ここからちょっと一手間工夫します。
DocumentRootを変更できるようにする
このままだとApacheのDocumentRootを変更するのに、毎回Dockerのイメージを再構築しなければなりません。そうすると、そのたびにDockerのコンテナを削除、イメージを削除、docker-compose...という手間がかかってしまうので、できればコンテナの再起動だけで済ませたいところ。
なので、まずは新しくターミナルを開いてこのコマンドを実行し、Apacheのconfファイル群をローカル側にコピーします。
kafeine@Bean-Mac web_tutorial % docker cp local_web:/etc/apache2/sites-available/ ./apache/sites-available/
これは自分のローカル側からDockerのコンテナ内へ、またその逆へファイルをコピーすることができるコマンドです。これを使ってlocal_webコンテナの中のapacheのconfファイルをローカルにコピーします。
コマンド実行後、apache/sites-available
というディレクトリ直下に下記ファイルが作られるはずです。
000-default.conf
default-ssl.conf
コピーが完了したら、docker-compose upをしたターミナルでCtrl+Cを使い、Dockerコンテナをストップさせます。
^CGracefully stopping... (press Ctrl+C again to force)
Stopping local_web ... done
Stopping local_db ... done
ストップしたことを確認したら、下記コマンドでコンテナを削除します。
kafeine@Bean-Mac web_tutorial % docker container prune -f
これが完了したら、docker-comopse.ymlファイルに下記の1行をwebブロックのvolumes
に書き加えます。
- ./apache/sites-available:/etc/apache2/sites-available
version: "3.9"
services:
web:
build:
context: .
dockerfile: ./php/Dockerfile
container_name: local_web
volumes:
- ./src:/var/www/html
- ./apache/sites-available:/etc/apache2/sites-available
ports:
- 8080:80
env_file: env/.env.mysql
db:
platform: linux/x86_64
image: mysql:8.0.26
container_name: local_db
environment:
MYSQL_HOST: db
MYSQL_DATABASE: local_db
MYSQL_USER: local_user
MYSQL_PASSWORD: local_password
MYSQL_ROOT_PASSWORD: local_password
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
保存したら再びdocker-compose up
を実行しlocalhost:8080
に接続できるか確認しましょう。
さぁ、これでやっとLaravelを導入する準備ができました。
Special Thanks
この記事でのDockerfileなどの構築は、こちらの記事を参考にしました。
英語ではありますがとてもわかりやすく書かれているので、気になった方はみてみてください。
Build LAMP environment with docker step by step
Discussion