1

我设置了 2 个 Docker 容器ab,它们都公开了 HTTP 服务。它们应该可以通过它们的虚拟主机名a.domain.comb.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访问它,但这不是我的选择。关于我做错了什么的任何想法或提示?

4

1 回答 1

2

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

只需在容器 b 的 docker compose 文件中添加一个别名:而不是

networks:
  - my-net

添加

networks:
  my-net:
    aliases:
      - b.domain.com
于 2018-09-06T10:40:57.680 回答