sgo*_*ohl 6 nginx docker docker-swarm
我在思考这意味着如何认真地完成数周,但尚未得出结论。也许我想错了方向。
假设您有一百个网络应用程序来来去去。你想要一个像 gitlab 这样的 nginx 配置:
location / {
proxy_pass http://gitlab;
}
Run Code Online (Sandbox Code Playgroud)
由于 gitlab 是用 来创建的docker service create,nginx 将能够通过它在你的入口网络中的 swarm-vip 假 dns 名称来解析 gitlab。
但是:仅当服务容器正在运行时。否则,nginx 将无法启动,因为 [emerg] 1#1: host not found in upstream "gitlab"
现在,当您必须运行高可用性 nginx 并且确保 proxy_pass 的应用程序正在运行不是您的业务时,这将是一个难题。
每次更新 nginx 服务时,如果其他一百个 swarm 服务中只有一个在同一秒内没有运行,它就不会出现……wtf?
如果这不起作用,为什么我们需要在 swarm 中进行名称解析?你怎么解决这个问题?
我考虑过 consul 和 nginx 虚拟主机模板的动态生成(甚至不要考虑 docker-nginx-proxy!),但是应用程序非常不同,您可以说每个应用程序都有自己的单独配置。而这一切工作不是为了特殊原因,只是为了解决nginx的解决问题?
我建议为 traefik 更换静态定义的 nginx 反向代理,它具有群感知能力,并且可以在部署和销毁服务时动态重新配置自身。
这是一个示例实现:
为 traefik 创建一个与容器通信的网络: docker network create proxy
制作一个 traefik.toml,这是一个例子:
traefik.toml
accessLogsFile = "/proc/1/fd/1"
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[web]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "localhost"
watch = true
swarmmode = true
constraints = ["tag==frontend"]
Run Code Online (Sandbox Code Playgroud)
docker-compose.traefik.yml
version: '3'
networks:
proxy:
external:
name: proxy
services:
traefik:
image: traefik:latest
volumes:
- ./traefik.toml:/etc/traefik/traefik.toml:ro
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 80:80
- 8080:8080
networks:
- proxy
restart: unless-stopped
Run Code Online (Sandbox Code Playgroud)
docker-compose.app.yml
version: '3'
networks:
proxy:
external: true
services:
webtest:
image: nginx:latest
networks:
- default
- proxy
labels:
- traefik.frontend.rule=PathPrefixStrip:/webtest
- traefik.port=80
- traefik.docker.network=proxy
- traefik.tags=frontend
restart: unless-stopped
Run Code Online (Sandbox Code Playgroud)
为简单起见,上述规则使用容器的路径前缀,但您可以使用任何您喜欢的规则来代理您的应用程序。
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |