コンテナ上にあるミドルウェア（Apache/MySQL）のバージョンアップ手順

# はじめに

ApacheとMySQLのバージョンアップ手順について調べたのでまとめます。

作業環境はローカル端末のDockerコンテナで、Apache×PHPのWebサーバー+MySQLサーバーの構成です。

バージョンアップは

- Apache: 2.4.38 -> 2.4.59
- MySQL: 8.0.x -> 8.4.0

とし、執筆時点での最新版へのアップデートを考えています。

※Apacheのアップデートの際に使用するAPR、APR-Utilのバージョンは

- APR:        1.7.4
- APR-Util:   1.6.3

となります。

:::note warn
いただいたコメントを受けて追記させていただきます。

本記事ではミドルウェアの永続化および設定に必要なファイル群の管理について言及していないため、実際に運用されている環境でバージョンアップを実施する場合には設定ファイルの管理も考慮する必要があります。

一般的にはホストマシンや別途サービスやツールを使用して外部で管理することになりますが、今回はローカル環境で簡易的にバージョンアップを実施するという目的で執筆したため、考慮不足についてお詫び申し上げます。
:::

# 概要

- ディレクトリ構成
- 各ファイル内容
- コンテナの起動
- Apacheのバージョンアップ
- MySQLのバージョンアップ

# ディレクトリ構成

```
├── docker
│   ├── db
│   │    └── data          // DB永続化用のボリューム
│   └── web
│        └── dockerfile    // Webサーバー用のdockerfile
├── docker-compose.yml
└── index.php
```

# 各ファイル内容

### docker/web/Dockerfile

```Dockerfile
# PHPとApacheの同梱版のイメージを使用
FROM php:7.4.8-apache

# 必要な処理を記述
RUN apt-get update && apt-get install -y vim \
    && apt-get install -y wget
```

### docker-compose.yml

```yml
services:
  web:
    build:                                  // ビルド元のソースを指定
      context: ./docker/web                 // コンテキストパス
      dockerfile: Dockerfile                // dockerfileの名前
    volumes:
      - ./:/var/www/html                    // コンテナ内のhtmlディレクトリとボリュームを紐づけ
    ports:
      - "80:80"                             // ポート指定。デフォルトの80番ポート
    container_name: web                     // コンテナ名

  mysql:
    image: mysql:8.0                        // MySQLのバージョン
    environment:                            // MySQLの情報
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    container_name: mysql
    volumes:
      - ./docker/db/data:/var/lib/mysql     // DB永続化のボリューム設定
```

### index.php

```php
<?php
echo "Hello, World!";
?>
```

# コンテナの起動

Webサーバー用のDockerイメージのビルド

```
// docker-compose.ymlのある階層で

docker compose build
```

イメージの確認

```
docker images

// 結果
apache_workspace_web   latest    xxxxxxxxxxxx   2 minutes ago   466MB
```

コンテナの起動

```
docker compose up -d          // -d デーモンとしてコンテナを起動
```

起動確認

```
docker ps

// 結果
xxxxxxxxxxxx   apache_workspace_web   "docker-php-entrypoi…"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                      web
xxxxxxxxxxxx   mysql:8.0              "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
```

ブラウザで localhost にアクセスして下の画面が表示されれば準備OKです

![スクリーンショット 2024-06-15 133323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7598d9de-6bc5-036e-68cd-96eea2f34cb3.png)

# Apacheのバージョンアップ

【手順】

- コンテナにログイン
- 現在のバージョンを確認
- 各種設定ファイルのバックアップ
- アップデートに必要なツールのダウンロードとインストール
    - Apacheの最新版
        - ダウンロード
    - APR+APR-Util
        - ダウンロード+インストール
- Apacheのインストール
- パスの設定
- 再起動+バージョン確認

<br>

コンテナIDを取得し、Webサーバーのコンテナにログイン

```
docker ps                                    // コンテナIDを取得

docker exec -it コンテナID bash
```

現在のバージョンを確認

```
apachectl -v

// 結果
Server version: Apache/2.4.38 (Debian)
Server built:   2019-10-15T19:53:42
```

設定ファイルのバックアップ

```
cp -r /etc/apache2 /etc/apache2.bak

ls /etc                                       // apache2 apache2.bak
```

アップデートに必要なツールのダウンロード

- Apache 

```
cd /usr/local/src                             // 設定ファイルを配置するディレクトリに移動
wget https://downloads.apache.org/httpd/httpd-2.4.59.tar.gz
tar -xvzf httpd-2.4.59.tar.gz
```

- APR

```
curl -k -O https://dlcdn.apache.org/apr/apr-1.7.4.tar.gz
tar -xvzf apr-1.7.4.tar.gz
cd apr-1.7.4
./configure                                       // 設定を認識させる 
make
make install 
```

- APR-Util

```
apt-get update
apt-get install -y libssl-dev
apt-get install -y zlib1g-dev
apt-get install -y libexpat1-dev
apt-get install -y libpcre3 libpcre3-dev
cd /usr/local/src
curl -k -O https://downloads.apache.org/apr/apr-util-1.6.3.tar.gz
tar -xvzf apr-util-1.6.3.tar.gz
cd apr-util-1.6.3
./configure --with-apr=/usr/local/apr  　　       // apr-utilをaprに認識させる
make
make install
```

Apache のインストール

```
cd ../httpd-2.4.59
mv ../apr-1.7.4 srclib/apr                        // srclib内に配置して認識させる
mv ../apr-util-1.6.3 srclib/apr-util              // 上記と同様
./configure --prefix=/usr/local/apache2 --with-included-apr --enable-so --enable-ssl --with-mpm=event
make
make install
```

環境変数にパスを設定する

```
export PATH=/usr/local/apache2/bin:$PATH
```

再起動 + バージョンを確認

```
apachectl restart
apachectl -v

// 結果
Server version: Apache/2.4.59 (Unix)
Server built:   Jun 15 2024 05:13:16
```

バージョンが更新され、ブラウザでlocalhostにアクセスして無事に表示されれば完了

# MySQLのバージョンアップ

【手順】

- 現在のバージョンを確認
- テーブル情報や設定ファイルのバックアップ
- docker-compose.yml のバージョンを変更しコンテナを再起動
- バージョンの確認

現在のバージョンを確認

```
docker exec -it コンテナID mysql -V

// 結果
mysql  Ver 8.0.37 for Linux on x86_64 (MySQL Community Server - GPL)
```

テーブル情報や設定ファイルのバックアップ

```
※ホストにマウントしている永続化用のファイルがあればコピーしてバックアップを取得
```

docker-compose.yml のバージョンを変更しコンテナを再起動

```yml
    mysql:
        # image: mysql:8.0
        image: mysql:8.4.0
        environment:
```

```
docker stop コンテナID
docker remove コンテナID
docker ps -a
docker compose up -d
docker ps                       // MySQLのコンテナだけが起動し直すことを確認
```

バージョン確認

```
docker exec -it コンテナID mysql -V

// 結果
mysql  Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)
```

バージョンが更新されていれば完了

# 最後に

実際にアプリケーションを運用している場合はバージョンの差異によるエラーが発生するはずなので、必要に応じて対応しましょう。