Ubuntu 20.04でPHP 7.4とApache 2.4をDockerでインストールするガイド
目次
Ubuntu 20.04でPHP 7.4およびApache 2.4ウェブサーバーをインストールする方法を説明します。このガイドにはioncubeモジュール、php-mysql、php-pear、php-mbstring、php-curl、php-gd、php-imagick、php-xmlrpc、php-geoip、php-zip、php-soap、php-memcache、php-redisモジュールも含まれています。
この文書で説明されているファイルはGitHubリポジトリでも公開されています。GitHubリポジトリも参照してください。
完成したDockerイメージは次のDocker Hubで利用できます。
Dockerファイルの作成
Dockerで使用する基本ベースをUbuntu 20.04に設定します。
FROM ubuntu:20.04
APTリポジトリを更新およびアップグレードします。
RUN apt-get update -y
RUN apt-get upgrade -y
日本の時間を使用するために、Ubuntuのタイムゾーン関連パッケージをインストールし、タイムゾーンをAsia/Seoulに変更します。
RUN apt-get install -y tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
デフォルトのUbuntuパッケージをインストールします。
RUN apt-get install -y gcc make telnet whois vim git gettext cron mariadb-client iputils-ping net-tools wget
Apache、PHP、およびPHPの拡張パッケージをインストールします。
RUN apt-get install -y apache2 apache2-utils
RUN apt-get install -y php php-dev libapache2-mod-php composer
RUN apt-get install -y php-mysql php-pear php-mbstring php-curl php-gd php-imagick php-xmlrpc php-geoip php-zip php-soap php-memcache php-redis
PHP Mime関連ライブラリをインストールします。
RUN pear install MIME_Type
Apache SSLを設定するためにSSLを有効化し、デフォルトの証明書をインストールします。
RUN mkdir /etc/apache2/ssl
RUN openssl genrsa -out /etc/apache2/ssl/server.key 2048
RUN openssl req -new -days 365 -key /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.csr -subj "/C=KR/ST=Daejeon/L=Daejeon/O=Docker/OU=IT Department/CN=localhost"
RUN openssl x509 -req -days 365 -in /etc/apache2/ssl/server.csr -signkey /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.crt
RUN sed 's//etc/ssl/certs/ssl-cert-snakeoil.pem//etc/apache2/ssl/server.crt/g' /etc/apache2/sites-available/default-ssl.conf > /etc/apache2/sites-available/default-ssl.conf.tmp
RUN sed 's//etc/ssl/private/ssl-cert-snakeoil.key//etc/apache2/ssl/server.key/g' /etc/apache2/sites-available/default-ssl.conf.tmp > /etc/apache2/sites-enabled/000-default-ssl.conf
RUN rm /etc/apache2/sites-available/default-ssl.conf.tmp -f
Apacheで使用するモジュールを有効にします。
RUN a2enmod ssl
RUN a2enmod cache
RUN a2enmod cache_disk
RUN a2enmod expires
RUN a2enmod headers
RUN a2enmod rewrite
Apacheのデフォルトのindex.htmlを削除し、phpinfo()が含まれたindex.phpをコピーします。index.phpファイルはGitHubリポジトリを参照してください。
RUN rm /var/www/html/index.html
COPY index.php /var/www/html/index.php
Apacheで使用するhttpおよびhttpsの設定ファイルをコピーします。これらの設定ファイルはGitHubリポジトリ(000-default.conf、000-default-ssl.conf)を参照してください。
COPY default.conf /etc/apache2/sites-enabled/000-default.conf
COPY default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf
IonCubeモジュールをインストールします
RUN mkdir /root/tmp
RUN cd /root/tmp
RUN wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -O /root/tmp/ioncube_loaders_lin_x86-64.tar.gz
RUN tar -zxvf /root/tmp/ioncube_loaders_lin_x86-64.tar.gz -C /root/tmp
RUN cp /root/tmp/ioncube/ioncube_loader_lin_7.4.so /usr/lib/php/20190902
RUN echo "zend_extension = /usr/lib/php/20190902/ioncube_loader_lin_7.4.so" >> /etc/php/7.4/apache2/php.ini
RUN echo "zend_extension = /usr/lib/php/20190902/ioncube_loader_lin_7.4.so" >> /etc/php/7.4/cli/php.ini
CronデーモンおよびApacheサーバーを実行します。
RUN echo 'service cron start
/usr/sbin/apachectl -D FOREGROUND' > /entrypoint.sh
作業ディレクトリ、ボリューム、ポート、およびエントリーポイントスクリプトを設定します。
WORKDIR /var/www/html
VOLUME ["/var/www/html"]
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
Dockerfileのビルド
次のコマンドを入力してDockerfileをビルドします。ビルドされたイメージはwebserverという名前で保存されます。
$ docker build -t webserver . && docker run -it --rm -p 80:80 -p 443:443 webserver
ビルドが完了したら、正常なテストを行うために次のコマンドを入力してください
$ docker run -it --rm -p 80:80 -p 443:443 webserver
正常に実行されると、ウェブブラウザからhttp://127.0.0.1にアクセスできます。 Dockerイメージのビルドに問題がない場合、次のようにphpinfoが表示されます。
これで、コンソールでCtrl+Cをクリックするとサーバーが停止し、テストのために実行したコンテナは自動的に削除されます。
Dockerコンテナ
次のコマンドを使用して生成されたDockerイメージで実行します。ウェブサーバーポートは80と443(SSL)、ボリュームはホストディレクトリをDockerイメージの/var/www/htmlにマップします。 --nameオプションでコンテナイメージの名前を設定します。
$ docker run -d -p 80:80 -p 443:443 -v [host directory]:/var/www/html --name=webserver webserver
Docker Buildプロセスをスキップし、筆者が直接作成したDockerイメージを使用してコンテナを実行する場合、次のコマンドを使用してDockerコンテナを実行します。
$ docker run -d -p 80:80 -p 443:443 -v [host directory]:/var/www/html --name=webserver dadyzeus/webserver:ubuntu20.04-php7.4-apache