Dockerを使って自分のPC内に必要最低限の便利な環境構築をした話(PHP編)

2022年3月7日

テクノロジー

eyecatch 容量が少なくてCPU処理が低くてメモリ使用量が少ないアプリが大好きな、ユゲタです。 無駄に重たいアプリって一体なんなん???って思うけど、意外と多いんですよね。 スマホでゲームアプリを立ち上げたら、スマホが熱を持って、あっつあつの状態になる事が夏場だけじゃなく、冬場でもあります。 これは本当に、無駄な処理をたらふくやっちまっているんだろうな・・・と推測してしまいます。 一昔前のDockerでも、似たような事を感じた事があったんですが、実はちゃんとした使い方をしたら、Dockerは神ソフトであると改めて感じたので、最近は必須で使用しています。

改めて感じたDockerの有用性

それは、MacのMontereyにアップデートした時に気がついた事なんですが、OSがデフォルトで搭載してくれていたPHPが、非搭載になっていたんですね。 これまで普通にローカルで使っていたPHPモジュールが、アップデートしたら、うんともすんとも反応しなくなったので、おかしいなと思ったらその仕様になっていたことに気がつきました。 まあ、こうした事は想定内ではあるので、brewでインストールしようかなと思ったんですが、なるべくならベースOSには、あまりアプリを入れないようにして、無駄なメモリを普段から節約しようと考えたところ、 必要な時に都度任意に立ち上げられる状態が作れたら、複数の案件を同時にこなす自分としては、非常に便利なのではないかと思ったわけですわ。 そこで登場するのがやっぱりDockerです。 必要な時に、立ち上げればいいので、普段使わない時にはメモリを節約できるのは、本当に理想的ですね。 しかも、OS違い、バージョン違い、特殊モジュール環境構築、などなど、どんな構成でも、瞬時に便利に確実に立ち上げる事ができる、しかも、仮想OSよりも軽い、もはや神ツールと言わずしてなんと言えるでしょう。

もはやPHPインストールが必要ないdocker環境構成

とりあえず、手元のMacにphpを取り戻そうと思い、dockerで構築しようとしたんですが、ターミナルにものの1行実行するだけで、phpは実行する事ができるようになりました。 色々と試行錯誤をして、とりあえず2パターンのdockerコマンドにたどり着きました。 まず1つ目が $ docker run -it --name php --mount type=bind,source="$(pwd)",target=/var/www/html -p 80:9000 php:8.0-fpm-apache -d これです。 最初に実行した時は、imageのダウンロードで少し時間がかかるかもしれませんが、二度目以降は、瞬時に立ち上がり、実行した場所がPHPのドキュメントルートになります。 ブラウザにhttp://localhostでアクセスしたら、PHP系のwebサーバーとして使えます。 これ便利〜!

軽量版にトライ

でも、上記のdocker imageを見てみると、400MB以上あるので、ちょっとHDDに優しくないな〜と思っていたら、なんとalpineバージョンというのがあるではないですか!!! これは、dockerのimageから無駄なものを取り除いて究極に容量を軽くしてくれたバージョンでほぼ同じ仕様で使う事ができる神imageです。 でも、このバージョンではapache同梱のものが無く、自分でimageを作ってもいいんですが、既存のhubにあるimageだけで構築しようとしたら、次のようにコマンドを打つとできます。 $ docker run -it --name php --mount type=bind,source="$(pwd)",target=/var/www/html -p 80:9000 php:8.0-fpm-alpine bash > php -S 0.0.0.0:80 実行行が2行になりましたが、これはphpのalpine版を立ち上げて、その後コンテナ内でphpのBuiltin-server機能で実行しているだけなんですが、imageの容量を見てみると、90MBぐらいで収まっています。

いよいよdocker-compose登場

残念ながら、apacheとalpineの同梱版imageがなかったので、仕方ないな〜と思っていたら、docker-composeを使って実現させる事に行きつきました。 とりあえず、次の3つのファイルを作って実行してみます。 server { listen 80; server_name localhost; index index.php index.html; root /var/www/html; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/html text/css text/javascript text/plain image/svg+xml application/json; } [Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" version: '3' services: php: container_name : php image : php:8.1-fpm-alpine volumes: - ./php.ini:/usr/local/etc/php/php.ini - ../:/var/www/html working_dir: /var/www/html nginx: container_name: nginx image: nginx:1.19.5-alpine ports: - 80:80 volumes: - ./default.conf:/etc/nginx/conf.d/default.conf - ../:/var/www/html depends_on: - php ターミナルで実行 $ docker-compose up -d 同じように、立ち上げたフォルダがphpのドキュメントルートになります。 フォルダに入れて使ってもいいですが、開発環境のrootに置いて実行すると良いでしょう。 これまでのネイティブのdockerコマンドでも、php.iniなどをincludeすることはできるんですが、docker-composeを使うと、複数コンテナを同時に且つオブジェクティブに扱えるので、非常に便利です。 改めてこうした便利で安定したな環境が手軽に構築できる今のテクノロジに感動した週末でした。