26
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EC-CUBE4系の公式リポジトリにDockerfileが追加されたので実際に使ってみた

Last updated at Posted at 2019-10-14

EC-CUBEのVer4.0.3から公式リポジトリにDockerfileが追加されていたので実際に使ってみました。

なお。ここに書いている情報はDockerを使い始めてまだ3か月の初学者が勉強を兼ねて執筆したものなので、間違いなどがあればコメント欄でご指摘いただければ幸いです。

以下のリンク先はEC-CUBE4系公式リポジトリのDockerfileになります。
ec-cube/Dockerfile at 4.0 · EC-CUBE/ec-cube - GitHub

実際に動かしてみる

Dockerイメージの作成

ec-cubeのルートディレクトリ(Dockerfileがあるディレクトリ)で以下のコマンドを実行し、Dockerイメージを作成します。

$ docker build -t eccube4-php-apache .

実行後、$ docker imagesコマンドで以下の2つのDockerイメージが作成されていることを確認します。

REPOSITORY           TAG                  IMAGE ID            CREATED
eccube4-php-apache   latest               ************        ◯ days ago
php                  7.3-apache-stretch   ************        ◯ weeks ago

Dockerコンテナを起動する

作成されたDockerイメージをもとにDockerコンテナを起動します。

以下はローカルディレクトリをマウントする場合のコマンドです。
$PWDのところはec-cubeのワーキングディレクトリのフルパスを入力してください。

docker run --name ec-cube -p "8080:80" -p "4430:443"  -v "$PWD/html:/var/www/html/html:cached" -v "$PWD/src:/var/www/html/src:cached" -v "$PWD/app:/var/www/html/app:cached" eccube4-php-apache

実行後、$ docker container ps -aコマンドでコンテナが正常に起動していることを確認します。
以下のように表示されれば問題なくコンテナが起動しています。

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                         NAMES
************        eccube4-php-apache   "docker-php-entrypoi…"   ◯ days ago          Up ◯ seconds        0.0.0.0:8080->80/tcp, 0.0.0.0:4430->443/tcp   ec-cube

コンテナ起動後、ブラウザでhttp://127.0.0.1:8080/にアクセスすればEC-CUBE SHOPのトップページが表示されます。
Screen Shot 2019-10-15 at 5.07.13 AM.png

【参考】
Dockerを使用してインストールする - EC-CUBE4.0開発ドキュメント

MySQLを使用する

MySQLを使用したい場合はまず以下のコマンドでMySQL用のコンテナを作成します

docker run --name container_mysql -e MYSQL_ROOT_PASSWORD=password  -d -p 3306:3306 mysql:5.7

コンテナが作成できたら、cube4_devというDBを作成します。

## 以下のコマンドで作成したMySQLのコンテナに入ります。
docker exec -it container_mysql bash

## コンテナに入ったらrootユーザーでMySQLにログインします。(パスワードは"password")
mysql -u root -p

## DBを作成します。
mysql> CREATE DATABASE cube4_dev;

DBを作成したら、ec-cubeコンテナがMySQLコンテナと通信できるように以下のコマンドでec-cubeコンテナを作り直します
なお、今回はローカルディレクトリをマウントする方法を紹介しています。
$PWDのところはec-cubeのワーキングディレクトリのフルパスに変えてください。

docker run --name ec-cube -p "8080:80" -p "4430:443"  -v "$PWD/html:/var/www/html/html:cached" -v "$PWD/src:/var/www/html/src:cached" -v "$PWD/app:/var/www/html/app:cached" --link container_mysql:db eccube4-php-apache

docker container ps -aを実行すると作成した2つのコンテナを確認できます。

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                         NAMES
************        eccube4-php-apache   "docker-php-entrypoi…"   ◯  minutes ago      Up ◯  minutes       0.0.0.0:8080->80/tcp, 0.0.0.0:4430->443/tcp   ec-cube
************        mysql:5.7            "docker-entrypoint.s…"   ◯  minutes ago      Up ◯  minutes       0.0.0.0:3306->3306/tcp, 33060/tcp             container_mysql

2つのコンテナが作成できたらec-cubeコンテナに入り以下のコマンドを実行しDBをSQLiteからMySQLに変更します
以下のDatabase Url以外はそのままEnterでOKです。

