docker部署golang+redis聊天室

博客地址:http://www.niu12.com/article/7
#####1.项目源码:
https://github.com/ZQCard/webchat
#####2.项目构成
websocket与golang进行数据通信,nginx配置端口转发,redis作为简单的数据存储
#####流程:
问题一:如何在docker中部署redis服务
1.拉取镜像
docker pull redis:latest
2.执行redis服务端并挂载数据卷
docker run -p 6379:6379 --name myredis -v $pwd/data:/data -d redis redis-server --appendonly yes
3.查看容器id
docker ps
重要信息大致如下
容器id 镜像 端口映射 容器名称
CONTAINER ID IMAGE PORTS NAMES
3afbcb295ade redis 0.0.0.0:6379->6379/tcp myredis
4.进入redis客户端
docker exec -it 3afbcb295ade redis-cli
出现127.0.0.1:6379>则部署成功
问题二:如何在docker中部署Go项目
1.建立Dockerfile
比如我的项目目录为:/applications/go/src/webchat
则需要在项目目录下构建Dockerfile(注意大小写)
cd /applications/go/src/webchat/
vim Dockerfile
具体内容如下:

# golang:latest 镜像为基础镜像
FROM golang:latest

# 设置容器信息
MAINTAINER Card "445864742@qq.com"

# 将工作目录设置为$GOPATH/src/webchat
WORKDIR $GOPATH/src/webchat

# 将工作目录上下文目录添加到当前目录
ADD . $GOPATH/src/webchat

# 进行go build对项目进行编译
RUN go build .

# 容器内部将8889端口开放(与main.go服务器请求端口对应)
EXPOSE 8889

# 执行编译好的go文件
ENTRYPOINT ["./webchat"]
2.建立镜像
# 以当前目录为基础建立name为webchat的镜像
docker build -t wechat .
3.运行容器并挂载redis数据库
-p port1:port2 宿主机port1端口映射容器的port2端口
docker run -it -p 8889:8889 --name webchat --link myredis:redis -d webchat
问题三:怎么访问容器项目,进行nginx配置?
以我的项目chat.niu12.com为例
chat.niu12.com.conf
vim /etc/nginx/conf.d/chat.niu12.com.conf

# 根据客户端请求中 $http_upgrade 的值,来构造改变 $connection_upgrade 的值
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 配置server
server {
listen 80;
server_name chat.niu12.com;

location / {
# 将请求反向代理到本机的8889端口
proxy_pass http://127.0.0.1:8889;
# 支持webSocket请求
proxy_http_version 1.1;
# 最大连接时长,默认60S
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
#####遇到的问题:
问题一:redis无法连接
dial tcp 127.0.0.1:6379: connectex:
No connection could be made because the target machine actively refused it.
当在本地连接redis是可以连接通的,但是部署到docker出现redis无法连接的报错.
解决方案:
使用系统函数 os.Getenv("REDIS_PORT")获取redis信息
返回值大概是: "tcp://172.12.68.2:6379"
查分 strings.Split(os.Getenv("REDIS_PORT"), "://")
["tcp", "172.12.68.2:6379"]

问题二:websocket 60s自动断开
解决方案:
参考上方nginx连接超时的设置

问题三:use of closed network connection redis操作失败
当并发时,redis第一个写操作(比如 HSET)没有完成,又进行第二个HSET操作,
redis抛出异常
解决方案:
对redis写操作进行枷锁
1.申明全局变量
var lock sync.Mutex
2.加索操作
lock.Lock()
_, err := c.Do("SADD", "users", message.Username)
if err != nil {
panic("redis添加数据出错: " + err.Error())
return
}
lock.Unlock()
posted @ 2018-12-24 13:45  周起  阅读(1422)  评论(0编辑  收藏  举报