【问题标题】:Nginx revers proxy can't reach docker container by host nameNginx 反向代理无法通过主机名访问 docker 容器
【发布时间】:2020-02-26 23:22:35
【问题描述】:

Nginx 反向代理无法访问 docker 主机。在亚马逊 (EC2) 上托管 我想加载不同的应用程序取决于位置。

nginx.conf

server { 
 listen 80 ;
 server_name localhost;
 location /web {
  proxy_pass http://web:4000/;
 }}

位置有效,这意味着 nginx 映像构建正确。

码头工人撰写文件

services:
 web:
  image: web
  container_name: web
  ports:
   - 4000:4000
  hostname: web
  networks:
   - default
 nginx:
  image: nginx
  container_name: nginx
  ports:
   - 80:80                                                         
  depends_on:
  - web
  networks:
   - default
networks:
  default:
   external:
    name: my-network

我期待 - 当我输入 url /web 时,它应该显示来自 docker 容器的应用程序

我试过了

  Run single container - works fine (web or nginx) 
  Added 127.0.0.1 web in /etc/hosts (I can do 'curl web' but it shows localhost response)
  Added index index.html in location section
  Added resolver in the location section
  Use links instead of network

当“docker-compose up”时,我可以检查 docker 容器(网络)并查看 IP - 192.168.10.2 。然后curl 192.168.10.2 显示 index.html。但我不能让curl http://web:4000 似乎无法访问主机名,但我认为在 proxy_pass 中使用 IP 是一个糟糕的决定。

【问题讨论】:

  • this问题/讨论,也许对你有帮助?
  • 我会通过删除所有 networks:hostname:container_name: 块来简化 docker-compose.yml;这有什么不同吗?如果 my-network 网络有另一个名为 web 的容器没有在端口 4000 上侦听,这可能会导致您看到的问题;来自 nginx 的实际连接错误将有助于进一步诊断。
  • BTW:你不需要发布4000端口。同一网络中的容器总是可以在所有端口上进行内部通信。

标签: docker nginx docker-compose


【解决方案1】:

我无法处理这些问题,所以我选择了另一种方法。

创建网络ipam

 docker network create --gateway 172.20.0.1 --subnet 172.20.0.0/24 ipam 

在 docker-compose 文件中为每个服务分配 ipv4address

networks:
  default:
    ipv4_address: 172.20.0.5 for web
where
networks:
   default:
    external:
      name: ipam

在我的 web docker 镜像中为目录 /var/www/html 添加 chmod

chmod -R 755 /var/www/html

(如果你在 windows docker 下构建 LINUX 容器,似乎需要这个额外的步骤)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 2016-06-20
    • 2017-11-13
    • 1970-01-01
    • 2017-09-25
    • 2021-05-04
    • 2020-01-19
    • 2019-07-19
    相关资源
    最近更新 更多