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上面搜 ...
随机推荐
- mongodb实现批量修改数据
var rds = db.REGIPATIENTREC.find({mzh:{$lt:"0"},usrOrg:"石景山中西医结合医院"}); var show ...
- git clone命令
从远程clone一个仓库 ...知识浅薄 git clone都发现貌似用的不顺 因为我有几个git账号 但是我也不知道就是git账号是怎么保存在终端上的 所以当我需要用一个新的github账号来clo ...
- Bootstrap框架的简介
一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局, ...
- 关于多属性查找问题的sphinx解决方案
需求描述 mysql中,每一个文档都有多个标签,查询时可以筛选一个标签也可以筛选同时拥有多个标签的文档. 数据示例 文档 标签 1 1,2,3,4,5 2 2,3,4,5,6 3 3,4,5,6,7 ...
- AC日记——[SDOI2010]大陆争霸 洛谷 P3690
[SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...
- 转:fortios 5.4后门植入
提示: 1.经过实验,fortios 5.4 beta4也是可以的. 2.在实验时,选择先下载fortios 5.2(做了快照),再升级5.4,则虚拟机挂载需要选择FortiGate-VM-disk1 ...
- ARM芯片stm32中的AHB和APB
AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”.AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接.AHB 系统由主 ...
- 203. Remove Linked List Elements【Easy】【未排序链表删除其中的给定值】
Remove all elements from a linked list of integers that have value val. Example: Input: 1->2-> ...
- 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 ...
- Linux基础系列-Day6
Samba服务(基于CentOS 7.0) Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之 ...