docker-proxy-lamp
docker-proxy-lampなるものを作りました。
Github -> https://github.com/tadaoji/docker-proxy-lamp
概要
LAMP構成を作る際に、一つのホストで複数のLAMP環境を立ち上げるという目的を達成するため、今回は上図のようにproxyで受けて各LAMPコンテナへ流すという構成にします。現在ではSSLが必須となってきているのでproxy側でSSLの処理も行います。
補足になりますが、LAMP環境とはLinux, Apache, MySQL, PHPのことです。つまりWEBサーバの環境を作るということです。
各コンテナはDockerを使います。また、全てを手動で立ち上げていたのでは大変なのでdocker-composeで丸ごと環境を管理します。
ここでは使い方を簡単に説明しますが、詳しくはGitレポジトリ内に日本語版READMEも置いてあります。
環境
Linux(私はCentOS7で検証しています)
Docker
Docker-compose
公開されるドメインはDNSが解決できるもの(テスト段階であればhostsでもいいでしょう)
ダウンロード
任意のディレクトリで展開します。
ただし、デフォルトの設定では公開ディレクトリなども構築後は同じディレクトリ内に作成されるので、都合のいいPATHにすることをおすすめします。
wget https://github.com/tadaoji/docker-proxy-lamp/archive/refs/heads/master.zip
unzip master.zip
展開するとこのようなファイルができます。
├── LICENSE
├── README.html
├── README.md
├── README[Japanese].md
├── attach-volume.sh
├── docker-compose.yml
└── docker-lamp
├── mysql
│ └── Dockerfile
└── php-apache
└── Dockerfile
設定
基本的にはdocker-compose.ymlを編集します。
構成を考える
LAMPコンテナがいくつ必要か、それぞれのコンテナに使われるドメインをどうするかを決めます。
デフォルトではLAMP×1、wordpress×1、phpmyadmin×1となっています。
これらは自由に増減できます。
docker-compose.yml編集
https-portal
SteveLTN/https-portal https://github.com/SteveLTN/https-portal
のイメージを使用しているので、詳しくは上記ページを参照して下さい。
このイメージが持つ機能は、nginxを利用したproxy、Let’s EncryptによるSSL発行および更新となっているようです。これらの機能を今回利用しています。
DOMAINS
DOMAINSを設定します。カンマ区切りで複数を指定できます。
’<WEBに公開されるドメイン> -> service名, <WEBに公開されるドメイン2> -> service名2, ・・・’
STAGE
Let’s encryptのSSL発行に関わります。
productionにすると実際に使用可能なSSLが発行されます。
しかし、設定ミスなどにより何度もテストしていると都度発行が行われることになり、Let’s encryptの発行上限に達してしまいます。なので、動作検証が済むまでは使用しないことを推奨します。
localの場合、Let’s encryptを使わずに自己証明書(オレオレ証明書)になります。こちらの場合は何度でも試行して問題ありません。
LAMP
php-apacheとmysql-dbの2つのServiceによって構成されます。
################ で区切ってある部分がこれにあたります。
LAMP環境を増やしたい場合、これをコピーして下さい。
複製した場合、以下に重複がないようにします。
php-apache
Service名(php-apache_1と書かれている部分です)
volumes
volumes:
- ./lamp_1/public_html:/var/www/html # 書き換え
- ./lamp_1/apache_logs:/opt/logs # 書き換え
:で区切られた左側がホスト側のディレクトリになります。
公開ディレクトリと、apacheのログ出力ディレクトリになります。
depends_on
使用されるmysql-dbの名前にして下さい。
mysqlが起動してからphp-apacheが起動します。
mysql-db
volumes
mysqlのデータが格納されます。
ディレクトリではなくDockerのvolumeを使っています。
ディレクトリとして扱いたい場合はそのようにして下さい。
wordpress
depends_on
使用されるmysql-dbの名前にして下さい。
environment
mysql-dbのenvironment設定に合わせて下さい。
pypmyadmin
https-portal-phpmyadmin
https-portalのコンテナをもう一つ立ち上げているのは、このphpmyadminは一般に公開する必要はなく(セキュリティを考えると公開すべきではないでしょう)、port番号をオリジナルのもののみ使用するためです。
ports
デフォルトでは28249:443としていますが、28249の部分は任意のport番号にできます。
DOMAINS
任意のドメインを設定して下さい。
STAGE
証明書の警告が出ますが、自己証明書(local)でいいでしょう。
phpmyadmin
environment
PMA_ARBITARYを設定した場合、pypmyadminにブラウザからログインする際に接続するmysqlを選択できるようになります。この機能により、一つのpypmyadminにより今回構築したmysqlの全てに対してアクセスが可能になります。
PMA_HOSTを設定し、PMA_ARBITARYをOFFにした場合、接続するmysqlは固定されます。
設定する際は任意のmysqlコンテナのService名にします。
volumes
https-portalとmysql-dbはDockerのvolumeを使用するので、増やした分だけこちらにも反映させます。
networks
このdocker-composeで作成されるコンテナ達はここで設定されるnetworksに参加することでコンテナ間のアクセスを可能にし、またService名でのDNS解決が行われるようになっています。
つまり、全てのコンテナはこのnetworksで作られる仮想networkに参加する設定が必要になります。ネットワーク名を変える場合は、全てのコンテナにも設定を反映する必要があります。
起動
docker-compose build
docker-compose up -d
docker-compose.ymlを編集するなど、設定を変えた場合はbuildを都度行い反映する必要があります。
起動状態の確認には
docker-compose logs
docker container ls -a
docker-compose ps
といったコマンドを使用して下さい。
停止
docker-compose stop
削除
docker-compose down
docker-compose down --volumes --remove-orphans <- volumeなども含め全て削除し、初期化する
もし、docker-comopseコマンドが動作しないといった場合には、dockerコマンドにより直接削除することができます。
container、network、volumeのそれぞれで作成されたものを削除することで解決できます。