PHP+MariaDB+Nginxのローカル環境をDockerで構築 構築編【Docker】

公開日:

最終更新日:

PHP+MariaDB+Nginxのローカル環境をDockerで構築 構築編【Docker】

かなりご無沙汰ですが、公開直前で止まっていた記事だけ公開します。

前回の事前準備編でコンテナをbuildするファイルが揃っていると思うので、最終の手順であるコンソールでの作業部分になります。
前回に続けて書くと文章が長くなりすぎたので、バーチャルホストの設定部分についてもついでに書きます。

私はコンソールの作業は苦手でどうしてもGUIに頼ってしまいがちですが、コンテナ作成さえしてしまえばDockerでやることに関しては特に難しいこともないです。
またコンソールを使った作業と書きましたが、数行のコマンドを打ってしまえば終わる話なので実際には他の部分の作業の方が多いです。

前置きはこのあたりにして、今回はDockerを使った環境構築の最終部分であるコンテナの作成と起動について+バーチャルホストの設定について書いていこうと思います。
※事前準備はこちらの記事をご覧ください。

コンテナをbuildする

ではコンソールを開いてコンテナをbuildしていきます。
と言いたいところですが、一旦ymlファイルに設定を書き加えます。

  nginx-server:
    #portsなどの設定の下に追加
    depends_on:
      - phpfpm73-nginx
    
    phpfpm73-nginx:
      #同様に追加
      depends_on:
      - mariadb-nginx

これは何かというと、docker-compose upした際に起動順を制御してくれます。
今回の場合だとMariaDBが立ち上がったあとPHP-FPMが立ち上がり最後にNginxが立ち上がるイメージです。

これで準備が整ったのでコンテナをbuildしていきます。
私はユーザーディレクトリ直下にdocker-devdirのディレクトリを作成して、かつdocker-configのなかにdocker-compose.ymlを作成したので、cdコマンドで該当の場所まで移動します。
あとはdocker-compose up –buildと打つだけでbuildが始まり、ymlに記述した内容に沿ってインストールなどが進み、コンテナ起動まで進みます。

cd ~/docker-devdir/docker-config

docker-compose up --build

Kitematicをインストールされた方は起動させておけば、今後は起動や削除はKitematic上で行うことができます。
このアプリケーションについてあまり詳しくはないのですが、ymlファイルで設定したものがGUI上で設定できたり、簡単にイメージを入手してコンテナ作成ができたりするのでコンソールでいちいちコマンドを打たなくても解決できるのは非常にありがたいです。

正直コンソールについての作業はここまでです。
エラーが出てインストールができなかったなどのイレギュラーがあって再構築をかけなければいけない等がなければ、あとは特に必要ないです。おそらく・・・。

Nginxのdefault.confを変更する

これでブラウザからlocalhostでアクセスしたらOKと思っていましたが、Nginx側の設定を完全に忘れていました。
前回作成していたdefault.confを開いて以下の内容を記述してください。

