【发布时间】: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