Preface
最近在搭游戏框架,需要用 redis 来存一些缓存数据。
于是就打算利用之前搭建好的 redis docker容器。
进展不是很顺利,所以把过程记录下来。
Code
代码方面使用的是 golang。
连接的三方库是 gomodule/redigo
测试代码如下:
1 | package test |
Steps
首先遇到的是这个问题:
connectex: No connection could be made because the target machine actively refused it.
然后去redis里面查看日志。
1 | sudo docker exec -it redis-master bash |
发现docker里面没有vi之类的文本编辑器查看日志,通过以下命令安装vim。
1 | apt-get update |
遇到了:Temporary failure resolving ‘deb.debian.org’
1 | chmod o+r /etc/resolv.conf |
然后重新运行安装vim的命令就好了。
/usr/local/log/redis.log 里面其实是没有连接信息的。
在 redis-master 容器中运行:
1 | redis-cli |
发现居然连不上了,才发现是没有启动 redis-server ,乌龙一个。
docker的redis容器中找不到ps命令,哎。
1 | apt-get install procps |
然后先后通过修改代码中的ip地址为master的地址
1 | redis.Dial("tcp","172.17.0.2:6379",readTimeOut,connectTimeOut,writeTimeOut) |
报了 i/o timeout 。
仔细看了一下启动命令,发现是没有做主机到容器之间的端口映射。
于是
1 | docker commit redis-master redis-master |
提交备份master
1 | docker run -p 7001:6379 -td redis-master |
之后就可以使用主机地址连接上了。
大乌龙。。。。
设置密码
给 master 设置密码,修改 conf 中的 requirepass 。
然后将 master 的配置和 log 文件都放到新建的文件夹 masterdata 中,
然后运行 修改masterdata的权限,不然后面会报访问拒绝之类的:
1 | chmod -R 777 masterdata |
然后用以下方式启动:
1 | sudo docker run --name redis-master --privileged=true -p 7001:6379 -v $PWD/masterdata:/data -v $PWD/masterdata/master.log:/var/log/redis/redis.log -d redis redis-server /data/redis-master.conf |
有报错,使用 sudo docker logs redis-master 查看容器日志,发现:
1 | *** FATAL CONFIG FILE ERROR *** |
这是读取 redis-master.conf 第174日志文件配置出的错,也就是上面命令行的日志文件映射出错了。
最终的运行命令如下:
1 | sudo docker run -d -v $PWD/masterdata/redis-master.conf:/usr/local/etc/redis/redis.conf -v $PWD/masterdata/master.log:/usr/local/log/redis.log -p 7001:6379 --name redis-master redis |
最后跑一遍:
1 | docker update --restart=always redis-master |
重启,启动成功之后执行:
1 | sudo docker ps |
redis-master赫然在列。
redis-slave同理:apt
1 | sudo docker run -it -v $PWD/slave1/redis-slave1.conf:/usr/local/etc/redis/redis.conf -v $PWD/slave1/slave1.log:/usr/local/log/redis.log -p 7002:6379 --link redis-master:master --name redis-slave1 redis |
1 | sudo docker run -d --restart=always -v $PWD/slave2/redis-slave2.conf:/usr/local/etc/redis/redis.conf -v $PWD/slave2/slave2.log:/usr/local/log/redis.log -p 7003:6379 --link redis-master:master --name redis-slave2 redis |