server {
    listen 80;
    root  /var/www/html;
    index index.html index.php;
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
    client_max_body_size 10m;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass phpfpm73-nginx:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Nginxのconfに関してはあまり説明はしません(できません)がclient_max_body_sizeは必ず追加しておいた方がいいです。
Nginxはアップロードの制限がデフォルトで1MBに設定されていて、ファイルアップロードをする場合に1MBを超えると413 Request Entity Too Largeというエラーで弾かれてしまいます。

この辺りは目安で設定といった感じですが、おおよそ10MBあれば十分だと思います。

その他の設定部分で注目する部分があるとすれば、fastcgi_passの記述としてはdocker-compose.ymlで指定したサービス名を記述することで解決できます。
ポート設定をしていないとエラーになるので、デフォルトである9000番を指定します。

あとはNginxを再起動すればおそらくlocalhostで接続ができるようになるはずです。

バーチャルホストを設定して「〜.test」で接続できるようにする

MAMPやXAMPPでもバーチャルホストを設定することはできるのですが、いちいちhostsファイルにドメイン名とアドレスを書いていかなければならないので少し面倒です。

Dockerであればdnsmasqというイメージを利用すれば簡単にバーチャルホストの設定ができ、かつコンテナの再buildを行うだけで設定が完了します。

dnsmasqコンテナを作成する

まずはdnsmasqのコンテナを作成します。とはいってもこの段階でほぼ設定は終了のようなものです。

すでに用意しているdocker-compose.ymlの最下部にdnsmasqの記述を追加します。

  dnsmasq-server:
    container_name: dnsmasq.sv
    image: andyshinn/dnsmasq
    ports:
      - '53:53/udp'
      - '53:53/tcp'
    extra_hosts:
      - 'phpmyadmin.test:127.0.0.1'
      - 'abc.test:127.0.0.1'
    cap_add:
      - NET_ADMIN

もうほとんどコピペといった感じですね・・・。
多少めんどくさい点をあげると、extra_hostsは設定するたびに再buildを行わないといけないので、もう少し構造を理解していればそのような設定も必要なくなるのかなと思います。

なんにしても出来合いのコンテナでバーチャルホストを設定できるのは非常に便利ではないかと思います。

【2021追記】dnsmasqの設定ファイルで「.test」ディレクトリをバーチャルホストとして認識させる

extra_hostsを設定することで、バーチャルホストを設定することができると以前書いていましたが、resolve.confdnsmasq.confを適切に設定することで、extra_hostsの設定なしでも自動化可能でした。

参考にしたのは以下のページです。
https://wiki.archlinux.jp/index.php/Dnsmasq

docker-compose.ymlのextra_hostsをコメントアウトして、volumesにローカルのconfファイルまでのパスを設定することで、追加設定が可能になります。

    # extra_hosts:
    #   - 'phpmyadmin.test:127.0.0.1'
    #   - 'abc.test:127.0.0.1'
    volumes:
      - ../nginx/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf
      - ../nginx/dnsmasq/resolv.conf:/etc/resolv.conf

resolve.confにはnameserver 127.0.0.1として記述することにより、wikiの説明通り、まずdnsmasqでクエリの解決を行うようになります。
次にdnsmasq.confにaddress=/.test/127.0.0.1と記述することによって、「.test」という名前がついている場合はローカル環境を参照する仕組みです。

追記文なので多少前後しますが、nginxのdefault.conf側でserver_nameとrootを.testで認識させるようにしておけば、.testディレクトリを自動的に参照するということになります。

default.confに設定を追加する

先ほどlocalhostの設定をしたdefault.confに設定を追加します。
今回は「〜.test」に該当するディレクトリをルートフォルダとして認識させたいので、server_nameの部分に正規表現と変数を利用してルートディレクトリとして反映します。

server {
    listen 80;
    server_name ~(?<domain>.+).test$;
    root  /var/www/html/$domain.test;
    index index.html index.php;
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
    client_max_body_size 10m;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass phpfpm73-nginx:9000;
        # fastcgi_pass 127.0.0.1;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

追記ができればあとは先ほどと同じようにdocker-compose up –buildでコンテナ作成と起動を同時に実行します。

ブラウザから接続を確認する

今回extra_hostsで設定したのは「phpmyadmin.test」と「abc.test」なので、htmlのディレクトリの直下に各ディレクトリを作成します。

phpmyadmin.testには最新版をダウンロードして同梱されているファイル群を全てつっこんでしまえば簡単に動きます。
ユーザーはdocker-compose.ymlで別ユーザーとパスワードを作成していなければ、rootユーザーと今回設定していたMYSQL_ROOT_PASSWORDのパスワードでログインできるはずです。

もしこの時点でなんらかのエラーが出る場合は、おそらくコンテナのbuildがうまくいっていないので再buildするなどしてください。

あとは確認ついでに適当にテーブルを作成したり削除したりして、問題なければバーチャルホストの設定も完了です。

まとめ

これでひとまずタイトル通りの環境構築はできたかと思います。
調べてやってみたものの、まだまだ理解が及んでいない項目が多すぎます。

例えばvolumesの設定もリモート側が合っているのかわかっているようでわかっていなかったり、portsもudpやtcpがあるけども実際の内情は全くわかっていなかったり
案外納得のいく説明が書いているところも少なかったりするので、まだまだ勉強不足ですね。

私はどうもチュートリアルや順を追った説明を読み飛ばしてしまう傾向があるので、もっとしっかり読む癖をつけて理解を深めていかないといけないですね・・・。
読み飛ばしても「とりあえずDocker使って環境構築的なものができればいいや」という人には優しい記事になったかと思っています。

関連記事