Разоблачение портов в Docker не будет работать

Я пытаюсь настроить автоматизированную платформу тестирования с помощью Docker и Selenium Grid. На диаграмме ниже вы можете увидеть структуру, которую я использую. Сверху находится сервер Ubuntu, работающий на Compute Engine. Слева находится док-контейнер под управлением Ubuntu 14.04. Контейнер запускает наш проект на localhost:8080 с Google App Engine. Справа находится Selenium Hub с двумя узлами, работающими на порту 4444.

Настройка Docker и Selenium

Это вывод при запуске Docker PS:

CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                     NAMES
f5ac6e3c8270        xxxxx/ubuntuport:14.04              "/bin/bash"              3 days ago          Up 13 seconds       0.0.0.0:32777->8080/tcp   drunk_kalam
4246ca0790db        eu.gcr.io/xxxxxx/selenium-chrome    "/bin/sh -c 'rm -rf /"   4 weeks ago         Up 3 days                                     evil_mahavira
8d06f90a1a84        eu.gcr.io/xxxxxx/selenium-firefox   "/bin/sh -c 'rm -rf /"   4 weeks ago         Up 3 days                                     nauseous_torvalds
dc548f638778        eu.gcr.io/xxxxxx/selenium-hub       "/opt/bin/entry_point"   4 weeks ago         Up 3 days           0.0.0.0:32770->4444/tcp   modest_khorana

Как вы можете видеть, и концентратор, и контейнер ubuntu имеют активированные порты, которые перенаправляются с хоста ubuntu, на котором работают контейнеры докеров. Я открыл эти порты в Google Compute Engine.

В Docker-контейнере я запускаю наш проект локально с помощью Google App Engine SDK. После использования docker exec -it drunk_kalam bash Я активирую сервер App Engine. Команда запускается из контейнера Docker. В будущем это будет частью сценария, но, поскольку он все еще находится в стадии разработки, он запускается из контейнера. Ниже вы можете увидеть запущенный проект:

root@f5ac6e3c8270:/# google_appengine/dev_appserver.py --php_executable_path=/usr/bin/php5-cgi --php_gae_extension_path=appengine-php-extension/modules/gae_runtime_module.so ./xxxxxxxxxxxxxxx/
INFO     2016-08-08 12:19:49,287 sdk_update_checker.py:229] Checking for updates to the SDK.
WARNING  2016-08-08 12:19:49,532 simple_search_stub.py:1146] Could not read search indexes from /tmp/appengine.xxxxxxxxxxx.root/search_indexes
INFO     2016-08-08 12:19:49,535 api_server.py:205] Starting API server at: http://localhost:39475
WARNING  2016-08-08 12:19:51,217 inotify_file_watcher.py:196] There are too many directories in your application for changes in all of them to be monitored. You may have to restart the development server to see some changes to your files.
INFO     2016-08-08 12:19:51,218 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-08-08 12:19:51,220 admin_server.py:116] Starting admin server at: http://localhost:8000

Проблема в том, что я не могу получить доступ к проекту через порт 8080. Я открыл порт в своем Dockerfile, и я попытался запустить контейнер с флагом -P, а также флагом -p 8080. Как это:

docker run -dPi xxxxx/ubuntuport:14.04

Я запустил концентратор селена с той же самой командой, и этот порт доступен. При запуске следующей команды:

nmap -p 4444 172.17.0.3

Я получаю следующий вывод:

Nmap scan report for 172.17.0.3
Host is up (0.00010s latency).
PORT     STATE SERVICE
4444/tcp open  krb524
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

Когда я запускаю nmap на 8080 в контейнере Docker, на котором выполняется проект, я получаю такой вывод:

Nmap scan report for 172.17.0.2
Host is up (0.000085s latency).
PORT     STATE  SERVICE
8080/tcp closed http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

Я считаю, что проблема где-то в Dockerfile контейнера Ubuntu. Ниже вы можете увидеть Dockerfile, который является dockerfile из официального репозитория Ubuntu, с добавленным EXPOSE 8080 линия.

FROM scratch
ADD ubuntu-trusty-core-cloudimg-amd64-root.tar.gz /

EXPOSE 8080

# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
    \
    && echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
    && echo 'exit 101' >> /usr/sbin/policy-rc.d \
    && chmod +x /usr/sbin/policy-rc.d \
    \
    && dpkg-divert --local --rename --add /sbin/initctl \
    && cp -a /usr/sbin/policy-rc.d /sbin/initctl \
    && sed -i 's/^exit.*/exit 0/' /sbin/initctl \
    \
    && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
    \
    && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
    && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
    && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
    \
    && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
    \
    && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
    \
    && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

RUN rm -rf /var/lib/apt/lists/*

RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list

CMD ["/bin/bash"]

Команда, используемая для показа порта, такая же, как и для Selenium Hub, только с другим номером порта. Я не могу понять, почему этот порт остается закрытым. Любая помощь будет оценена.

заранее спасибо

Tijn

1 ответ

Решение

Из вашего вывода: 0.0.0.0:32777->8080/tcp, При этом порт 32777, прослушивающий все интерфейсы, будет сопоставлен (с NAT и прокси-сервером Docker) порту 8080 внутри контейнера. Поэтому вам необходимо получить доступ к порту 32777 вместо 8080. Такое случайное сопоставление портов происходит, когда вы открываете порт и делитесь им с -P,

Если вы хотите использовать определенный порт без случайного сопоставления, вы можете определить его с помощью строчной опции p: -p 8080:8080 или даже -p 8888:8080 сопоставить порт 8888 с портом 8080 контейнера.


Из сеанса чата оказалось, что приложение прослушивает зацикливание внутри контейнера. С netstat -lnt, он показал:

tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 

Обновление приложения для привязки к 0.0.0.0 позволило переадресации портов работать должным образом.

Другие вопросы по тегам