docker-composeを使って一瞬でLAMP+SSL環境を作る方法

2020年7月29日

この記事を読むと得られる情報

1コマンドで

  • Nginx(SSL化用リバースプロキシ)
  • MariaDB
  • CentOS7
    • Apache
    • php

のコンテナが下記の簡略図で立ち上がり、gitかなにかでwebアプリコンテンツをDocumentRootに置けば、すぐに使えるようになる。

システム構成図
簡略図

本稿のレベルとしては
「dockerとdocker-composeが何なのかはなんとなく知ってるけど、あんまり使ったことない人」向けです。

それぞれの基本知識としては下記を斜め読みすれば十分だと思います。

俺はさっさと環境ができれば、どうだっていいんじゃーって人は
「デプロイ」までで実施できます。
各機能の詳細や、詳細な関係が気になる人は最後まで読んで見てください!

環境用意

CentOS Linux release 7.4.1708 (Core)

下記で示すDockerとdocker-composeのバージョンさえ合ってればなんでもいいです。
macOS High Sierra 10.13.4でも動作確認済みですが、本記事はCentOSでの実施手順です。

Docker version 18.03.0-ce, build 0520e24

docker-compose version 1.20.1, build 5d8c71b 以上

【任意】DDNSへの登録(ドメイン)

SSL化に必要なドメインを取得します。
無料かつ、IPの変化に対応できるDDNSとしておすすめはMyDNSです。
任意のドメインを入手しておいてください。
後述しますが、hogehoge.mydns.jpなど人気なドメインは避けたほうが良いです。

構築

カレントディレクトリは任意ですが、ユーザーディレクトリがいいと思います。
カレントディレクトリに下記のようなファイルを構築します。

docker-compose.yml

docker-compose.ymlはyml形式で書かれたファイルで、名前の通りdocker-composeの設定ファイルです。
ここで各種dockerコンテナ(今回はCentOSとNginx、MariaDB)の設定を記述します。

db/Dockerfile

web/Dockerfile

各種設定ファイル

  • db/my.cnf
    • 普段のmariaDBで使用してるものを用意
  • web/conf/httpd.conf & web/php.ini
    • こちらも普段使用しているapacheの設定ファイルと、php.iniファイルを用意
  • web/html/*
    • デプロイしたいwebアプリの資材をここに入れてください

デプロイ

さて、いよいよコンテナの立ち上げです。
docker-compose.ymlがあるディレクトリまで移り

となれば、完了!!
取得したドメイン名でアクセスして、アプリの動作を確認してください。

Q&A

  • コンテナが正常に起動しない
    • $ docker-compose logsで各種コンテナの状況が確認できます
  • 証明書の発行時にドメイン上限に引っかかって発行できない

詳細

ネットワーク関係

序盤に簡単なネットワーク構成を書きましたが実際にはこんな感じ

ネットワーク構成図
ネットワーク構成図

NginxとmariaDBとCentOSベースのコンテナの3つが起動してます。
NginxとmariaDBは設定内容が簡単なことから分かる通り、そのまま使用しています。
CentOSのコンテナのみweb/Dockerfileでyumを使った初期インストールでApacheやphpを導入しています。
(そこを変更すればpythonだって環境を作ることが可能です)

コンテナ同士はdocker-compose.ymlの最後に記したネットワーク内での相互通信を行っています。

インターネット(外部)との通信はdocker-compose.ymlのNginxの部分で設定した部分(port) で定義しており、
ローカルマシンの対応するポートとポートフォワーディングで通信を行っています。
また今回はlet’s encryptではなくオレオレ証明書でアクセスでアクセスすることも可能です。
既存環境に手を加えずにサクッとHTTPS化する (NAT配下でもok)

さらに、docker-compose.ymlからhttps-portalの設定を全削除して、webでポートフォワーディングを設定すればDDNSも不要になります。

オプションディレクトリの説明

3章で空のディレクトリを複数作りましたが、それぞれ役割があります。

db/init.s

docker-compose.ymlの./db/init.s:/docker-entrypoint-initdb.dにも書いてありますが
init.sに入れたファイルはmariaのコンテナのdocker-entrypoint-initdb.dにコピーされます。
コンテナ側のdocker-entrypoint-initdb.dというディレクトリは特殊で
ここに入れられたshファイルや、sqlファイルはコンテナ立ち上げ時にアスキーコード順に実行されます。
なので、ここにはDBの初期データを流し込むスクリプトファイルなどを入れます。

db/init.d

docker-compose.ymlの./db/init.d:/var/lib/ramにも書いてありますが
init.dに入れたファイルはmariaのコンテナの/var/lib/ramにコピーされます。
ここは単純にコピーされるだけなので
init.sで実施されるスクリプトが読みに来るDBのダンプデータなどを入れます。

5-2-3. db/vol

ここはDBのデータそのものが入ります。
テーブルスキームや、カラムの値などが入っています。
ここのデータをコピーしておけばバックアップとして使えます。