proxy - 如何在公司代理后面使用 docker-compose 获得服务间网络?
问题描述
我需要在公司代理后面运行 docker-compose 网络,但是由于代理,服务之间的访问通常最终通过代理进行路由,而代理显然不知道它们。
例如,这个docker-compose.yml
:
version: '3.4'
services:
webserver:
image: nginx
webtest:
image: alpine
command: sh -c "sleep 1 && wget -O - http://webserver"
失败是因为wget
询问公司代理webserver
并且它没有指向我创建的服务:
$ docker-compose up
Starting dgx-docker-network-test_webtest_1 ... done
Starting dgx-docker-network-test_webserver_1 ... done
Attaching to dgx-docker-network-test_webtest_1, dgx-docker-network-test_webserver_1
webtest_1 | Connecting to proxy.blah.blah.blah:8080 (xx.xx.xx.xx:8080)
webtest_1 | wget: server returned error: HTTP/1.1 307 Temporarily Moved for Domain Name Expansion
如果我将命令更改为不使用代理的工具,例如ping
,它可以正常工作:
$ docker-compose up
Starting dgx-docker-network-test_webserver_1 ... done
Starting dgx-docker-network-test_webtest_1 ... done
Attaching to dgx-docker-network-test_webserver_1, dgx-docker-network-test_webtest_1
webtest_1 | PING webserver (172.18.0.2): 56 data bytes
webtest_1 | 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.090 ms
webtest_1 | 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.095 ms
webtest_1 | 64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.076 ms
webtest_1 | 64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.072 ms
webtest_1 |
webtest_1 | --- webserver ping statistics ---
webtest_1 | 4 packets transmitted, 4 packets received, 0% packet loss
webtest_1 | round-trip min/avg/max = 0.072/0.083/0.095 ms
dgx-docker-network-test_webtest_1 exited with code 0
那么,最好的设置方法是什么,以便在尝试访问 docker-compose 启动的服务时忽略代理?docker-compose 有没有办法自动将服务添加到no_proxy
它创建的环境变量中~/.docker/config.json
?
解决方案
我迄今为止最好的答案是,需要在每个服务上更新no_proxy
和NO_PROXY
环境变量以包含它想要访问的服务。但这很笨重,如果有另一种方法会很棒:
version: '3.4'
services:
webserver:
image: nginx
webtest:
image: cirrusci/wget # docker image with prebuild GNU wget
command: sh -c "sleep 1 && wget -O - http://webserver"
environment:
- no_proxy=webserver,${no_proxy}
- NO_PROXY=webserver,${NO_PROXY}
不幸的是,alpine 附带的 busybox 版本wget
似乎不支持no_proxy
/ NO_PROXY
,所以我不得不使用已经准备好 GNU wget 的图像。但它确实有效:
$ docker-compose up
Starting dgx-docker-network-test_webserver_1 ... done
Starting dgx-docker-network-test_webtest_1 ... done
Attaching to dgx-docker-network-test_webserver_1, dgx-docker-network-test_webtest_1
webtest_1 | --2019-01-21 02:45:07-- http://webserver/
webtest_1 | Resolving webserver... 172.18.0.2
webtest_1 | Connecting to webserver|172.18.0.2|:80... connected.
webtest_1 | HTTP request sent, awaiting response... 200 OK
webtest_1 | Length: 612 [text/html]
webtest_1 | Saving to: 'STDOUT'
webtest_1 |
webtest_1 | 0K <!DOCTYPE html>
webtest_1 | <html>
webtest_1 | <head>
webtest_1 | <title>Welcome to nginx!</title>
webtest_1 | <style>
webtest_1 | body {
webtest_1 | width: 35em;
webtest_1 | margin: 0 auto;
webtest_1 | font-family: Tahoma, Verdana, Arial, sans-serif;
webtest_1 | }
webtest_1 | </style>
webtest_1 | </head>
webtest_1 | <body>
webtest_1 | <h1>Welcome to nginx!</h1>
webtest_1 | <p>If you see this page, the nginx web server is successfully installed and
webtest_1 | working. Further configuration is required.</p>
webtest_1 |
webtest_1 | <p>For online documentation and support please refer to
webtest_1 | <a href="http://nginx.org/">nginx.org</a>.<br/>
webtest_1 | Commercial support is available at
webtest_1 | <a href="http://nginx.com/">nginx.com</a>.</p>
webtest_1 |
webtest_1 | <p><em>Thank you for using nginx.</em></p>
webtest_1 | </body>
webtest_1 | </html>
webserver_1 | 172.18.0.3 - - [21/Jan/2019:02:45:07 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget/1.19.5 (linux-musl)" "-"
webtest_1 | 100% 62.8M=0s
webtest_1 |
webtest_1 | 2019-01-21 02:45:07 (62.8 MB/s) - written to stdout [612/612]
webtest_1 |
dgx-docker-network-test_webtest_1 exited with code 0
我对这个解决方案不太满意,因为:
- 我必须为
no_proxy
和重复一遍NO_PROXY
。 - 我必须列出所有服务中
no_proxy
/NO_PROXY
上的所有服务,或者docker-compose.yml
根据我想要访问的内容为每个服务完成我的和自定义设计的列表 - 我没有包含任何关于
no_proxy
/NO_PROXY
from 的内容~/.docker/config.json
,这在某些设置中可能是个问题。
鉴于它docker
已经在解析no_proxy
/ NO_PROXY
from ,如果可以在此基础上以某种方式自动处理~/.docker/config.json
它,那就太好了。docker-compose
推荐阅读
- django - Elastic beanstalk 没有响应安装的 SSL
- elasticsearch - Elasticsearch edge_ngram 分词器
- javascript - 为什么我的节点脚本在 Cloud Firestore 查询后等待 60 秒才能终止?
- c# - C# Parallel.ForEach,没有按预期工作
- mysql - 使用 express.js + mysql + ejs + typeORM 视图中未显示数据
- ubuntu - 在 ubuntu 中执行“bower start”命令后显示分段错误(核心转储)错误
- r - 有什么简单的方法可以在 R 中创建公式列表
- c - 有没有办法在调用 MakeWS2811() 后修改 rpi-ws281x-go 库中 LED 的亮度?
- python - 应用将列用作具有条件的列上的输入的函数
- c++ - 包装成员函数调用的模板类的行为