如何从另一个容器的 public 地址访问反向代理后面的 docker 容器
How to access a docker container behind a reverse proxy on it's public address from another container
我设置了 2 个 Docker 容器 a 和 b 都公开了 HTTP 服务。他们应该 public 只能通过他们的虚拟主机名 a.domain.com 和 b.domain.com 访问。此外,a 应该能够在其 public 虚拟主机名上访问 b,即它应该能够在 b.domain.com.
上访问 b
2 个容器的设置是使用 docker-compose v2 文件完成的
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;
}
}
这两个容器都可以通过它们的 public 虚拟主机名从我的客户端计算机访问。
问题是我的容器 A 无法访问其虚拟主机名 b.domain.com 上的容器 B。它可以通过 container-b 访问它,但这对我来说不是一个选项。
关于我做错了什么的任何想法或提示?
解决方法是给容器b加一个别名,这样当容器a尝试解析时b.domain.com不会被重定向到宿主机而是直接找到容器b
只需在 docker compose 文件中为容器 b 添加一个别名:
而不是
networks:
- my-net
添加
networks:
my-net:
aliases:
- b.domain.com
我设置了 2 个 Docker 容器 a 和 b 都公开了 HTTP 服务。他们应该 public 只能通过他们的虚拟主机名 a.domain.com 和 b.domain.com 访问。此外,a 应该能够在其 public 虚拟主机名上访问 b,即它应该能够在 b.domain.com.
上访问 b2 个容器的设置是使用 docker-compose v2 文件完成的
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;
}
}
这两个容器都可以通过它们的 public 虚拟主机名从我的客户端计算机访问。 问题是我的容器 A 无法访问其虚拟主机名 b.domain.com 上的容器 B。它可以通过 container-b 访问它,但这对我来说不是一个选项。 关于我做错了什么的任何想法或提示?
解决方法是给容器b加一个别名,这样当容器a尝试解析时b.domain.com不会被重定向到宿主机而是直接找到容器b
只需在 docker compose 文件中为容器 b 添加一个别名: 而不是
networks:
- my-net
添加
networks:
my-net:
aliases:
- b.domain.com