DockerでMySQL+Apache+EC-cube4を立ち上げる

# ディレクトリ構造

mysqlとsrcフォルダは空で用意する。
srcフォルダにec-cubeのソースコードが入る。
Dockerfileでcomposerも入る。

```
docker
├── apache-php
│   ├── 000-default.conf
│   ├── Dockerfile
│   └── php.ini
├── mysql
├── src
└── docker-compose.yaml
```

#docker-compose.yaml

apache-php以外のコンテナはイメージそのまま。

```docker-compose.yaml
version: "3"

services:
    apache-php:
        build: ./docker/apache-php
        ports:
            - "8030:80"
        volumes:
            - ./src:/var/www/html
    mysql:
        image: mysql:5.7
        volumes:
            - ./mysql:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=db
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
        ports: 
            - "3307:3306"

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=test
            - PMA_PASSWORD=test
    
        links:
            - mysql
        ports:
            - 4040:80
        volumes:
            - ./phpmyadmin/sessions:/sessions

    mailcatcher:
        image: schickling/mailcatcher
        ports:
            - "1080:1080"
            - "1025:1025"
    
```

# apacheとphpの設定

EC-Cube特有なのは
DocumentRoot /var/www/html/ec-cube/
の部分。

```000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/ec-cube/
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/ec-cube/>
           AllowOverride All
       </Directory>
</VirtualHost>
```


```Dockerfile
FROM php:7.4-apache

# コンテナでllが使えるようにする
RUN echo -e "\n\
alias ll='ls -la --color'\n\
" >> /root/.bashrc

# PHP.iniをコンテナに送り込む
ADD php.ini /usr/local/etc/php/

# コンテナ内の000-default.confを上書きする。
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# ミドルウェアインストール
RUN apt-get update \
&& apt-get install -y \ 
git \
zip \
unzip \
vim \
libicu-dev \
libpng-dev \
libpq-dev \
less \
&& docker-php-ext-install pdo_mysql mysqli intl

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
```

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

```

# コンテナを立ち上げる

```
docker-compose up -d --build
```

# コンテナに入ってEC-CUBEをインストールする。

```
docker ps
```

で php-apacheのコンテナ名を調べて

```
docker exec -it {コンテナ名かコンテナID} bash
```

2021年7月15日現在、このままではcompose installできない。
"ec-cube/plugin-installer": "~0.0.6 || の行を以下に修正。

```composer.json
 "ec-cube/plugin-installer": "~0.0.6 || ^2.0@dev",
```

```
composer update
```

EC-CUBEのインストールコマンドを実行する。　bin/consoleがphp artisanのようなもの。
このコマンドが成功するとDBにEC-CUBE4用のテーブル作成とデモデータが投入される。
e:i は ec-cube:install コマンドの省略形

```
cd ec-cube/
bin/console e:i
```

上のコマンドを打つと質問されるので以下のように入力する。
mysql://{DBユーザ名}:{DBパスワード}@**{mysqlコンテナ名}**/{db名}

{mysqlコンテナ名}の部分をlocalhostと書いている記事ばかりですが、それだとnot found exceptionでconnection refuseされました。
docker ps コマンドで出てくるコンテナ名を指定してください。

```
Database Url [sqlite:///var/eccube.db]:
 > mysql://root:root@ec-cube4_mysql_1/db

 Mailer Url [null://localhost]:
 > smtp://localhost:1025

 Auth Magic [lsDLkCPPm1nBJQT3]:
 > 
```

localhost:8030（可変。docker-composeに書いたポート）にアクセス。

ここまでで、一応動くがとてつもなく動作が重いので軽量化のためにdocker-syncを使う。

# docker-syncを導入する。

```
docker
├── apache-php
│   ├── 000-default.conf
│   ├── Dockerfile
│   └── php.ini
├── mysql
├── src
└── docker-compose.yaml ◀︎ 編集する
└── docker-sync.yml ◀︎ 追加
```

docker-sync.ymlをdocker-compose.yamlと同階層に配置する。

```docker-sync.yml
version: '2'
syncs:
  eccube-sync:
    src: './src'
    sync_host_ip: '127.0.0.1'
    sync_host_port: '5000'
    sync_strategy: 'native_osx'
    sync_excludes: ['.git', '.gitignore', 'node_modules', 'var']

```


```docker-compose.yaml
version: "3"

services:
    apache-php:
        build: ./docker/apache-php
        ports:
            - "8030:80"
        volumes:
            # - ./src:/var/www/html ホスト側のディレクトリをボリュームコンテナに書き換える
            - eccube-sync:/var/www/html
    mysql:
        image: mysql:5.7
        volumes:
            - ./mysql:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=db
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
        ports: 
            - "3307:3306"

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=test
            - PMA_PASSWORD=test
    
        links:
            - mysql
        ports:
            - 4040:80
        volumes:
            - ./phpmyadmin/sessions:/sessions

    mailcatcher:
        image: schickling/mailcatcher
        ports:
            - "1080:1080"
            - "1025:1025"

volumes:
    # 追加
    eccube-sync:
        external: true
    
```

# docker-syncを立ち上げる

```bash
docker-compose down
docker-sync start
docker-compose up -d
```

私はここでRuntimeエラーがでてハマりました。
以下のコマンドでunisonランタイムをインストールしてクリーンしたらdocker-sync startできました。

```
brew install unison
brew install eugenmayer/dockersync/unox 
docker-sync clean
```

また、docker-syncスタートはdocker-sync.ymlのあるディレクトリでコマンドを入力しないとパスがずれます。
pwdでカレントディレクトリを確認してから実行してください。

# 動作確認

| 1 | 2 |
|:-:|:-:|
| 利用者側  | localhost:8030  |
| 管理者側  | localhost:8030/admin  |

管理者画面初期パスワード ( src/ec-cube/.envにコメントアウトされて記載されている。)

| 1 | 2 |
|:-:|:-:|
| ログインID  | admin  |
| パスワード  | password  |