2016-08-08 6 views
8

Ich versuche, eine automatisierte Testplattform mit Docker und Selenium Grid einzurichten. Im folgenden Diagramm sehen Sie die Struktur, die ich verwende. Oben ist der Ubuntu-Server, der auf Compute Engine läuft. Auf der linken Seite befindet sich ein Andock-Container, der ubuntu 14.04 ausführt. Der Container führt unser Projekt auf localhost: 8080 mit Google App Engine aus. Auf der rechten Seite ist das Selen-Hub mit zwei Knoten läuft auf Port 4444.Verfügbarmachen von Ports in Docker funktioniert nicht

Docker and Selenium setup

Dies ist der Ausgang, wenn Docker ps ausgeführt wird:

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 

Wie können Sie sowohl die Nabe sehen und die ubuntu Container haben Ports aktiviert und werden vom Ubuntu-Host weitergeleitet, auf dem die Andock-Container ausgeführt werden. Ich habe diese Ports in Google Compute Engine geöffnet.

Im Docker Container Ich führe unser Projekt lokal mit Google App Engine sdk. Nach der Verwendung von docker exec -it drunk_kalam bash aktiviere ich den App Engine-Server. Der Befehl wird innerhalb des Andock-Containers ausgeführt. In Zukunft wird dies Teil des Skripts sein, aber da dies noch in Arbeit ist, wird es aus dem Container heraus ausgeführt. Weiter unten finden Sie das Projekt laufen zu sehen:

[email protected]:/# 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 

Das Problem ist, ich das Projekt nicht über den Port zugreifen kann 8080. ich den Port in meinem Dockerfile ausgesetzt habe, und ich habe versucht, mit der den Behälter läuft - P-Flag sowie das Flag -p 8080. Gefällt mir:

Ich habe den selen Hub mit genau dem gleichen Befehl gestartet, und dieser Port ist zugänglich. Wenn Sie den folgenden Befehl ausführen:

nmap -p 4444 172.17.0.3 

ich folgende Ausgabe:

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 

Als ich nmap auf 8080 auf dem Docker Container laufen bekommen, das Projekt läuft ich diese Ausgabe:

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 

Ich glaube, das Problem ist irgendwo in der Dockerfile des Ubuntu-Containers. Unten sehen Sie die Dockerfile, die Dockerdatei aus dem offiziellen Ubuntu-Repository, mit der hinzugefügten Zeile 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"] 

Der Befehl verwendet, um den Port zu belichten ist das gleiche wie die des Selenium Hub, nur mit einer anderen Portnummer. Ich kann nicht herausfinden, warum dieser Hafen geschlossen bleibt. Jede Hilfe wäre willkommen.

Vielen Dank im Voraus

Tijn

Antwort

2

Von Ihrem Ausgang: 0.0.0.0:32777->8080/tcp. Das besagt, dass Port 32777, der alle Schnittstellen überwacht, mit Port 8080 innerhalb des Containers (mit NAT und Docker-Proxy) verknüpft wird. Daher müssen Sie auf Port 32777 statt auf 8080 zugreifen. Diese zufällige Portzuordnung erfolgt, wenn Sie einen Port freigeben und ihn mit -P teilen.

Wenn Sie einen bestimmten Port ohne zufälliges Mapping teilen möchten, können Sie ihn mit der Option p: -p 8080:8080 oder sogar -p 8888:8080 definieren, um Port 8888 in Port 8080 des Containers zu mappen.

Von der Chat-Sitzung stellte sich heraus, dass die Anwendung Loopback im Container abhörte. Mit netstat -lnt, es zeigte:

tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 

die Anwendung Update auf 0.0.0.0 binden die Port-Weiterleitung wie erwartet funktionieren.

+0

Ich kann auf den Port 32777 zugreifen. Das Mapping funktioniert jedoch nicht, da der 8080-Port geschlossen ist. Daher kann mein Ubuntu-Host nicht auf den Docker-Container zugreifen. Ich habe versucht, es auch auf nicht-zufällige Ports zuzuordnen, aber die Tatsache, dass der 8080-Port auf dem Andock-Container geschlossen bleibt, ändert sich nicht. – Tijn

+0

Was sollte an Port 8080 abgehört werden? Von Ihrer PS-Ausgabe haben Sie bash gestartet. Die Shell selbst wird nicht auf Netzwerkverkehr warten. – BMitch

+0

Im Docker-Container leite ich unsere Website lokal mit Google App Engine sdk. Dies ist auf Port 8080 aktiv. Und ich kann nicht darauf zugreifen, ohne dass es Port 8080 abgehört. Zur Verdeutlichung: Der Selenium-Hub soll Tests auf dem localhost des Docker-Containers ausführen. – Tijn

Verwandte Themen