博客地址: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. 手机meta标签(保存下来省的每次都找)

    手机网站Meta标签 手机端特有的Meta标签 1.<meta name="viewport" id="viewport" content="w ...

  2. ajax登录请求,无法跳转

    没有用form提交数据,用的ajax提交.服务器显示已经登录成功,并且返回了成功代码OK.却无法进行跳转: js代码: $("input[type='submit']").on(& ...

  3. 面试题之堆栈队列系列一:设计包含min函数的栈

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  4. webpy 上传文件

    x = web.input(myfile={})是一个类字典对象,会返回所有GET或POST的数据 括号内部用来设置myfile的默认值,以防请求中根本就没有myfile键 定义如下一个表单 form ...

  5. Python进程间通信:Queue

    Python进程间通信Queue 1.Queue使用方法: Queue.qsize():返回当前队列包含的消息数量: Queue.empty():如果队列为空,返回True,反之False : Que ...

  6. 常用的smarty变量操作

    php模板引擎smarty的变量操作符可用于操作变量,自定义函数和字符.语法中使用"|"应用变量操作符,多个参数用":"??指簟?/DIV> capita ...

  7. centos6.5 安装scrapy

    1. 安装Twisted, 下载安装包 python setup.py install 2. yum install libffi-devel python-devel 3 pip install s ...

  8. 洛谷P3038 牧草种植 [树链剖分]

    题目传送门 牧草种植 题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirec ...

  9. 【vim】mac配置vim,molokai配色

    效果如下: 首先修改主目录下的.vimrc: "======================================================================= ...

  10. POJ 2404 Jogging Trails(最小权完美匹配)

    [题目链接] http://poj.org/problem?id=2404 [题目大意] 给出一张图,求走遍所有的路径至少一次,并且回到出发点所需要走的最短路程 [题解] 如果图中所有点为偶点,那么一 ...