如何从另一个容器的公共地址访问反向代理后面的Docker容器

时间:2018-09-04 09:05:40

标签: docker nginx docker-compose jwilder-nginx-proxy

我设置了两个都暴露HTTP服务的Docker容器 a b 。它们应该通过其虚拟主机名 a.domain.com b.domain.com 公开访问。此外,a应该能够访问其公共虚拟主机名上的b,即它应该能够访问 b.domain.com 上的b。

使用docker-compose v2文件完成2个容器的设置

version: '2'
services:
  a:
    container_name: container-a
    build:
      context: ../
      dockerfile: Containers/A.Dockerfile
    ports:
      - 5001:80
    environment:
      VIRTUAL_HOST: a.domain.com
    depends_on:
      - b
    networks:
      - my-net

  b:
    container_name: container-b
    build:
      context: ../
      dockerfile: Containers/B.Dockerfile
    ports:
      - 5000:80
    environment:
      VIRTUAL_HOST: b.domain.com
    networks:
      - my-net

networks:
  my-net:
    driver: bridge

我将jwilder / nginx-proxy docker容器设置为自动创建反向代理nginx配置。我的两个容器a和b通过它们的用户定义的桥接网络连接,但也连接到运行nginx-proxy的默认桥接网络(docker network connect bridge container-(a|b)

nginx-proxy生成的nginx配置看起来还不错。

upstream a.domain.com {
            # a
            server 172.17.0.14:80;
}
server {
    server_name a.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://a.domain.com;
    }
}        
upstream b.domain.com {
            # a
            server 172.17.0.15:80;
}
server {
    server_name b.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://b.domain.com;
    }
}

可以从我的客户端计算机通过它们的公共虚拟主机名访问这两个容器。 问题是我的容器A无法通过其虚拟主机名b.domain.com到达容器B。它可以通过 container-b 访问它,但是这不是我的选择。 关于我在做什么错的任何想法或提示吗?

1 个答案:

答案 0 :(得分:1)

解决方案是向容器b添加一个别名,这样当容器a尝试解析b.domain.com时,不会将其重定向到主机,而是直接找到容器b。

只需在docker compose文件中为容器b添加一个别名: 代替

networks:
  - my-net

添加

networks:
  my-net:
    aliases:
      - b.domain.com