Docker入門 #4 【CodeIgniter環境構築】


![enter image description here](http://edusagar.com/assets/media/codeigniter.png)

### 構成
| service     | version |
|-------------|---------|
| PHP         | 7.1-fpm |
| CodeIgniter | 3.1.0   |
| Nginx       | 1.11.5  |
| MariaDB     | 10.1.18 |
| Memcached   | 1.4.32  |
| Redis       | 3.0.7   |
| phpMyAdmin  | 4.6.4   |


ソーシャルゲーム開発においてよくある構成です

#### インストールから起動まで

私の[リポジトリ](https://github.com/wMETAw/php7codeigniter-on-docker)に
docker用にdatabase.phpを少し変更しただけのプロジェクトがあるのでクローンしてください。
※下で解説します

```bash:terminal
# git clone
$ git clone git@github.com:wMETAw/php7codeigniter-on-docker.git

# cd docker-compose.ymlがあるディレクトリ
$ docker-compose build
$ docker-compose up -d
```

---

phpMyAdminへアクセスし、`db1`を作成
http://0.0.0.0:8888/
![enter image description here](https://lh3.googleusercontent.com/-fqysrqy43i0/WOJ42MKbivI/AAAAAAAAAGs/HJjbNYBwRAwPyC8qVey9LvgVg2tj2md9wCLcB/s707/a0c4aa3c-0459-a648-a2a9-3e342c111226.png "a0c4aa3c-0459-a648-a2a9-3e342c111226.png")

---

welcomeページにアクセス http://0.0.0.0:8080/welcome/index
![enter image description here](https://lh3.googleusercontent.com/-QQkHJGPytXU/WOJ5H2xoJhI/AAAAAAAAAG0/FQLPOFwlTWYuoV29rgODiCCRF-hKkh2TwCLcB/s700/5afee704-0006-60bc-72fb-9599c4f42491.png "5afee704-0006-60bc-72fb-9599c4f42491.png")

----

memchaheとredisの接続確認
Welcomeコントローラーのコメントアウトを以下のように外す

```php:php/application/controllers/Welcome.php
public function index()
{
    // mariaDB接続確認
    // var_dump($this->load->database());

    // redis接続・確認
    $this->load->driver("cache", array('adapter' => 'redis', 'key_prefix' => 'app_'));
    $this->cache->redis->save('key', 100);
    var_dump($this->cache->redis->get('key'));
    // var_dump($this->cache->is_supported('redis'));
    // var_dump($this->cache->cache_info());

    // memcached接続・確認
    $this->load->driver("cache", array('adapter' => 'memcached', 'key_prefix' => 'app_'));
    $this->cache->memcached->save('key', 200);
    var_dump($this->cache->memcached->get('key'));
    // var_dump($this->cache->memcached->is_supported("memcached"));

    $this->load->view('welcome_message');
}
```

![enter image description here](https://lh3.googleusercontent.com/-FP0MS-kuuGE/WOJ5X7_WGvI/AAAAAAAAAG8/yAnZ1qnyE1MN6nQIfh6NLvUUBAArCxgRQCLcB/s380/ab7e4a75-9417-e00d-6e53-b2c2ad979329.png "ab7e4a75-9417-e00d-6e53-b2c2ad979329.png")


---

5分以内に開発環境を構築できます！！

### 解説

フォルダ構成
![enter image description here](https://lh3.googleusercontent.com/-2qVXhJxbF8M/WOJ5ksoLmRI/AAAAAAAAAHE/msJ47pzD690lYv1Jjpz1kpv-Ng-mSSWFgCLcB/s600/2f1e11b2-db83-25bc-6c0f-c5dc3c21d8ec.png "2f1e11b2-db83-25bc-6c0f-c5dc3c21d8ec.png")

### docker-compose.yml

```yaml:docker-compose.yml
# dataコンテナ
datastore:
  build: ./datastore

# nginx 1.11.5
nginx: 
  build: ./nginx
  ports: 
    - "8080:80"
  links: 
    - php
  volumes_from:
    - datastore

# php:7.1-fpm
php: 
  build: ./php
  # 別コンテナのエイリアスを設定 （リンク）
  links:
    - mariadb
    - redis
    - memcached
  # [ホスト]：[コンテナ] ホストのディレクトリ以下をコンテナのパスにマウント
  volumes:
    - ./php/:/var/www/html/

# mariadb
mariadb:
  image: mariadb:10.1
  # 環境変数
  environment:
    MYSQL_ROOT_PASSWORD: password
  expose:
    - '3306'
  volumes_from:
    - datastore

# redis
redis:
  image: redis:3.0.7
  expose:
    - '6379'
  volumes_from:
    - datastore

# memcached
memcached:
  image: memcached:1.4.32
  expose:
    - '11211'

# phpmyadmin
phpmyadmin:
  image: phpmyadmin/phpmyadmin:4.6.4-1
  ports:
    - "8888:80"
  links:
    - mariadb
  environment:
    - PMA_ARBITRARY=1
    - PMA_HOST=mariadb
    - PMA_USER=root
    - PMA_PASSWORD=password
```

`image: memcached:1.4.32`
上記のように公式のイメージからバージョンを指定してビルドしているパターンと
`build: ./nginx` 自前のDcokerfileからイメージをビルドしているパターンがあります


### phpフォルダ以下のDockerfile
```bash:php/Dockerfile
FROM php:7.1-fpm

MAINTAINER YamadaTaro <yamada@mail.com>

# mysql
RUN docker-php-ext-install mysqli

# redis
RUN docker-php-source extract \
    && curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/3.0.0.tar.gz \
    && tar xfz /tmp/redis.tar.gz \
    && rm -r /tmp/redis.tar.gz \
    && mv phpredis-3.0.0 /usr/src/php/ext/redis \
    && docker-php-ext-install redis

# memcached
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev
RUN curl -L -o /tmp/memcached.tar.gz https://github.com/php-memcached-dev/php-memcached/archive/php7.tar.gz \
  && tar xfz /tmp/memcached.tar.gz \
  && rm -r /tmp/memcached.tar.gz \
  && mv php-memcached-php7 /usr/src/php/ext/memcached \
  && docker-php-ext-install memcached
```

CodeIgniterでのredisとmemcachedのdriver用に解凍してインストールしています

## nginx

![enter image description here](https://lh3.googleusercontent.com/-MsKgayo9-RM/WOJ50BbwKcI/AAAAAAAAAHM/jbbX_ZumiFkwpJ_wpCKwXh3WP9q9O_w4ACLcB/s400/fa46f866-24ed-4460-de66-d85d5071d20c.png "fa46f866-24ed-4460-de66-d85d5071d20c.png")

```bash:nginx/Dockerfile
# nginx ver1.11.5
FROM nginx:1.11.5

# 作成者
MAINTAINER YamadaTaro <yamada@mail.com>

# 起動するnginxコンテナの指定パスにserver.confをコピー
COPY server.conf /etc/nginx/conf.d/server.conf
```

```bash:nginx/server.conf
server {
    listen 80 default;
    server_name _;
    root /var/www/html;
    index index.php index.html index.htm;
    charset utf-8;

    access_log off;
    error_log off;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000; # 「php」 はdocker-composeのコンテナのエイリアス名
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
```

fastcgi_passはDockerの場合、 <font color="ff0000">**コンテナのエイリアス名:ポート番号**</font>になります。

### CodeIgniterの設定

```php:php/application/config/database.php
$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'mariadb', // # 「mariadb」 はdocker-composeのコンテナのエイリアス名
    'username' => 'root',
    'password' => 'password',
    'database' => 'db1', // 都度変更
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);
```

DB設定のhostnameを<font color="ff0000">**mariadb**</font>に変更すると、アクセス可能になります。



### さいごに
要点だけさっとまとめました

この状態から開発用に改良するなら
**/etc/hosts**に以下のように追記すれば
http://dev.hogefuga:8080 でアクセス可能です

```matlab:/etc/hosts
##↲
# Host Database↲
#↲
# localhost is used to configure the loopback interface↲
# when the system is booting.  Do not change this entry.↲
##↲
127.0.0.1 localhost dev.hogefuga
```


以上です。
お疲れ様でした！


## リンク
[Docker入門 #1 【Dockerとは】](https://qiita.com/wMETAw/items/b9bc643ded4b92bf6add)
[Docker入門 #2 【Dockerチュートリアル】](https://qiita.com/wMETAw/items/8d1b0c053a39841765bf)
[Docker入門 #3 【WordPress環境構築】](https://qiita.com/wMETAw/items/710bbbb328b78757463a)
Docker入門 #4 【CodeIgniter環境構築】
[Docker入門 #5 【Ruby on Rails5環境構築】](https://qiita.com/wMETAw/items/8cb41425a5d0bdace2df)
[Docker コマンドチートシート](https://qiita.com/wMETAw/items/34ba5c980e2a38e548db)