M1でCakephp2を構築2~Dockerコンテナの作成~
php7.4のサポートが終わろうとしている(終わってた)この時代にphp5.6を使うCakephp2の環境構築を迫られたときの奮闘記2
さて、前回の記事ではM1でPHP5.6を使用したCakephp2の構築を迫られ、LAMPを試しつつ最終的にdockerへと誘われました。docker狂への第一歩🐳
なんでLAMP諦めてdockerにしたのかが知りたければ下記の記事を参照ください。
今回の記事ではCakephp2が動く環境のdocker構築をしていきます。
docker環境を作成するのが初めての人のためにも、なるべく細かめにいきたいと思います。
概念理解系人種なので何か間違いがあればコメントで補足お願いします。
*ちなみになんやかんやでubuntuが立ち上がらない時はDocker Desktopのバージョンが新しすぎるというのがあります。筆者は4.24.2 (124339)です。最新のOSアップデートが来るたびにslackやzoomのweb会議、VPNと干渉してしまうけど再起動すれば動くしOK
Docker構築での注意点
まず、dockerを構築する際に多くの方はGitからクローンしてね、と書かれていることが多いかと思います。なぜか。
フォルダの階層や名前が変わると立ち上がらなくなるから
紹介されているサイトのdockerを構築したいのであれば、アレンジを加える前に、立ち上げてどう動くかを確認すると良いでしょう。初心者がdockerの構築されている正解の状況もわからずカスタマイズすることは無謀です。聞いてますか2年前の私。
dockerコンテナとdocker-compose.yml
dockerではubuntu(Linux)やphp(言語)、MySQL(データベース)、Apache(Webサーバー)などのコンテナが種類ごとに一つずつ作成されます。どんなものがあるかはdockerのイメージを置いてくれている公式サイトを見ると良いです。
一つのサイトを構築しているのに、なんかよくわからないけどコンテナが3つできている!という状況はよくあるお話です。合っているので心配しないでください。
さて、そんなたくさんできるコンテナを一つのサイトで関連付けて動かすために使われるのが、docker-compose.yml
という設定ファイルです。
docker-compose.yml
に
- webサーバーはこのバージョンを使用して、ポートは〇〇番を利用する。
- webサーバーからデータベースを参照できるようにする。
- データベースに入れるようにユーザー名とパスワードを作成する
などなど様々な設定を記述することになります。
ただ、設定を記述する際にdocker-compose.yml
だけあれば良いと言うものではありません。例えば、docker-compose.yml
にMySQLのmy.confをdocker-compose.yml
と同階層の「MySQL」フォルダの「my.conf」ファイルで上書きすると言った階層移動を伴ったファイルの指定などがあったりするのです。ここで「MySQL」フォルダを「DB」という名前に変更した場合、docker-compose.yml
を更新しないとエラーになります。指定しているファイルがないのだからそりゃそうなのじゃ。
dockerでは起動する時にこのymlを毎回実行して環境を変動させます。
dockerAでymlにmysql:8、 dockerBのymlにmariadb:10.5と書かれている場合、dockerAを立ち上げれば、データべースはmysql8が設定されている状態、
dockerAを停止してdockerBを立ち上げればデータベースはmariadb10.5になります。
つまり、このdocker-compose.yml
のおかげで、PJごとのバージョン管理が簡単になる上、OSを超えたWindowsでも手を加えることはなく、同じ環境を立ち上げることができるのです。
さてさてさて、では本題です。
Docker構築
フォルダ構成
/project_dir
├ infra/
│ ├ initdb/
│ │ └ initial.sql
│ │
│ └ myapp-web/
│ ├ conf/
│ | └ 000-default.conf
│ └ Dockerfile
├ .env
└ docker-compose.yml
docker-compose.ymlの作成
まずPJ直下にdocker-compose.yml
を作成します。ymlはインデントがズレるとエラーで起動しなくなるため、コード補完を入れておくと良いです。(vscodeのおすすめ拡張機能:https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
services:
# ubuntu-Apache
ubuntu-Apache:
env_file: ./.env
container_name: "${PHP_NAME}"
# ./infra/myapp-web/Dockerfile でイメージをビルド
build:
context: ./infra/myapp-web
dockerfile: Dockerfile
# db 起動後に ubuntu-Apache を起動
depends_on:
- mysql
# 80 番ポートを割り当て
ports:
- "${IP}:80:80"
# コンテナの /var/www/html にマウント
volumes:
- ".:/var/www/html"
- "./infra/myapp-web/conf/000-default.conf:/etc/apache2/sites-available/000-default.conf"
# mariadb
mysql:
image: mariadb:10
container_name: "${MYSQL_CONTAINER_NAME}"
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time-zone=Asia/Tokyo
volumes:
- "./initdb:/docker-entrypoint-initdb.d"
environment:
TZ: Asia/Tokyo
MYSQL_DATABASE: "${MYSQL_DATABASE}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
ports:
- "${IP}:3306:3306"
解説
作成されるコンテナは2つ、ubuntu-apache、mysql
mysqlを起動した後にubuntu-apacheを立ち上げる構成
${}で囲まれた部分は.env(環境設定)からデータをとっています。各々のPCで設定値をいじれるように.envで管理すると楽です
mysqlで初期値で入れておきたいsqlデータがあればinfra/initdb/initial.sql
ここを置き換えてください
.env作成
- 各自で書き換えてください(既存のコンテナと同じ名前のコンテナは作成できないので注意)。git使用の場合は必ずgitignoreすること
# DOCKER
IP=127.0.0.1
# phpコンテナ名
PHP_NAME=myapp-ubuntu-apache
# mysqlコンテナ名および接続情報
MYSQL_CONTAINER_NAME=myapp-mysql
MYSQL_HOST=myapp-mysql
MYSQL_DATABASE=myapp
MYSQL_USER=user
MYSQL_PASSWORD=password
MYSQL_ROOT_PASSWORD=password
000-default.conf作成
こちらはドキュメントルートを通しつつバーチャルホストを設定します。
<VirtualHost *:80>
<Directory /var/www/html>
Options -Indexes +SymLinksIfOwnerMatch
AllowOverride All
Require all granted
</Directory>
ServerName localhost
ServerAlias localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /health_check /var/www/html
</VirtualHost>
Dockerfile作成
FROM ubuntu/apache2:2.4-22.04_beta
# timezoneの設定
ENV TZ=Asia/Tokyo
ENV DEBIAN_FRONTEND=noninteractive
# Composer のハッシュ値
ARG composer_var=2.2.6
ARG composer_hash=1d58486b891e59e9e064c0d54bb38538f74d6014f75481542c69ad84d4e97704
# Composer の保存先
ARG composer_path=/usr/local/bin/composer
RUN apt-get update \
# PHP5.6のインストール(PPA Repository必須)
&& apt-get install -y software-properties-common \
&& add-apt-repository ppa:ondrej/php \
&& apt-get install -y php5.6 \
&& apt-get install -y php5.6-pdo php5.6-intl php5.6-xml php5.6-zip php5.6-mbstring phpunit php5.6-mysql php5.6-sqlite3 php5.6-curl php5.6-mcrypt php5.6-gd \
# Composer インストール
&& php -r "copy('https://getcomposer.org/download/${composer_var}/composer.phar', '$composer_path');" \
&& chmod 755 $composer_path \
&& php -r "if (hash_file('sha256', '$composer_path') !== '$composer_hash') { \
echo '!!! Failed to install Composer !!!'; \
unlink('$composer_path'); \
} \
echo PHP_EOL;"
RUN apt-get install -y vim \
&& apt-get install -y unzip \
# PHP の intl 拡張 (CakePHPで必要)
&& apt-get install -y libicu-dev \
# mod_rewrite 有効化
&& a2enmod rewrite
RUN unattended-upgrade \
&& apt-get autoremove
解説
php5.6を入れるのにPPA Repositoryが必要なのでインストールしてからphp5.6インストールを実行します
&& apt-get install -y software-properties-common \
&& add-apt-repository ppa:ondrej/php \
&& apt-get install -y php5.6 \
dockerの起動
ターミナルで実行
cd project_dir
docker compose up -d
bind: can't assign requested addressと出た場合
M1では初期で127.0.0.1以外のローカルループバックアドレス使えないので、
sudo ifconfig lo0 alias 127.0.0.1
(127.0.0.1は.envのIPの値に書き換えてください)
を実行した後に docker-compose up -d
する
*dockerfileの変更やymlの変更があれば、以下のコマンドでコンテナの再作成ができます
cd project_dir
docker compose up -d --build
cakephp2との接続
cd project_dir
# .envの`PHP_NAME=myapp-ubuntu-apache`の値を使う
docker exec -it myapp-ubuntu-apache bash
composer install
composer installができない場合
php -r "copy('https://getcomposer.org/download/2.2.6/composer.phar', 'composer-setup.php');"
php -r "if (hash_file('sha256', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
composer install
データベース接続
# 略
public $local = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
// .envのMYSQL_HOST=myapp-mysql
'host' => 'myapp-mysql',
// .envのMYSQL_USER=user
'login' => 'user',
// .envのMYSQL_PASSWORD=password
'password' => 'password',
// .envのMYSQL_DATABASE=myapp
'database' => 'myapp',
'prefix' => '',
'encoding' => 'utf8'
);
# 略
これで一連の動作は終了です。
Discussion