3.3 Docker Compose下的构建执行

未匹配的标注

整理环境

上一章中,我们已经创建了etcdaccountapigw这三个镜像对应的容器。在Docker Compose中,我们想重新创建新的容器,不被之前的容器所干扰,并且把它们放在一个专属的网络中去,所以我们需要删除之前创建的容器。

docker rm -f etcd1 account apigw

然后我们创建一个名为gomicrobridge类型专属的网络,将Docker Compose创建的容器的网络都放在gomicro这个网络下。

docker network create gomicro --driver bridge

traefik

上一章和之前,我们都是通过IP:Port的形式来进行服务的访问。当时实际环境中,我们是需要通过域名来进行访问的,所以,我们还需要一款反向代理、负载均衡软件来帮助我们,这里我们使用的是——Traefik

简单介绍

Traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。

它跟Nginx最大的不同有两点:

  • 完美支持Docker Compose, Swarm, Kubernetes不同容器编排工具
  • 可以动态发现服务(服务主动注册通知traefik),然而Nginx只能通过手动更改配置文件来增删节点。

最重要的是它是用Go写的呀~

更多相关内容可以通过Traefik的官方文档进行了解使用

toml

我们先来编写一下traefik的配置文件traefik/traefik.toml

defaultEntryPoints = ["http"]

[global]
  checkNewVersion = false
  sendAnonymousUsage = false

[log]
  level = "WARN"
  format = "common"

[api]
  dashboard = true
  insecure = true

[ping]

[accessLog]

[providers]
  [providers.docker]
    watch = true
    exposedByDefault = false
    endpoint = "unix:///var/run/docker.sock"
    swarmMode = false
    useBindPortIP = false
    network = "traefik"
  [providers.file]
    watch = true
    directory = "/etc/traefik/config"
    debugLogGeneratedTemplate = true

[entryPoints]
  [entryPoints.http]
  address = ":80"

Docker Compose

traefik/docker-compose.yml

version: '3'

services:
  proxy:
    image: traefik:v2.2
    command: --api.insecure=true --providers.docker
    networks:
      - web
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/etc/traefik/traefik.toml

networks:
  web:
    external:
      name: gomicro

然后我们执行

docker-compose up -d

此时traefik已经启动了,我们访问http://127.0.0.1:8080查看一下它提供的dashboard
3.3 Docker Compose下的构建执行

etcd

Docker Compose

etcd/docker-compose.yml

version: '2'

services:
  etcd1:
    image: quay.io/coreos/etcd:v3.3.8
    container_name: etcd1
    command: etcd -name etcd1 --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379
    ports:
      - "2379:2379"
      - "2380:2380"
    networks:
      - web

networks:
  web:
    external:
      name: gomicro

然后我们启动etcd

docker-compose up -d

account

Docker Compose

account/deploy/docker-compose.yml

version: '2'

services:
  # account service
  account1:
    image: registry.cn-shenzhen.aliyuncs.com/go_micro/account:v1.0
    container_name: account1
    networks:
      - web
    environment:
      - PARAMS=--registry etcd --registry_address etcd1:2379

  account2:
    image: registry.cn-shenzhen.aliyuncs.com/go_micro/account:v1.0
    container_name: account2
    networks:
      - web
    environment:
      - PARAMS=--registry etcd --registry_address etcd1:2379

  account3:
    image: registry.cn-shenzhen.aliyuncs.com/go_micro/account:v1.0
    container_name: account3
    networks:
      - web
    environment:
      - PARAMS=--registry etcd --registry_address etcd1:2379

networks:
  web:
    external:
      name: gomicro

这里,我们特意创建了3个account服务实现高可用。

因为docker-compose启动时会根据当前的所在目录名取名,这样目录名称下执行docker-compose会被认为冲突 所以需要特定名称

docker-compose -p go_micro_account up -d

apigw

Docker Compose

apigw/deploy/docker-compose.yml

version: '2'

services:
  # apigw service
  apigw:
    image: registry.cn-shenzhen.aliyuncs.com/go_micro/apigw:v1.0
    container_name: apigw
    networks:
      - web
    ports:
      - "8091:8091"
    environment:
      - PARAMS=-p 8091 --registry etcd --registry_address etcd1:2379
    labels:
      # traefik固定,与traefik设置的container_name无关
      # apigw 是 container_name
      - "traefik.enable=true" # 必填 否则无法加入traefik
      - "traefik.http.routers.apigw.rule=Host(`apigw.guaosi.com`)" # 外部域名请求
      - "traefik.http.services.apigw.loadbalancer.server.port=8091" # 转发至本容器指定port

  apigw2:
    image: registry.cn-shenzhen.aliyuncs.com/go_micro/apigw:v1.0
    container_name: apigw2
    networks:
      - web
    ports:
      - "8092:8092"
    environment:
      - PARAMS=-p 8092 --registry etcd --registry_address etcd1:2379
    labels:
      # traefik固定,与traefik设置的container_name无关
      # apigw 是 container_name
      - "traefik.enable=true" # 必填 否则无法加入traefik
      - "traefik.http.routers.apigw2.rule=Host(`apigw.guaosi.com`)" # 外部域名请求
      - "traefik.http.services.apigw2.loadbalancer.server.port=8092" # 转发至本容器指定port
networks:
  web:
    external:
      name: gomicro

这里,我们特意创建了2个apigw服务实现高可用。

docker-compose -p go_micro_apigw up -d

验证

Dashboard

此时我们再进入traefikdashboard,我们可以发现网关信息已经注册到Traefik上了
3.3 Docker Compose下的构建执行

域名

我们直接更改hosts文件,将apigw.guaosi.com指向本地

apigw.guaosi.com 127.0.0.1

验证

我们发送请求进行验证

> curl -X POST -d "username=guaosi&password=guaosi" http://apigw.guaosi.com/account/register

{"code":0,"message":""}

我们可以通过查看相同服务不同容器的日志,以及停止容器来验证服务的高可用与负载均衡调度。

代码仓库

最终的代码和部署文件,已经传至github,欢迎star。

github.com/guaosi/go-micro-build

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~