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://yq.aliyun.com/articles/339165