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のトップページが表示されます。
【参考】
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
です。
【参考】
Dockerを使用してインストールする(MySQLを使用する場合) - EC-CUBE4.0開発ドキュメント
Dockerfileの中身を詳しく見てみる
ベースイメージ
FROM php:7.3-apache-stretch
イメージはPHP7.3
とApache
が一つのコンテナに含まれている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.ini
にextension=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を有効にする。
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-scripts
とauto-scripts
を実行します。
【参考】
Running scripts manually - Composer Documentation
ec-cube/composer.json at 4.0 · EC-CUBE/ec-cube - GitHub
rootに切り替え
USER root
最後にユーザーをrootに切り替えます。
トラブルシューティング
Windowsでdocker buildが上手くいかない
Windows環境でdocker build
が上手くいかない場合は、Gitの改行コードの設定を変更してみてください。
## 以下のコマンドでGit for Windowsの改行コード自動変換をOffにします。
git config --global core.autoCRLF false
コマンド実行後、もう一度git clone
からやり直して、docker build
を実行してください。