如何从docker容器访问外部URL?

问题描述 投票:0回答:1

我有一个 Docker 容器,需要使用 URL 从 Amazon S3(云存储)访问文件。

代码很好,经过测试,不在 Docker 容器内时也可以在本地运行。但是,一旦在容器内运行,我就会不断收到以下错误:

[tcp @ 0x60636c0] Failed to resolve hostname xxxddd999.s3.amazonaws.com: Name or service not known

该错误来自一段需要从完整 AWS S3 位置 URL 读取文件的代码。但它失败了,因为它无法解析 URL。

制作/运行容器的命令是:

docker run --restart unless-stopped -p 4545:4545 --name fileprocessor fileprocessor:stage 

它从图像

fileprocessor:stage
创建容器
fileprocessor
并公开要运行的端口
4545
。我尝试在命令中添加
--net=host
标志,但这没有用,并且会阻止端口暴露。

我正在使用

nginx
运行它(目前在 Windows 上,但会将其移动到 Ubuntu 服务器上进行生产)。我想我必须在
nginx.conf
文件中做一些事情,但无法弄清楚。执行以下操作无效:

location /xxxddd999.s3.amazonaws.com/ {
        proxy_pass http://localhost; 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
docker nginx
1个回答
0
投票

当您位于容器内并且不需要设置网络配置时,您将必须使用

0.0.0.0
作为 IP 而不是 localhost 来联系主机。因为 localhost 指的是
fileprocessor
容器,而该容器无权访问端口
80

location /xxxddd999.s3.amazonaws.com/ {
        proxy_pass http://0.0.0.0:80; 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

请注意,

/xxxddd999.s3.amazonaws.com/
应该是路由(或文件)而不是外部主机名。

只有您的脚本(php、nodeJS)才会使用正确的 SDK 联系 AWS-S3

© www.soinside.com 2019 - 2024. All rights reserved.