Docker Stack 部署web集群
Docker越来越成熟,功能也越来越强大。使用Dokcer Stack做服务集群也是非常的方便,docker 自己就提供了负载功能,感觉很方便,就想给大家分享一下,做一个简单的教程。
环境
我是用了两台centos7的虚拟机来做这个教程他们的ip分别是
主服务器:192.168.0.105 // 也是私有仓库服务器
服务器2: 192.168.0.49
这篇帖子中所有的代码 github地址:https://github.com/lpxxn/godockerswarm
设置Docker Swarm
我以192.168.0.105做为主服务器,在他上面开启swarm
docker swarm init
执行命令后会给出加入这个swarm的命令
在192.168.0.49上执行命令加入swarm
docker swarm join --token SWMTKN-1-425vswwmb8o34uhnmo58w0k4rfzs5okjtye7mokpqps1vl9ymq-0p6pr2gua7l8a6udb67tfndoo 192.168.0.105:2377
这样我们就建好了swarm,两台主机现在建立好了关系。
web服务
web服务是用go语言写一个简单的接口,返回主机的名称:这样方便我们查看是否有负载
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
hostName, _ := os.Hostname()
fmt.Fprintf(w, "HostName: %s", hostName)
})
log.Fatal(http.ListenAndServe(":8000", nil))
}
Docker file
看一下dockerfile 文件:
执行的意思就是基于golang境像,把代码复制到相应文件夹,暴露出端口,运行程序。简单吧
FROM golang
# Copy the current directory contents into the container
COPY . /go/src/github.com/lpxxn/godockerswarm/
WORKDIR /go/src/github.com/lpxxn/godockerswarm/
RUN go build
EXPOSE 8000
CMD ["./godockerswarm"]
看一下dockerfile 文件所在的文件夹
在这个目录下执行docker build 命令:
docker build . -t goweb:1.0
你可以运行一下新生成的镜像
docker run -p 8100:8000 7a7e3
镜像提交到私有仓库
关于如何搭建私有仓库服务器我这里的就多说了,可以去我之前的帖子看一下
地址1:http://www.cnblogs.com/li-peng/p/6511331.html
地址2:https://yq.aliyun.com/articles/303216?spm=5176.8091938.0.0.2ce387dadknIQu
也可以用harbor自己搭建,这个我还没有做过教程,有时间再写。
因为集群的上机器是自动从仓库取镜像然后再运行程序,所以需要将我们上面生成的镜像推送到我们的私有仓库上去。我自己搭建的
使用tag重新命名
docker tag goweb:1.0 lpxxn.com:5000/goweb:1.0
推送
docker push lpxxn.com:5000/goweb:1.0
docker-compose 文件
接下来创建docker-compose.yml文件
image 就是我们上面创建好的镜像。运行5个应用程序,docker 会自己做负载,端口映射8111,失败时自动重启服务,并且创建了自己的网络,当有多个server服务时这个非常有用。
里面的具体参数,大家可以看官方教程:
https://docs.docker.com/compose/compose-file/#dockerfile
version: "3"
services:
web:
image: lpxxn.com:5000/goweb:1.0
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "8111:8000"
networks:
- gowebnet
networks:
gowebnet:
部署应用
到了最后的阶段了,部属一样很简单,执行deploy命令
docker stack deploy -c docker-compose.yml mygoweb
查看启动的服务
docker service ps mygoweb
测试服务
看这些返回的主机名:不一样吧。docker 为我们做了负载了。
这篇帖子中所有的代码 github地址:https://github.com/lpxxn/godockerswarm
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
- AngularJS in Action读书笔记6(实战篇)——bug hunting
- FreeMarker模板开发指南知识点梳理
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- H5手游大事件:腾讯上线“微信小游戏”!支持群分享与内购
- 我所理解的Remoting(2):远程对象生命周期的管理[上篇]
- 谈谈分布式事务(Distributed Transaction)[共5篇]
- SQLXML初体验:用XML代替T-SQL来操作数据库
- 自己动手写可视化软件(代码已开源)
- 探秘Tomcat——连接篇
- 微信小游戏正式上线,H5游戏迎新机遇
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 突击并发编程JUC系列-并发工具 CyclicBarrier
- 详解 | Linux系统是如何实现存储并读写文件的?
- Angular单元测试的一个错误消息
- Python进行特征提取
- dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用
- Java 对象相关面试题
- 【每日一题】【vue2源码学习】VUE中模版编译原理
- 【每日一题】【vue2源码学习】对VUE响应式数据的理解
- ApacheCN 深度学习译文集 2020.9
- 当Docker遇到Intellij IDEA,再次解放了生产力~
- 基于NPOI的Excel导入导出类库
- 在tinycolinux32上装tinycolinux64 kernel和toolchain
- 通过链下签名授权实现更少 Gas 的 ERC20代币
- 在dbcolinux上安装cozy-light
- 在群晖docker上装elmlang可视调试编码器ellie