docker-proxy-lamp

docker-proxy-lampなるものを作りました。

Github -> https://github.com/tadaoji/docker-proxy-lamp

概要

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のそれぞれで作成されたものを削除することで解決できます。