🦊

M1でCakephp2を構築2~Dockerコンテナの作成~

2024/11/13に公開

php7.4のサポートが終わろうとしている(終わってた)この時代にphp5.6を使うCakephp2の環境構築を迫られたときの奮闘記2

さて、前回の記事ではM1でPHP5.6を使用したCakephp2の構築を迫られ、LAMPを試しつつ最終的にdockerへと誘われました。docker狂への第一歩🐳
なんでLAMP諦めてdockerにしたのかが知りたければ下記の記事を参照ください。
https://zenn.dev/kitsune_love/articles/70e9d44ca00ef0

今回の記事では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のイメージを置いてくれている公式サイトを見ると良いです。
https://hub.docker.com/search?image_filter=official&q=

一つのサイトを構築しているのに、なんかよくわからないけどコンテナが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)

docker-compose.yml
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すること
.env
# 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作成

こちらはドキュメントルートを通しつつバーチャルホストを設定します。

./infra/myapp-web/conf/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作成

./infra/myapp-web/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

データベース接続

./app/Config/database.php
# 略

    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