はじめに
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.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-plugin
MySQL8.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
でファイルをやり取りする。ssh
scp
のコマンドインストールや設定をしたのちに、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