使用Docker中的lua-resty-redis容器与redis容器进行通信的示例

Docker提供了支持多个容器之间通信的机制。

    • Link Containers – Docker Documentation

 

    Docker 0.6.5の新機能を追う | u1’s tech blog

为了尝试这个,我尝试使用lua-nginx-module的适配器来支持Storage(memcache、MySQL、redis)- 我在Docker中构建了基于Qiita的redis示例。

创建以下两个容器,将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

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

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

启动容器

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

链接的参数是以”容器名:别名”的形式,但是别名和容器名相同也是可以的。

通过指定这个参数,hnakmaur/nginx-lua容器将设置与别名和公开端口相对应的环境变量,如REDIS_PORT_6379_TCP_ADDR、REDIS_PORT_6379_TCP_PORT等。

環境变量的设置方法可以在《Link Containers – Docker Documentation》中找到。

在从nginx连接到redis的过程中,将使用这些环境变量的值。

        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!")
            ';
        }

据核心功能,据说nginx默认情况下会删除除了TZ之外的所有环境变量。

因此,我在nginx.conf中添加了以下设置。

env REDIS_PORT_6379_TCP_ADDR;
env REDIS_PORT_6379_TCP_PORT;

确认动作

在OSX上设置了以下的端口转发。

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

所以

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

设定数值

curl 'http://localhost:8080/get?key=foo&filed=bar'

我确认了能够获取到数值的情况。

广告
将在 10 秒后关闭
bannerAds