[Docker] Docker-composeでさくっとSSL付きCodeigniter環境を構築する

軽量なPHPフレームワーク・CodeIgniterを、Docker-composeでさくっと構築する方法をまとめてみました。SSL付き&&DBとの接続設定もしてあります。

構築方法

公式のコンテナイメージ「php:7.0-apache」をそのまま使うとmysqlとの接続するための拡張がインストールされていないため、CodeIgniterでDBに接続しようとした時に「Call to undefined function mysql_init」エラーが出てしまいます。

ネットでは、「mysqli => mysql」すればOKという掲示板なんかもありますが、mysql_関数はPHP7では廃止されているので利用できません。

そこで今回は、mysqliをインストールするために、PHP公式イメージを少し改変してオリジナルイメージを構築します。と言っても、3行ほどのファイルなので何も難しいことはありません。

流れ

構築には、docker-composeを使いたいので、

  1. Dockerfileを用意
  2. docker-compose build
  3. docker-compose up -d

という流れで進めます。

DBなどは別途用意

なお、今回の事例では、共有ネットワーク「common_link」を使っているのと、nginxプロキシ&SSL用にnginx-proxyコンテナを、DB用にmariadbコンテナをすでに立ち上げている状況からスタートしています。

共有ネットワークの構築はこちらに、nginx-proxyコンテナの構築はこちらに、mariadbコンテナの構築はこちらに、それぞれまとめてあります。

実際に構築してみる

Dockerfileの準備

さて、まずは、Dockerfileを作っていきます。

やりたいことは、

  1. PHPからMYSQL接続ができるように拡張機能をインストール
  2. .htaccessを使えるようにする

この2点だけです。

vi Dockerfile

FROM php:7.0-apache
RUN apt-get update && \
  docker-php-ext-install mysqli mbstring
RUN a2enmod rewrite

これでおしまい。

簡単に解説すると、

ベースとなるPHPの公式イメージを宣言して、

FROM php:7.0-apache

最新情報にアップデート& mysqliや必要拡張をインストール。

RUN apt-get update && \
  docker-php-ext-install mysqli mbstring

インストールが終わったら、mod_rewriteを有効にします。

RUN a2enmod rewrite

こんな感じです。

docker-composeファイルの準備

続いて、docker-compose用のファイルを作成します。

通常は、「image:php:7.0-apache」とするところを、「build: .」としているところが違います。

buildには、読み込みたいDockerfileがあるディレクトリを選びます、「.」はカレントディレクトリという意味です。

その他には、DocumentRoot(/var/www/html)をdocker-compose.ymlがあるディレクトリの「data」ディレクトリに展開する前提にしています。また、「php-apache:」ブロックの環境変数(environment:)は、nginx-proxyコンテナが自動でLet’s EncryptのSSL証明書を取得&更新してくれるための宣言です。不要な場合は決してください。

version: '2'

services:
  data:
    container_name: data
    image: busybox
    restart: always
    stdin_open: true
    tty: true
    volumes:
      - ./data:/var/www/html
    command: /bin/sh

  php-apache:
    build: .
    #image: php:7.0-apache
    hostname: hogehoge.com
    environment:
      VIRTUAL_HOST: hogehoge.com
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: hogehoge.com
      LETSENCRYPT_EMAIL: admin@hogehoge.com
      LETSENCRYPT_TEST: "false"
    volumes:
      - /etc/localtime:/etc/localtime:ro
    volumes_from:
      - data
    external_links:
      - mariadb:mysql
    ports:
      - "80"
    restart: always
    networks:
      - common_link

networks:
  common_link:
    external: true

いざ、起動!!

ここまで出来たら、あとは簡単です。

オリジナルイメージを構築

docker-compose build

サーバーを構築

docker-compose up -d

で完了です。

あとは、dataディレクトリの中にCodeIgniterプロジェクトを保存すれば動きます。


さくっとですが、DockerでSSL付きCodeIgniter環境を構築してみました。

個人的にはdocker buildを食わず嫌いしていたんですが、詳細なカスタマイズをしようと思うと便利な機能だなと思いました。出元のよくわからないコンテナイメージを使うよりも安心できるメリットもありますね。

CodeIgniterは軽量フレームワークなので、今回くらい必要最低限のものだけが入った環境だと、かなり低スペックのサーバーでもサクサク動いてくれるので好きです。