博客地址: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聊天室的更多相关文章

  1. docker 部署mysql redis

    先介绍利用的两个数据卷挂载的规则,这对于理解挂载mysql数据库存储非常有帮助. 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中. 如果挂载一个非空的数据卷到容 ...

  2. 阿里云服务器centos7,docker部署mysql+Redis+vue+springboot+Nginx+fastdfs,亲测可用

    一.购买云服务器 我是今年双十一期间在阿里云购买的服务器, 简单配置2核_4G_40G_3M,三年用了不到800块,不过当时我记得腾讯云更便宜,个人感觉,阿里的云服务器更加的稳定, 毕竟身经百战, 经 ...

  3. Docker部署golang微服务项目

    这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...

  4. Docker部署Golang

    1. 安装docker 2. mkdir myDocker 3.  cd myDocker && touch Dockerfile 4.  Dockerfile写入 # 将golang ...

  5. QuickStart系列:docker部署之redis

    在centos7的docker中部署 redis,这里只介绍 单节点的部署. docker run -p 6379:6379 -v $PWD/data:/data -d redis:latest re ...

  6. docker部署 mysql redis问题

    问题:(ubuntu不报错,centos报错) ERROR: : starting container process caused "process_linux.go:402: conta ...

  7. k8s+docker部署Golang项目

    Go环境搭建 root账户 下载Golang [root@infra2-test-k8s /]# cd /usr/local/ [root@infra2-test-k8s local]# wget h ...

  8. 使用Docker 一键部署 LNMP+Redis 环境

    使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  9. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

随机推荐

  1. mongodb实现批量修改数据

    var rds = db.REGIPATIENTREC.find({mzh:{$lt:"0"},usrOrg:"石景山中西医结合医院"}); var show ...

  2. git clone命令

    从远程clone一个仓库 ...知识浅薄 git clone都发现貌似用的不顺 因为我有几个git账号 但是我也不知道就是git账号是怎么保存在终端上的 所以当我需要用一个新的github账号来clo ...

  3. Bootstrap框架的简介

    一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局, ...

  4. 关于多属性查找问题的sphinx解决方案

    需求描述 mysql中,每一个文档都有多个标签,查询时可以筛选一个标签也可以筛选同时拥有多个标签的文档. 数据示例 文档 标签 1 1,2,3,4,5 2 2,3,4,5,6 3 3,4,5,6,7 ...

  5. AC日记——[SDOI2010]大陆争霸 洛谷 P3690

    [SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...

  6. 转:fortios 5.4后门植入

    提示: 1.经过实验,fortios 5.4 beta4也是可以的. 2.在实验时,选择先下载fortios 5.2(做了快照),再升级5.4,则虚拟机挂载需要选择FortiGate-VM-disk1 ...

  7. ARM芯片stm32中的AHB和APB

    AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”.AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接.AHB 系统由主 ...

  8. 203. Remove Linked List Elements【Easy】【未排序链表删除其中的给定值】

    Remove all elements from a linked list of integers that have value val. Example: Input: 1->2-> ...

  9. git add . 的时候遇到warning: LF will be replaced by CRLF in ...... 解决办法

    输 入 git add . 后出现 warning: LF will be replaced by CRLF in ...... The file will have its original lin ...

  10. Linux基础系列-Day6

    Samba服务(基于CentOS 7.0) Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之 ...