2016-08-08 16 views
8

DockerとSelenium Gridで自動テストプラットフォームをセットアップしようとしています。下の図では、私が使用している構造を見ることができます。一番上には、Compute Engineで動作するubuntuサーバーがあります。左側には、ubuntu 14.04を実行しているドッカーコンテナがあります。コンテナは、Google App Engineを使用してlocalhost:8080でプロジェクトを実行します。あなたがハブとUbuntuの両方を見ることができるようにDockerにポートを公開すると動作しません

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 

:右側にドッキングウィンドウpsを実行しているとき、これが出力されているポート4444

Docker and Selenium setup

上で実行している2つのノードを持つセレンのハブでありますコンテナにはポートが有効化されており、ドッカーコンテナを実行しているubuntuホストから転送されます。 Google Compute Engineでこれらのポートを開設しました。

ドッカーコンテナで私はGoogle App Engine SDKでローカルにプロジェクトを実行しています。 docker exec -it drunk_kalam bashを使用した後、私はApp Engineサーバを起動します。このコマンドは、ドッカーコンテナ内から実行されます。将来、これはスクリプトの一部になりますが、これはまだ進行中の作業なので、コンテナ内から実行されています。以下は、プロジェクトの実行を見ることができます:

[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 

問題は、私は私が私のDockerfileにポートを公開してきた、と私はコンテナを実行しようとしたポート8080経由のプロジェクトにアクセスすることはできませんです - 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 

私はプロジェクトを実行しているドッキングウィンドウコンテナに8080でnmapを実行すると、私はこの出力を得る:

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 

私はこの問題がubuntuコンテナのDockerfileのどこかにあると信じています。以下は、公式のubuntuリポジトリのdockerfileであるDockerfileと、それに加えて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

答えて

2

0.0.0.0:32777->8080/tcp。つまり、すべてのインターフェイスでリッスンしているポート32777は、コンテナ内のポート8080に(NATおよびドッカープロキシを使用して)マップされます。したがって、8080の代わりにポート32777にアクセスする必要があります。ポートを公開して-Pと共有すると、このランダムなポートマッピングが行われます。

ランダムマッピングなしで特定のポートを共有する場合は、小文字のpオプション:-p 8080:8080、さらには-p 8888:8080を使用してポート8888をコンテナのポート8080にマッピングすることができます。


チャットセッションから、これはコンテナ内のループバックをリッスンするアプリケーションであることが判明しました。 0.0.0.0にバインドするアプリケーションを更新する

tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 

期待通りにポートフォワーディングが動作することができ:netstat -lntで、それはありました。

+0

32777ポートにアクセスできます。しかし、8080ポートが閉じているため、マッピングは機能しません。したがって私のubuntuホストはDockerコンテナにアクセスできません。私は非ランダムなポートでもマッピングしようとしましたが、ドッカーコンテナの8080ポートが閉じたままであるという事実は変わりません。 – Tijn

+0

ポート8080で何を聞くべきですか?あなたのpsの出力から、あなたはbashを起動しました。シェル自体はネットワークトラフィックをリッスンしません。 – BMitch

+0

ドッカーコンテナで私はGoogle App Engine SDKでローカルにウェブサイトを運営しています。これはポート8080でアクティブです。ポート8080でリッスンすることなくアクセスできません。明確にするには:SeleniumハブはDockerコンテナのローカルホストでテストを実行することになっています。 – Tijn

関連する問題