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()
docker部署golang+redis聊天室的更多相关文章
- docker 部署mysql redis
先介绍利用的两个数据卷挂载的规则,这对于理解挂载mysql数据库存储非常有帮助. 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中. 如果挂载一个非空的数据卷到容 ...
- 阿里云服务器centos7,docker部署mysql+Redis+vue+springboot+Nginx+fastdfs,亲测可用
一.购买云服务器 我是今年双十一期间在阿里云购买的服务器, 简单配置2核_4G_40G_3M,三年用了不到800块,不过当时我记得腾讯云更便宜,个人感觉,阿里的云服务器更加的稳定, 毕竟身经百战, 经 ...
- Docker部署golang微服务项目
这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...
- Docker部署Golang
1. 安装docker 2. mkdir myDocker 3. cd myDocker && touch Dockerfile 4. Dockerfile写入 # 将golang ...
- QuickStart系列:docker部署之redis
在centos7的docker中部署 redis,这里只介绍 单节点的部署. docker run -p 6379:6379 -v $PWD/data:/data -d redis:latest re ...
- docker部署 mysql redis问题
问题:(ubuntu不报错,centos报错) ERROR: : starting container process caused "process_linux.go:402: conta ...
- k8s+docker部署Golang项目
Go环境搭建 root账户 下载Golang [root@infra2-test-k8s /]# cd /usr/local/ [root@infra2-test-k8s local]# wget h ...
- 使用Docker 一键部署 LNMP+Redis 环境
使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...
- 如何利用docker 构建golang线上部署环境
公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...
随机推荐
- cacti (不可以利用yum安装cacti的配置)
我们如果用yum不可以安装cacti,我们则可以利用tar包来安装!!! //cacti的配置准备 [root@localhost ~]# yum install -y epel-release [r ...
- Mycat 读写分离
简介 Mycat 是 MySQL中间件,Mycat的原理中最重要的一个动词就是'拦截',它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析.路由分析.读写分离分析.缓存分 ...
- mysql设置服务器编码
今天写java程序的时候出现了插入mysql数据中文乱码问题,确定数据库和表的编码都已指定utf-8.百度后得知mysql安装后需设置服务器编码,以下是解决方法(ubuntu; mysql 5.6.2 ...
- redis之(七)redis的集合类型的命令
[一]增加/删除元素 --->命令:SADD key member [member...] --->向集合键中添加一个,或多个元素.如果键不存在,则创建.如果元素存在,则忽略不执行.返回值 ...
- 深度理解onmouseover事件和onmouseout事件
今天简单的讲解下onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的 ...
- flex布局各种情况总结分析及实例演示
2009年,W3C提出了一种新的方案----Flex布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能. 通过笔者大量实践,发现 ...
- jquery.bootpag分页控件
<script src="//code.jquery.com/jquery-2.1.3.min.js"></script> <script src=& ...
- lr_Vugen界面图
- bzoj 1444 AC自动机 + 矩阵乘法 | 高斯消元
恶补了一下AC自动机,花了一天时间终于全部搞明白了. 思路:将每个人的串加入AC自动机,在AC自动机生成的状态图上建边,注意单词末尾的节点只能转移到自己概率为1, 然后将矩阵自乘几十次后误差就很小了, ...
- Kvm虚拟化安装与虚拟机创建
1. 验证CPU是否支持KVM:如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的. egrep '(vmx|svm)' /proc/cpuinfo 2. 关闭SELinux ...