bin/console eccube:install

 Database Url [sqlite:///var/eccube.db]:
 > mysql://root:password@db/cube4_dev

 Mailer Url [null://localhost]:
 > 

 Auth Magic [xxxxxxxxxxxxxxxx]:
 >

 !                                                                                                                      
 ! [CAUTION] Execute the installation process. All data is initialized.                                                 
 !                                                                                                                      

 Is it OK? (yes/no) [yes]:
 > 

実行後、以下のように表示されれば問題ありません。
[OK] EC-CUBE installation successful.

EC-CUBEの管理画面にログインし、システム情報のDBサーバーが変更されていることを確認します。
なお、管理画面のログインIDはadmin、パスワードはpasswordです。
Screen Shot 2019-10-15 at 5.47.37 AM.png

【参考】
Dockerを使用してインストールする(MySQLを使用する場合) - EC-CUBE4.0開発ドキュメント

Dockerfileの中身を詳しく見てみる

ベースイメージ

FROM php:7.3-apache-stretch

イメージはPHP7.3Apacheが一つのコンテナに含まれているphp:7.3-apache-stretchをベースとして使用しています。なお、OSのVersionはDebian9.0(stretch)を指定しています。

環境変数の設定

ENV APACHE_DOCUMENT_ROOT /var/www/html

環境変数APACHE_DOCUMENT_ROOTを設定します。

CDNミラーの設定

RUN echo "deb http://cdn.debian.net/debian/ stretch main contrib non-free" > /etc/apt/sources.list.d/mirror.jp.list
RUN echo "deb http://cdn.debian.net/debian/ stretch-updates main contrib" >> /etc/apt/sources.list.d/mirror.jp.list

# デフォルトで作成されるsources.listディレクトリを削除している
RUN /bin/rm /etc/apt/sources.list

/etc/apt/sources.list.d/mirror.jp.listを作成し、CDNミラーを利用できるように設定を書き込んでいます。

【参考】
CDNミラーを使うには - Debian JP Project

パッケージのインストール

RUN apt-get update \
  && apt-get install --no-install-recommends -y \
    apt-transport-https \
    apt-utils \
    build-essential \
    curl \
    debconf-utils \
    gcc \
    git \
    gnupg2 \
    libfreetype6-dev \
    libicu-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libpq-dev \
    libzip-dev \
    locales \
    ssl-cert \
    unzip \
    vim \
    zlib1g-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* \
  && echo "en_US.UTF-8 UTF-8" >/etc/locale.gen \
  && locale-gen

主に開発に必要なパッケージをインストールし、localeのコンパイルをします。

apt-get update
インストール可能なパッケージの一覧を更新する。

apt-get install
パッケージをインストールする。
--no-install-recommendsオプションで必須ではないrecommendsのパッケージをインストールしないようにしている。
-yオプションで「Yes or No」の問い合わせはすべて「y」と答えるようにしている。

apt-get clean
アーカイブファイルを削除する。

rm -rf /var/lib/apt/lists/*:
パッケージのインデックスファイルが格納されている/var/lib/apt/listsを空にする。

echo "en_US.UTF-8 UTF-8" >/etc/locale.gen
en_US.UTF-8とUTF-8を有効にする。

locale-gen
localeをコンパイする。

【参考】
debianパッケージ周りでよく使うコマンドとオプション - sonots:blog
ロケール - ArchWiki
Linuxのlocaleについてちょっとした知識 - Unskilled

PHPライブラリのインストール

RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
  && docker-php-ext-install -j$(nproc) zip gd mysqli pdo_mysql opcache intl pgsql pdo_pgsql

docker-php-ext-configure
pgsqlの設定をカスタマイズする。

docker-php-ext-install
PHPのライブラリをインストールします。
なお、-jオプションで同時に実行できるジョブ数を**$(nproc)**に指定します。

【参考】
docker-php-ext-xxx-について 本番運用に備えたPHP7.3.0のコンテナを作る - Qiita
システム要件 - EC-CUBE 4.0 開発ドキュメント

APCuのインストール

RUN pecl install apcu && echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apc.ini

PHPアクセラレータのAPCuをインストールします。
PHPアクセラレータとはPHPを高速化する拡張機能のことです。

~/php/conf.d/apc.iniextension=apcu.soを書き込みインストールしたAPCuを有効にします。

【参考】
PHP7をOPcacheとAPCuで高速化する - 己で解決!泣かぬなら己で鳴こうホトトギス

Apacheの設定

RUN mkdir -p ${APACHE_DOCUMENT_ROOT}
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

1行目
${APACHE_DOCUMENT_ROOT}のディレクトリを作成します。
-pオプションで親ディレクトリも作成します。

2行目
sedコマンドで*/etc/apache2/sites-available/*にあるconfファイルに書かれている/var/www/html${APACHE_DOCUMENT_ROOT}に書き換えます。

3行目
sedコマンドで*/etc/apache2/apache2.conf/etc/apache2/conf-available/*にあるconfファイルに書かれている/var/www/${APACHE_DOCUMENT_ROOT}に書き換えます。

【参考】
【 sed 】 文字列の置換,行の削除を行う - 日経 xTECH
sedでスラッシュを含む文字列を置換したい - Corredor

Apacheモジュールの有効化

RUN a2enmod rewrite
RUN a2enmod headers

1行目:リダイレクトやURLの書き換えを行うmod_rewriteを有効にする。
2行目:HTTPのリクエストヘッダと応答ヘッダを制御するmod_headersを有効にする。

【参考】
モジュール一覧 - Apache HTTPサーバ

SSLの設定

RUN a2enmod ssl
RUN ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf
EXPOSE 443

1行目
sslモジュールを有効にする。

2行目
/etc/apache2/sites-available/default-ssl.confへのシンボリックリンク/etc/apache2/sites-enabled/default-ssl.confを作成します。

3行目
ポート443を開放します。

【参考】
「ls -l」コマンドの表示からファイルの属性を理解しよう (3/4) - @IT

php.iniの設定

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY dockerbuild/php.ini $PHP_INI_DIR/conf.d/

1行目
php.ini-productionをもとにphp.iniを作成します。

2行目
dockerbuild/php.ini$PHP_INI_DIR/conf.d/にコピーします。

【参考】
php - Docker Hub

Composer

RUN curl -sS https://getcomposer.org/installer \
  | php \
  && mv composer.phar /usr/bin/composer \
  && composer config -g repos.packagist composer https://packagist.jp \
  && composer global require hirak/prestissimo

ENV COMPOSER_ALLOW_SUPERUSER 1

curlコマンドでPHPのパッケージ依存管理ツールであるComposerをインストールし、composer.pharをPATHの通っている/usr/bin/composerに移動します。

composer configでpackagistのミラーサーバを日本国内のサーバに変更し、composer global requireでComposerを速くするプラグインをインストールします。

rootユーザーでcomposer installを実行できるように設定します。

【参考】
curlコマンド - hydroculのメモ
実行形式のComposerをダウンロード - Composerドキュメント日本語訳
Composerの導入&使い方(初心者の復習用) - Qiita
composerを速くするプラグイン・prestissimoを作った - Architect Note
Dockerfileで質問を受けずにrootでcomposer installする - Qiita

EC-CUBEのファイルをコンテナにコピー

COPY . ${APACHE_DOCUMENT_ROOT}

WORKDIR ${APACHE_DOCUMENT_ROOT}

Dockerfileがあるカレントディレクトリ内のファイル一式をコンテナ上の${APACHE_DOCUMENT_ROOT}にコピーします。

その後、Dockerfileの命令実行時の作業ディレクトリを${APACHE_DOCUMENT_ROOT}に指定します。

【参考】
パス名について | とほほのWWW入門
COPY - Dockerfileリファレンス
WORKDIR - Dockerfileリファレンス

composer install

RUN composer install \
  --no-scripts \
  --no-autoloader \
  --no-dev -d ${APACHE_DOCUMENT_ROOT} \
  && chown -R www-data:www-data ${APACHE_DOCUMENT_ROOT} \
  && chown www-data:www-data /var/www

composer installでcomposer.lockに書かれている各ライブラリをインストールします。
その後、${APACHE_DOCUMENT_ROOT}ディレクトリ配下のファイルとディレクトリの所有者をApacheの実行ユーザーwww-data:www-dataに変更します。
また、/var/www
ディレクトリの所有者もwww-data:www-dataに変更します。

【参考】
コマンドラインインターフェース - Composerドキュメント日本語訳
chownコマンドについてまとめました 【Linuxコマンド集】 - エンジニアの入り口
apacheのデフォルト実行ユーザwww-dataでgithubやbitbucketにSSH接続する - Qiita

composer dumpautoload

USER www-data
RUN composer dumpautoload -o --apcu --no-dev

Dockerfile内のコマンドを実行するユーザーをwww-dataに指定します。
そして、オートローディングに関する情報ファイルを生成するcomposer dumpautoloadを実行します。
-oオプションでPSR-4規約のオートローディング対象となっている全クラスがクラスマップに含まれます。

【参考】
Dockerfileについて - Qiita
composerについて初期学習まとめ - Qiita

.env

RUN if [ ! -f ${APACHE_DOCUMENT_ROOT}/.env ]; then \
        cp -p .env.dist .env \
        ; fi

${APACHE_DOCUMENT_ROOT}に**.env**がなければ、.env.distをコピーして.envを作成します。

【参考】
【Linux入門】if文による条件分岐の方法をわかりやすく解説! - Samurai Blog
【Linuxコマンド】cpコマンドでファイルをコピーする方法 - Samurai Blog

eccube.db

RUN if [ ! -f ${APACHE_DOCUMENT_ROOT}/var/eccube.db ]; then \
        composer run-script installer-scripts && composer run-script auto-scripts \
        ; fi

${APACHE_DOCUMENT_ROOT}/var/にeccube.dbがなければ、composer.jsonに書かれているinstaller-scriptsauto-scriptsを実行します。

【参考】
Running scripts manually - Composer Documentation
ec-cube/composer.json at 4.0 · EC-CUBE/ec-cube - GitHub

rootに切り替え

USER root

最後にユーザーをrootに切り替えます。

【参考】
USER - Dockerfileリファレンス

トラブルシューティング

Windowsでdocker buildが上手くいかない

Windows環境でdocker buildが上手くいかない場合は、Gitの改行コードの設定を変更してみてください。

## 以下のコマンドでGit for Windowsの改行コード自動変換をOffにします。
git config --global core.autoCRLF false

コマンド実行後、もう一度git cloneからやり直して、docker buildを実行してください。

【参考】
windows環境のgitで改行コードの自動変換に注意 - Qiita

26
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?