DockerでLAMP環境を構築する

はじめに

Docker を使用してLAMP 環境を作成したので、そちらをご紹介します。 本番運用は想定しておらず、あくまで開発環境用となりますのでご注意ください。

環境

Windows 10 Professional
Visual Studio Code 1.41.1
docker desktop 2.1.0.5(40693)
docker-compose version 1.24.1, build 4667896b

制作物

下記になります。
https://github.com/katsuobushiFPGA/docker-lamp

README.md に使い方を書いているのでこちらを読んでいただければと思います。

内容について

フォルダ構成は以下のようにしております。

db
web
docker-compose.yml

db・・・DB(MySQL8.0)のデータや初期データを入れる箇所になります。
-init・・・初期に投入するSQLを入れます。
-data・・・DBの実データがこの中に入ります。

web・・・Webサーバ(Apache2.4)の設定ファイル、SSLキーやプロジェクトが入ります。
-conf・・・Apacheの設定ファイルです、Dockerビルド時に使用します。
-key・・・SSLに使用するダミーの証明書です。
-project・・・プロジェクトソースを入れます。
(docker-compose.ymlprojectソースは設定できるので、この中に入れない方法も可能です。) -Dockerfile`・・・Dockerの構成ファイルです。

docker-compose.yml・・・Dockerの構成管理ファイルになります。

web - Dockerfileの中身

こちらはとっても簡単です。
PHP の 拡張モジュールをインストール, xdebug のインストール, 証明書の配置, DOCUMENT_ROOT の書き換え
以上を行っているだけですね。

ssh などが必要な場合になると、 supervisor が必要になるので、その環境の場合は設定しましょう。
(1コンテナで1プロセスなのですが、複数プロセス管理する場合は上記(supervisor)が必要です。 FOREGROUNDのプロセスが死ぬとコンテナが終了するため。)

docker-compose.yml の中身

web, db, phpmyAdminがサービスとして立ち上がるようになっております。
下記がとても参考になります。
Docker-docs-ja: http://docs.docker.jp/compose/overview.html
docker-compose 自体は結構わかりやすい記述なので、
ドキュメントを見ながらやっていくと良いかと思います。
ここでは、作成した際の要点だけ説明します。

  • WebとDBはWEB→DBでアクセスできるようにしたい。
    links を使用することで、 container_name でアクセスできるようになります。
    なので、web の部分で links: - db をしております。

  • DOCUMENT_ROOTを変えたい
    構築していて、DOCUMENT_ROOTをどうにか変えたいと思ったので、変えられるように構築しました。

    args:
        DOCUMENT_ROOT: /var/www/html/app/webroot

という感じで変えられるようにしております。(Dockerfileを見ていただくと, sed で設定ファイルの中身を置換しております。)

  • DBデータの永続化
volumes:
      - ./db/data:/var/lib/mysql

上記で、ホスト上のディレクトリをマウントしています。
こうすることで、ホスト上にデータが保存されます。

  • MySQLのdefault-authentication-plugin MySQL8.0ですと、 caching_sha2_password がデフォルトなので、mysql_native_password に変えます。
    ※PHPのMySQL接続ライブラリが対応していないため。 command: --default-authentication-plugin=mysql_native_password で設定できます。

おわりに

別件で、このテンプレートを使用して構築してみたのですが、カスタマイズが必要で色々調査しました。(wkhtmltopdfが必要なのでインストールしたり、sshを使用したり) 様々な問題があったので簡単に書いておきます。

  • sshapache のコンテナに入れる → ssh のキーを作成する, sshのコンテナは supervisor をインストールし設定する。
  • wkhtmltopdf を入れる。 → Ubuntuでのインストール方法をDockerfile に書く,
  • volumes でマウントしている Dockerのホスト上のファイルとコンテナとの同期が遅い。→ 重いファイルを同期させない。(100MBより大きくなると結構遅い)
    docker-compose.ymlvolumes でマウントしているディレクトリの中で除外できるものを設定できるので、それを試してみる。(.git とか)
    もしくは、docker-sync を使ってみる。
  • sshweb , db でファイルをやり取りする。 ssh scp のコマンドインストールや設定をしたのちに、 expose でポート開放したりする。

docker-sync とか、supervisor が知らなかったので、とても勉強になりました。

やはり書いてみないとわからないので、色々な構築パターンをローカルで試してみると面白いのではないでしょうか。
WEBサーバが1つのパターンから、複数+ファイルサーバがあったりDBサーバあったり、APIサーバあったり。のように少しずつ拡張させていくと楽しめそうです。
こういうパターンは、「Iaas デザインパターン」や「クラウドデザインパターン」などのキーワードで調べるとヒットしますね。
下記のクラウドデザインパターンはとても勉強になります。(私はまだ全部は読めておりませんが。)

近況

以前に作ったものでしたが紹介できていなかったので記事を書きました。
Gobuild-web-application-with-golang は明日からまたやっていきます。

参考/おすすめ リンク

Hugo で構築されています。
テーマ StackJimmy によって設計されています。