はじめに
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.ymldb・・・DB(MySQL8.0)のデータや初期データを入れる箇所になります。
-init・・・初期に投入するSQLを入れます。
-data・・・DBの実データがこの中に入ります。
web・・・Webサーバ(Apache2.4)の設定ファイル、SSLキーやプロジェクトが入ります。
-conf・・・Apacheの設定ファイルです、Dockerビルド時に使用します。
-key・・・SSLに使用するダミーの証明書です。
-project・・・プロジェクトソースを入れます。
(docker-compose.yml でprojectソースは設定できるので、この中に入れない方法も可能です。) -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.htmldocker-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-pluginMySQL8.0ですと、caching_sha2_passwordがデフォルトなので、mysql_native_passwordに変えます。
※PHPのMySQL接続ライブラリが対応していないため。command: --default-authentication-plugin=mysql_native_passwordで設定できます。
おわりに
別件で、このテンプレートを使用して構築してみたのですが、カスタマイズが必要で色々調査しました。(wkhtmltopdfが必要なのでインストールしたり、sshを使用したり)
様々な問題があったので簡単に書いておきます。
sshをapacheのコンテナに入れる →sshのキーを作成する,sshのコンテナはsupervisorをインストールし設定する。wkhtmltopdfを入れる。 → Ubuntuでのインストール方法をDockerfileに書く,volumesでマウントしている Dockerのホスト上のファイルとコンテナとの同期が遅い。→ 重いファイルを同期させない。(100MBより大きくなると結構遅い)docker-compose.ymlでvolumesでマウントしているディレクトリの中で除外できるものを設定できるので、それを試してみる。(.gitとか)
もしくは、docker-syncを使ってみる。sshでweb,dbでファイルをやり取りする。sshscpのコマンドインストールや設定をしたのちに、exposeでポート開放したりする。
docker-sync とか、supervisor が知らなかったので、とても勉強になりました。
やはり書いてみないとわからないので、色々な構築パターンをローカルで試してみると面白いのではないでしょうか。
WEBサーバが1つのパターンから、複数+ファイルサーバがあったりDBサーバあったり、APIサーバあったり。のように少しずつ拡張させていくと楽しめそうです。
こういうパターンは、「Iaas デザインパターン」や「クラウドデザインパターン」などのキーワードで調べるとヒットしますね。
下記のクラウドデザインパターンはとても勉強になります。(私はまだ全部は読めておりませんが。)
近況
以前に作ったものでしたが紹介できていなかったので記事を書きました。Goのbuild-web-application-with-golang は明日からまたやっていきます。
参考/おすすめ リンク
- AWSクラウドデザインパターン: http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
- 富士通 IaaS 設計・構築ガイド(クラウドデザインパターン・実装サンプル集: https://doc.cloud.global.fujitsu.com/lib/iaas/jp/cdp/index.html