dockerでlua-resty-redisのコンテナからredisのコンテナに通信するサンプル

Dockerには複数のコンテナ間の通信をサポートするための仕組みが用意されています。

* [Link Containers - Docker Documentation](http://docs.docker.io/en/latest/use/working_with_links_names/)
* [Docker 0.6.5の新機能を追う | u1's tech blog](http://blog.udcp.net/2013/11/06/docker-0-6-5%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E3%81%86/)

これを試して見るため、[lua-nginx-module で利用できるStorage(memcache, MySQL, redis)向けのアダプタを試す - Qiita](http://qiita.com/futoase/items/ac0708a44d5158d1e73d)のredisのサンプルをdockerで構築してみました。

以下の2つのコンテナを作成してnginxのコンテナからredisのコンテナに接続します。

* nginx + nginx-lua-module + lua-resty-redis
    * ソース: https://github.com/hnakamur/docker-nginx-lua/tree/3484e93f671868ef8632064fbc6d2b1d54086ede 
* redis
    * ソース: https://github.com/hnakamur/docker-redis/tree/6f761f3564cae894be2b46c8509b09b39ebddf8f

```shell-session
cd ${docker-nginx-luaの作業ディレクトリ}
docker build -t hnakamur/nginx-lua .

cd ${docker-redisの作業ディレクトリ}
docker build -t hnakamur/redis .
```

コンテナの起動

```shell-session
docker run -d -p 6379:6379 -name redis hnakamur/redis
docker run -d -p 80:80 -link redis:redis hnakamur/nginx-lua
```

```-link``` の引数はコンテナ名:エイリアスという形式なんですが、エイリアスはコンテナ名と同じでも大丈夫でした。

この引数を指定することによりhnakmaur/nginx-luaのコンテナにはエイリアス名と公開ポートに対応してREDIS_PORT_6379_TCP_ADDR、REDIS_PORT_6379_TCP_PORTなどの環境変数が設定されます。

設定される環境変数は[Link Containers - Docker Documentation](http://docs.docker.io/en/latest/use/working_with_links_names/)に記載されています。

そこでnginxからredisに接続する処理では、これらの環境変数の値を使用します。

```text:https://github.com/hnakamur/docker-nginx-lua/blob/3484e93f671868ef8632064fbc6d2b1d54086ede/nginx.conf#L57-L83
        location /get {
            content_by_lua '
                local redis = require "resty.redis"
                local client = redis:new()
                client:connect(os.getenv("REDIS_PORT_6379_TCP_ADDR"), tonumber(os.getenv("REDIS_PORT_6379_TCP_PORT")))

                local args = ngx.req.get_uri_args()
                local key, field = args.key, args.field

                local result, err = client:hmget(key, field)
                ngx.say(result)
            ';
        }

        location /set {
            content_by_lua '
                local redis = require "resty.redis"
                local client = redis:new()
                client:connect(os.getenv("REDIS_PORT_6379_TCP_ADDR"), tonumber(os.getenv("REDIS_PORT_6379_TCP_PORT")))

                local args = ngx.req.get_uri_args()
                local key, field, val = args.key, args.field, args.value

                client:hmset(key, field, val)
                ngx.say("Saved!")
            ';
        }
```

[Core functionality](http://nginx.org/en/docs/ngx_core_module.html#env)によると、nginxではデフォルトではTZ以外の全ての環境変数を削除するそうです。

そこで以下の設定をnginx.confに加えています。

```text:https://github.com/hnakamur/docker-nginx-lua/blob/3484e93f671868ef8632064fbc6d2b1d54086ede/nginx.conf#L11-L12
env REDIS_PORT_6379_TCP_ADDR;
env REDIS_PORT_6379_TCP_PORT;
```

# 動作確認

OSXでは以下のポートフォワーディングを設定しています。

```shell-session
VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"
```

そこで

```shell-session
curl 'http://localhost:8080/set?key=foo&filed=bar&value=baz'
```

で値を設定し、

```shell-session
curl 'http://localhost:8080/get?key=foo&filed=bar'
```

で値を取得できることを確認しました。