使用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'
我确认了能够获取到数值的情况。