【问题标题】:Docker Compose Nginx within container unable to use public address of same containerDocker Compose Nginx 在容器内无法使用同一容器的公共地址
【发布时间】:2020-01-01 03:40:12
【问题描述】:

我无法在具有公共 IP 地址的容器内 curl/wget

nGinX

server {
  listen 3001;
  listen [::]:3001;

  location / {
    proxy_pass http://api;
  }
}

server {
  listen 3002;
  listen [::]:3002;

  location / {
    proxy_pass http://web;
  }
}

码头工人撰写

services:
  api:
    image: api
    container_name: api
    build: ./api
    restart: always
    networks:
      - docker-network

  web:
    image: web
    container_name: web
    build: ./web
    restart: always
    networks:
      - docker-network

  proxy:
    image: nginx
    container_name: proxy
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/proxy.conf
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "3001:3001"
      - "3002:3002"

    networks:
      - docker-network

networks:
  docker-network:
    driver: bridge

容器内:

docker ps

docker exec -it web bash

wget example.com -> 响应 200 工作正常

wget <public ip address of my server>:3001 -> 连接超时

谁能帮助理解我们如何通过公共调用从容器内部对另一个容器进行 http/curl/wget 调用?这在服务器端渲染的情况下很有用,我们需要从api 获取web 中的数据

【问题讨论】:

  • docker exec -it proxy bash 然后wget/curl http://api 以确保您的api实际上在80端口上侦听?
  • 代理正在监听 80 端口。api:3001 可以工作,但不能使用公共 IP
  • 但是你的 ngnix 配置说 location / { proxy_pass http://api; } 意味着它将把它在 3001 上得到的东西代理到 api:80 因为 80 是 http 的默认值。顺便说一句,您的 docker-compose yaml 看起来很好,应该可以工作。这就是为什么我正在研究 nginx 配置。
  • 我在没有 nGinX 和容器内部的情况下尝试过,如果我使用公共 IP 地址进行 wget,它仍然无法解析。这里有一个例子:codemochi.com/blog/2019-07-10-prisma-2-nextjs-docker"docker-compose 为我们处理网络,所以我们不必知道后端容器在 docker 网络中的实际 IP 地址是什么——我们可以简单地通过 DNS 名称来引用它,即我们的容器名称,docker 为我们处理网络。”

标签: docker nginx docker-compose reverse-proxy devops


【解决方案1】:

原来我在 DigitalOcean 上使用的是 Ubuntu,但仅使用 CentOS 就可以解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多