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的命令
![1acf50aa0d5a73d0212c266af04b53c9.png](https://i-blog.csdnimg.cn/blog_migrate/c7f627b33a590404f9dcb0e681ac0a05.png)
在192.168.0.49上执行命令加入swarm
docker swarm join --token SWMTKN-1-425vswwmb8o34uhnmo58w0k4rfzs5okjtye7mokpqps1vl9ymq-0p6pr2gua7l8a6udb67tfndoo 192.168.0.105:2377
![9fc9fa2115c83cf9b690738e83179269.png](https://i-blog.csdnimg.cn/blog_migrate/dad45df2941d0c2eb55b8c9459907b90.png)
这样我们就建好了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/http://github.com/lpxxn/godockerswarm/ WORKDIR /go/src/http://github.com/lpxxn/godockerswarm/ RUN go build EXPOSE 8000 CMD ["./godockerswarm"]
看一下dockerfile 文件所在的文件夹
![b6f6bdca5efe9775c0f4f66e69014208.png](https://i-blog.csdnimg.cn/blog_migrate/54986f2a57f98967f2c02f13df9055aa.png)
在这个目录下执行docker build 命令:
docker build . -t goweb:1.0
![42d085a50e1eafbb48804f333e3a2c9b.png](https://i-blog.csdnimg.cn/blog_migrate/991a49a6e795069bda8838d5a02d3eef.png)
你可以运行一下新生成的镜像
docker run -p 8100:8000 7a7e3
![1b477147f5eeaf732169317aa7a20183.png](https://i-blog.csdnimg.cn/blog_migrate/bf45c491d371960d20cd5fa6d332931d.png)
镜像提交到私有仓库
关于如何搭建私有仓库服务器我这里的就多说了,可以去我之前的帖子看一下
地址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 http://lpxxn.com:5000/goweb:1.0
![5786242a0a0ae48ea5400da5ac71dd19.png](https://i-blog.csdnimg.cn/blog_migrate/468bb0384f97fc1e71c02c650e91023d.png)
推送
docker push http://lpxxn.com:5000/goweb:1.0
![3bb2cf1e7bdf479eda6a03511f90d6a4.png](https://i-blog.csdnimg.cn/blog_migrate/15abf8fbdbb3d79b6ee6d1f04b64c8a0.png)
docker-compose 文件
接下来创建docker-compose.yml文件
image 就是我们上面创建好的镜像。运行5个应用程序,docker 会自己做负载,端口映射8111,失败时自动重启服务,并且创建了自己的网络,当有多个server服务时这个非常有用。
里面的具体参数,大家可以看官方教程:
https://docs.docker.com/compose/compose-file/#dockerfile
version: "3" services: web: image: http://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
![afffa169b1b5f110881fa5f4d925922b.png](https://i-blog.csdnimg.cn/blog_migrate/c4e40cbb14f9dd86dee5eb1483f4d6dd.png)
查看启动的服务
docker service ps mygoweb
![3e4f558ae04797e0f65bfc36c48e1412.png](https://i-blog.csdnimg.cn/blog_migrate/4e16ac84f13fd5cf8abd671e1bf1afb5.png)
![9a51832e7908af4580d5d566f4424abc.png](https://i-blog.csdnimg.cn/blog_migrate/831ef4035eb59b063caeaa1f6bb43426.png)
测试服务
看这些返回的主机名:不一样吧。docker 为我们做了负载了。
![c578ce8a864a0ce387fde5aa6c327734.png](https://i-blog.csdnimg.cn/blog_migrate/02b83f8a6e3ee46e6dbe3eb535de949e.png)
原文链接
更多技术干货敬请关注云栖社区知乎机构号:阿里云云栖社区 - 知乎
本文为云栖社区原创内容,未经允许不得转载。