Как получить межсервисную сеть, работающую с docker-compose за корпоративным прокси? - PullRequest
0 голосов
/ 21 января 2019

Мне нужно запускать 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-составить запущенные службы?Есть ли способ для docker-compose автоматически добавить службы в переменную окружения no_proxy, создаваемую из ~/.docker/config.json?

1 Ответ

0 голосов
/ 21 января 2019

Лучший ответ, который у меня есть на сегодняшний день, заключается в том, что переменные окружения 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}

К сожалению, версия busybox wget, поставляемая с alpine, похоже, не поддерживает 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

Я не очень доволен этим решением, потому что:

  1. Я должен повторить его для no_proxy и NO_PROXY.
  2. Я должен либо перечислить все службы в no_proxy / NO_PROXY для всех служб, либо пройти через мой docker-compose.yml и настроить список для каждой службы на основе того, к чему я хочу получить
  3. Я не включаю ничего о no_proxy / NO_PROXY из ~/.docker/config.json, что может быть проблемой в некоторых настройках.

Учитывая, что docker уже выполняет синтаксический анализ no_proxy/ NO_PROXY из ~/.docker/config.json, было бы замечательно, если бы docker-compose мог основываться на этом, чтобы каким-то образом автоматически обрабатывать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...