baserCMS5がリリースされたのでLinux環境にインストールします。WindowsにもDocker Desktopをインストールすることで実現できます。その場合、Windows版のgitなどをインストールする必要があるかもしれません。Windowsの機能であるWSLを用意すればLinux環境を構築することもできます。
公式ページのインストール手順を参考に進めます。OracleCloudに作成したlinuxのインスタンスに接続して作業します。OracleCloudで本番環境を構築できたので、AWS、Google Cloud、Azureにもインストールできるでしょう。
まず最初に、baserCMSのクローンを作成します。
git clone https://github.com/baserproject/basercms.git
作成したディレクトリに移動してファイルを確認するとdockerの関連ファイルがあるディレクトリがあるのでそこへ移動します。
cd basercms
cd docker
docker-compose.yml.defaultの中身をみて、使用しているイメージを確認します。記述内容は以下のようになっていました。
version: '3'
# volumes:
# db-volume: # windowsの場合はコメントを外す
services:
bc-db:
container_name: bc-db
image: mysql:8.0
volumes:
- ./volumes/mysql:/var/lib/mysql
# - db-volume:/var/lib/mysql # windowsの場合はコメントを外し、上の行をコメントアウトする
- ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "basercms"
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --innodb-use-native-aio=0 --default_authentication_plugin=mysql_native_password
bc-php:
container_name: bc-php
image: baserproject/basercms:php8.1
volumes:
- ../:/var/www/html:delegated
environment:
PHP_IDE_CONFIG: "serverName=localhost"
XDEBUG_MODE: "debug"
XDEBUG_SESSION: "1"
COMPOSER_ALLOW_SUPERUSER: 1
ports:
- "80:80"
- "443:443"
depends_on:
- bc-db
command: bash -c "/var/www/html/docker/bin/init.sh && apache2-foreground"
bc-smtp:
container_name: bc-smtp
image: schickling/mailcatcher
ports:
- "1080:1080"
- "1025:1025"
bc-pma:
container_name: bc-pma
image: phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=bc-db
- PMA_USER=root
- PMA_PASSWORD=root
links:
- bc-db
ports:
- 8080:80
volumes:
- ./phpmyadmin/sessions:/sessions
bc-pg:
image: postgres:15.2
container_name: bc-pg
ports:
- 5432:5432
volumes:
- ./volumes/postgres:/var/lib/postgres
- ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
user: root
bc-pga:
image: dpage/pgadmin4:7.8
container_name: bc-pga
ports:
- 8000:80
volumes:
- ./pgadmin:/var/lib/pgadmin/storage
environment:
PGADMIN_DEFAULT_EMAIL: foo@example.com
PGADMIN_DEFAULT_PASSWORD: root
depends_on:
- bc-pg
ファイル全体の概要
このファイルは、複数のコンテナ(仮想的なサーバー)をまとめて設定・管理するためのものです。それぞれのコンテナは、特定の役割(データベース、ウェブサーバー、メールキャッチャーなど)を担っています。
version: '3'
これは、この設定ファイルが使うDocker Composeのバージョンを示しています。バージョン3は、現在広く使われているものです。
services:
ここから下で、複数のサービス(コンテナ)が定義されています。それぞれのサービスは、bc-db
、bc-php
、bc-smtp
などのように名前がついており、それぞれの設定が書かれています。
1. bc-db
(データベース用のコンテナ)
container_name
:bc-db
という名前でコンテナを作成します。image
:mysql:8.0
というMySQLのバージョン8.0のイメージを使います。volumes
:./volumes/mysql:/var/lib/mysql
: ホスト(あなたのPC)の./volumes/mysql
ディレクトリを、コンテナ内の/var/lib/mysql
にマウントします。これにより、データベースデータがホストに保存されます。# - db-volume:/var/lib/mysql
: Windowsを使っている場合は、上の行をコメントアウトし、この行のコメントを外して使います。./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
: データベース初期化用のスクリプトを格納するためのディレクトリです。
ports
:3306:3306
で、MySQLの標準ポート3306を外部に公開します。environment
: 環境変数として、ルートパスワードやデータベース名を設定します。command
: MySQLの設定を行うためのコマンドです。
2. bc-php
(PHPとApacheを使うウェブサーバー用のコンテナ)
container_name
:bc-php
という名前でコンテナを作成します。image
:baserproject/basercms:php8.1
というbaserCMSのイメージを使います。volumes
:../:/var/www/html:delegated
: ホストの1つ上のディレクトリをコンテナ内の/var/www/html
にマウントします。これにより、ウェブコンテンツがホストに保存されます。
environment
: PHPのデバッグ設定や、ComposerというPHPのパッケージ管理ツールの設定を行います。ports
:80:80
: HTTP用のポート80を公開します。443:443
: HTTPS用のポート443を公開します。
depends_on
:bc-db
コンテナが先に起動するように設定します。command
: 起動時に実行するコマンドです。/var/www/html/docker/bin/init.sh
を実行してから、Apache(ウェブサーバー)を起動します。
3. bc-smtp
(メールキャッチャー用のコンテナ)
container_name
:bc-smtp
という名前でコンテナを作成します。image
:schickling/mailcatcher
というメールキャッチャーのイメージを使います。メールキャッチャーはテスト用に送信されるメールを受け取るためのものです。ports
:1080:1080
: メールキャッチャーのウェブインターフェースにアクセスするためのポートです。1025:1025
: メールサーバーのポートです。
4. bc-pma
(phpMyAdmin用のコンテナ)
container_name
:bc-pma
という名前でコンテナを作成します。image
:phpmyadmin
というデータベース管理ツールのイメージを使います。environment
: phpMyAdminの設定です。データベース接続情報を指定します。links
:bc-db
コンテナと接続するためにリンクします。ports
:8080:80
で、phpMyAdminにアクセスするためのポート8080を公開します。volumes
:./phpmyadmin/sessions:/sessions
で、phpMyAdminのセッションデータを保存します。
5. bc-pg
(PostgreSQL用のコンテナ)
container_name
:bc-pg
という名前でコンテナを作成します。image
:postgres:15.2
というPostgreSQLデータベースのイメージを使います。ports
:5432:5432
で、PostgreSQLにアクセスするためのポート5432を公開します。volumes
:./volumes/postgres:/var/lib/postgres
: PostgreSQLデータをホストに保存します。./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
: データベース初期化用のスクリプトを格納します。
environment
: PostgreSQLの初期設定です。user
:root
としてコンテナを実行します。
6. bc-pga
(pgAdmin用のコンテナ)
container_name
:bc-pga
という名前でコンテナを作成します。image
:dpage/pgadmin4:7.8
というpgAdminのイメージを使います。pgAdminはPostgreSQLを管理するためのツールです。ports
:8000:80
で、pgAdminにアクセスするためのポート8000を公開します。volumes
:./pgadmin:/var/lib/pgadmin/storage
で、pgAdminの設定をホストに保存します。environment
: pgAdminの初期設定を行います。depends_on
:bc-pg
コンテナが先に起動するように設定します。
baserCMSをDockerでセットアップする手順
テスト用のコンテナを立ち上げる
まず、PHPコンテナのみを立ち上げます。この時点では、データベースが別のマシンにあり、phpMyAdminも使用しない設定です。
コマンドは以下の通りです:
docker run --name test -d baserproject/basercms:php8.1
このコンテナはテスト用で、baserCMSの動作に必要なファイルを確認し、後でホストにコピーするために使用します。
コンテナに入り、主要なファイルの場所を確認する
コンテナにアクセスして、重要なファイルがどこにあるかを確認します。これを行うには、以下のコマンドを使用します:
docker exec -ti test bash
確認すべきファイルの場所は以下の通りです:
- /etc/apache2 → ウェブサーバーの設定ファイル
- /usr/local/etc/php → PHP関連の設定ファイル
- /var/www/html → ドキュメントルート(ウェブコンテンツのルートディレクトリ)
ホストにファイルをコピーする
主要なファイルをホスト側にコピーして、後から設定を変更できるようにします。以下のコマンドを実行します:
docker cp test:/usr/local/etc/php /root/bc-php/
docker cp test:/etc/apache2 /root/bc-apache2/
テスト用コンテナを停止して削除する
必要なファイルをコピーしたら、テスト用コンテナはもう必要ないので、以下のコマンドで停止して削除します:
docker stop test
docker rm test
本番環境でコンテナを立ち上げる
コピーしたファイルをマウントして、本番環境で使用するコンテナを立ち上げます。このとき、ホストにある設定ファイルをコンテナ内にマウントすることで、設定が反映されます。以下のコマンドを使用します:
docker run \
--name bc \
-p 8080:80 \
-v /root/bc-php:/usr/local/etc/php \
-v /root/bc-apache2:/etc/apache2 \
-v /root/basercms:/var/www/html \
-d baserproject/basercms:php8.1
具体的な説明の方向性
1. データベースが別の場所にある場合の注意点
この記事では、データベースが別のマシンやサーバーに存在する前提で説明を進めています。そのため、docker-compose.yml.default
ファイル内のデータベース関連の設定(bc-db
やbc-pg
など)は不要となります。データベースが外部にある場合、PHPコンテナのみを起動し、そこに外部データベースとの接続設定を行う必要があります。
2. PHPコンテナのみのセットアップ手順
まず、テスト用のPHPコンテナを立ち上げ、コンテナ内の設定ファイルをホストにコピーします。この手順は、後でホストにコピーしたファイルをマウントして本番環境用のコンテナを起動するために必要です。
docker run --name test -d baserproject/basercms:php8.1
コンテナ内の設定ファイルをホストにコピーするためには、以下のコマンドを使用します。
docker exec -ti test bash
docker cp test:/usr/local/etc/php /root/bc-php/
docker cp test:/etc/apache2 /root/bc-apache2/
テスト用コンテナを停止して削除した後、ホストにコピーしたファイルをマウントして、本番用のコンテナを起動します。
docker run \
--name bc \
-p 8080:80 \
-v /root/bc-php:/usr/local/etc/php \
-v /root/bc-apache2:/etc/apache2 \
-v /root/basercms:/var/www/html \
-d baserproject/basercms:php8.1
3. docker-compose.yml.defaultファイルの利用について
上記の手順を理解した上で、もしデータベースをローカルでセットアップしたい場合には、docker-compose.yml.default
ファイルを利用して、すべてのサービスを一括で管理することも可能です。ただし、データベースが外部にある場合は、このファイルを利用する必要はありません。
4. 読者向けの提案文案「データベースが外部にある場合」
もし既に他のサーバーにデータベースを持っている場合は、docker-compose.yml.default
ファイルを使用せず、上記の手順に従ってPHPコンテナのみを起動してください。この場合、データベース関連の設定は不要です。
簡単にセットアップする方法
もし、複雑な手順を避けて簡単にセットアップしたい場合、docker-compose.yml
を使用するのが便利です。このファイルには、必要なコンテナ(PHP、データベース、メールキャッチャーなど)の設定がすべて含まれています。
セットアップ手順
ファイルの配置
docker-compose.yml
ファイルをプロジェクトのルートディレクトリ(basercms
ディレクトリ)に配置します。
コマンドの実行
以下のコマンドを実行するだけで、すべてのサービスが一括で起動します。
docker compose up -d
このコマンドは、docker-compose.yml
ファイルに基づいて、すべてのコンテナをバックグラウンドで起動します。短時間でセットアップが完了し、すぐにbaserCMSの動作確認ができるようになります。
Windowsユーザーへの注意
ボリューム設定
Windowsを使用している場合は、docker-compose.yml
ファイル内のコメント行を変更する必要があります。具体的には、db-volume
のコメントを外し、上の行をコメントアウトします。
ホスト側のポート許可設定
セットアップ後、ブラウザでbaserCMSにアクセスする前に、ホスト側で使用するポートのトラフィックを許可する必要があります。特に、8080
ポートを使用する場合、以下のコマンドで許可します:
ufw allow 8080/tcp
また、OracleCloudを利用している場合は、セキュリティルールにおいてイングレスルールを追加し、ポート8080
へのアクセスを許可することを忘れないようにします。この設定が不十分だと、ブラウザからのアクセスがブロックされることがあります。
ブラウザでのアクセス確認
すべての設定が完了したら、ブラウザで以下のURLにアクセスして、baserCMSが正常に動作しているかを確認します。
http://IPアドレス:8080/
アクセスした際にエラーが発生した場合は、その都度上記のトラブルシューティングを参考に対処してください。
書き込み権限がないと表示されたので、basercmsにあるいくつかのディレクトリのパーミッションを変更します。
書き込み権限のエラー
- アクセスした際に「書き込み権限がない」と表示された場合、以下のディレクトリのパーミッションを変更する必要があります
cd basercms
chmod 777 composer vendor tmp logs config
- このコマンドを実行することで、必要なディレクトリに書き込み権限が付与され、エラーが解消されます。
再びブラウザでアクセスして確認すると、先のエラーは直ったようですが新たなエラーが発生しました。
ライブラリのインストールに失敗しました。
コマンド実行をお試しください
cd /var/www/html/; export HOME=/var/www/html/composer/ ; yes | /usr/local/bin/php /var/www/html/composer/composer.phar update
ライブラリのインストール失敗
この手順により、composer.phar
が作成され、必要なライブラリがインストールされます。
ライブラリのインストールに失敗した場合、以下のコマンドを実行して手動でインストールを試みますcd /var/www/html/
export HOME=/var/www/html/composer/
yes | /usr/local/bin/php /var/www/html/composer/composer.phar update
もしくはコンテナに入って以下のコマンドを入力して問題を解決します。
docker exec -ti bc bash
cd composer
./composer.phar self-update
./composer.phar install
さらにconfigディレクトリにある環境設定ファイルの名前を使用できるように変更します。
cp .env.example .env
進めなくなったのでもう一度アクセスしなおします。
http://IPアドレス:8080/
またも書き込み権限のエラーがでましたが、先のように対処します。
chmod 777 plugins webroot/files db
管理ページにアクセスできない問題
- baserCMSの管理ページにアクセスできない場合、URLアドレスに
localhost
が入力されてしまっていることが原因かもしれません。この場合、config
ディレクトリ内の環境設定ファイルを編集してURLアドレスを正しく設定します。vi .env
SITE_URL
やSSL_URL
には通常のドメイン名を入力します。リバースプロキシ経由でアクセスする場合は、SITE_URL
をhttp
に設定し、ADMIN_SSL
をfalse
に設定する必要があります。
baserCMSにあるconfigディレクトリの環境設定ファイルを編集しないとurlアドレスにlocalhostが入ってしまうのでファイルを編集します。
vi .env
SITE_URL
やSSL_URL
には通常のドメイン名を入力します。リバースプロキシ経由でアクセスする場合は、SITE_URL
をhttp
に設定し、ADMIN_SSL
をfalse
に設定する必要があります。
自分の環境ではLAN内はhttpで通信をしているからです。また、この場合、ADMIN_SSLはfalseにしないとエラーになります。