首页 文章

dockercloud haproxy在不同端口上有多个服务

提问于
浏览
2

是否可以使用多个后端服务配置dockercloud / haproxy但是在另一个端口上侦听?我正在尝试使用端口80上的nginx为web前端设置docker-compose配置,然后在8080上运行Spring Boot应用程序的容器 .

默认情况下,haproxy会看到web和addressbook的链接容器(请参阅下面的.yml文件),但默认情况下它们都是由happroxy在端口80上公开的,因此Spring Boot容器永远不会在8080上接收流量 .

这个配置是否可行,或者我是否需要运行2个不同的haproxy容器,一个用于Web,一个用于REST后端服务?

到目前为止这是我的docker-compose.yml:

version: '2'

#build:
#  context: ./haproxy
#  image: haproxy
# dockerfile: Dockerfile

services:
    mongodata:
        image: mongo:3.2
    volumes:
    - /data/db
    entrypoint: /bin/bash
mongo:
    image: mongo:3.2
    depends_on: 
        - mongodata
    volumes_from:
        - mongodata
    ports:
    #only specify internal port, not external, so we can scale with docker-compose scale
        - "27017"
addressbook:
    image: addressbook
    depends_on: 
        - mongo
    environment:
        - MONGODB_DB_NAME=addressbook
    ports:
        - "8080"
    links:
        - mongo
web:
    image: docker-web-angularjs
    ports:
        - "80"
lb:
    image: dockercloud/haproxy
    #TODO: need to add an haproxy.cfg to configure for addressbook instances exposed behind 8080?
    #or can be configured via container properties?
    #image: haproxy
    depends_on: 
        - addressbook
    environment:
        - STATS_PORT=1936
        - STATS_AUTH="admin:password"
    links:
        - addressbook
        - web
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
        - 80:80
        - 8080:8080
        - 1936:1936

2 回答

  • 0

    对我来说,使用Traefik来实现目标更容易 .

    addressbook:
      image: addressbook
      depends_on: 
        - mongo
      environment:
        - MONGODB_DB_NAME=addressbook
      labels:
        - "traefik.backend=spring_boot"
        - "traefik.protocol=http"
        - "traefik.port=8080"
        - "traefik.frontend.entryPoints=http_8080"
      ports:
        - "8080"
      links:
        - mongo
    
    web:
      image: docker-web-angularjs
      labels:
        - "traefik.backend=nginx"
        - "traefik.protocol=http"
        - "traefik.port=80"
        - "traefik.frontend.entryPoints=http_80"
      ports:
        - "80"
    
    lb:
      image: traefik
      command: "--web --web.address=8081 --docker --docker.domain=docker.localhost \
                --logLevel=DEBUG \
                --entryPoints='Name:http_80 Address::80' \
                --entryPoints='Name:http_8080 Address::8080'"
      ports:
        - 80:80
        - 8080:8080
        - 8081:8081
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - /dev/null:/traefik.toml
    
  • 1

    您可以使用两个不同的路径公开这两个服务,这两个路径都位于haproxy容器的同一端口上 . 您可以使用环境变量 VIRTUAL_HOSTaddressbookweb 容器执行此操作:

    addressbook:
        image: addressbook
        depends_on: 
            - mongo
        environment:
            - MONGODB_DB_NAME=addressbook
            - VIRTUALHOST="/addressbook/*"
        ports:
            - "8080"
        links:
            - mongo
    web:
        image: docker-web-angularjs
        environment:
            - VIRTUALHOST="/web/*"
        ports:
            - "80"
    

    不幸的是,默认情况下,haproxy不会删除 webaddressbook 路径,因此您需要更新这两个应用程序才能管理"base path" .

相关问题