🔥

M1チップMacでDocker+Laravel Step2:Dockerfileとyml

2021/10/22に公開

その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になってしまうので./srcindex.phpを作成します。
ついでにphpDBへの接続ができているかを確認するため、内容はこのようにします。

<?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に接続すると画像のような表示になります。
docker_php

が、ここからちょっと一手間工夫します。

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

次はこちら:
M1チップMacでDocker+Laravel Step3:Laravelの導入

Discussion