3.3 Docker Compose下的构建执行
整理环境
上一章中,我们已经创建了etcd
、account
、apigw
这三个镜像对应的容器。在Docker Compose
中,我们想重新创建新的容器,不被之前的容器所干扰,并且把它们放在一个专属的网络中去,所以我们需要删除之前创建的容器。
docker rm -f etcd1 account apigw
然后我们创建一个名为gomicro
的bridge
类型专属的网络,将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
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
此时我们再进入traefik
的dashboard,我们可以发现网关信息已经注册到Traefik
上了
域名
我们直接更改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。