невозможно подключиться к локальному докеризованному контейнеру devpi для установки pip в другом контейнере без "--net = host" - PullRequest
0 голосов
/ 20 января 2020

Я использую devpi в docker контейнере, например:

[Unit]
Description=devpi docker-container
Requires=docker.service
After=docker.service

[Service]
Restart=always
RestartSec=3
ExecStart=/usr/bin/docker run --rm -p 3141:3141 --name devpi -v /devpi_data:/data -e DEVPI_PASSWORD='********' akailash/docker-devpi
ExecStop=/usr/bin/docker stop -t 2 devpi

[Install]
WantedBy=multi-user.target

Работает нормально. Я могу получить к нему доступ через URL на хосте, а также установить пакеты с него, как и ожидалось.

6f663ba131a1        akailash/docker-devpi   "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:3141->3141/tcp   devpi

Однако, если я хочу создать еще один образ docker для установки пакетов из этого контейнера, есть ConnectTimeout. Если я попытаюсь свернуться, время соединения истекает через некоторое время.

Я могу выполнить установку pip, если я использую опцию --net = host, как описано в этом выпуске . Однако я не хочу использовать хост-сеть. Я пробовал 0.0.0.0:3141, а также 172.17.0.1:3141, и у меня такие же результаты. Добавление --ip = 0.0.0.0 в службу демона docker не работает для меня. Как я могу получить доступ к контейнеру devpi из другого контейнера без необходимости каждый раз использовать --net = host?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Так как мне нужен доступ только к devpi, для которого требуется сборка docker изображений в моем файле docker, я использовал сеть хоста в контексте сборки:

build:
  network: host
  context: .
  dockerfile: Dockerfile.local

Это помогает получить доступ к devpi правильно.

0 голосов
/ 20 января 2020

Если вы не хотите использовать --net=host, вам нужно открыть порты на машине, на которой запущен devpi, чтобы позволить внешним клиентам подключаться и использовать его.

Дело в том, что когда вы устанавливаете хост-сеть на docker, он берет свой собственный IP-адрес, а затем может привязать столько портов, сколько вам нужно, к этому IP-адресу, но если вы его не используете, ваш компьютер выступает в роли маршрутизатора для контейнера и применяет NAT , чтобы разрешить доступ к inte rnet для исходящего трафика c, но запретить входящий трафик c.

Из-за этого, если вы не хотите использовать сеть хоста вам нужно изменить брандмауэр, добавив правило NAT назначения и разрешив трафику c доступ к службе.

У вас есть несколько хороших примеров того, как разрешить порты на iptables здесь

...