traefik docker网关

traefik 部署

# docker-compose.yml
services:
  traefik:
    image: traefik:latest
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--providers.docker.defaultRule=Host(`{{ .Name }}.localhost`)"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

不暴露端口的话,默认是无法访问的,除非显式配置networks跟traefik的networks对齐。

应用发布

零配置发布

version: "3.8"

services:
  my-app6:
    image: nginx:alpine
    ports:
      - "0:80"

如果配置了默认不暴露service,就需要增加自定义label声明。

自定义配置域名

version: '3.8'

services:
  my-app:
    image: nginx:alpine
    container_name: my-app-service
    labels:
      # 告诉 Traefik 接管这个容器
      - "traefik.enable=true"
      # 配置路由规则:访问 http://app.localhost 时转发到此容器
      - "traefik.http.routers.my-app.rule=Host(`app.localhost`)"
      - "traefik.http.routers.my-app.entrypoints=web"
      # 告诉 Traefik 容器内部服务端口是 80(Nginx 默认端口)
      - "traefik.http.services.my-app.loadbalancer.server.port=80"
    networks:
      - global_gateway

networks:
  global_gateway:
    external: true

收益

  • 不用担心端口冲突了,对外暴露端口修改为0:80 即可 0表示主机的任意端口
  • 可以使用域名访问 http://neo4j-neo4j.localhost 可以访问原来的 127.0.0.1:7474