2017-07-29 18 views
6

8800で簡単なHTTPエコーサービスを開始するdocker-compose.ymlファイルがあります。ドッカー内で作成されたドッキング用コンテナにアクセスできない

version: '2' 

services: 
    echo-server: 
     image: luisbebop/echo-server 
     container_name: echo-server 
     ports: 
     - "8800:8800" 

スーパーシンプルなもの。 docker-compose upを実行してローカルマシンで実行した場合:

echo "Hello World" | nc 127.0.0.1 8800 

次にエコーが表示されます。 ただし: GitLabランナーを使用してドッキング・コンテナー内で同じ構成シナリオを実行すると、失敗します。 https://gitlab.com/gitlab-org/gitlab-ce/issues/26566

マイ.gitlab-ci.ymlファイルは次のようになります:

は、私は限られた結果と、ここにGitLabで、この問題のために注目を集めるために試してみた

--- 

stages: 
    - docker_test 

services: 
    - docker:dind 

docker_test: 
    stage: docker_test 
    image: docker:latest 
    script: 
    - docker version 
    - apk update 
    - apk add py-pip 
    - pip install docker-compose 
    - docker-compose up -d 
    - sleep 10 
    - netstat -tulpn 
    - docker-compose port echo-server 8800 
    - echo "Hello world" | nc 127.0.0.1 8800 

そしてgitlab-ci-multi-runner exec docker --docker-privileged docker_testの出力は次のようになります。

ドックを担当しているドッカーのコンテナ内にこれらのポートがないようですr編成サービス。私は何か間違っているのですか?

私はむしろ、私はちょうどポートがそのコンテナに利用できるビルドを、実行中のドッキングウィンドウコンテナでを開けたい、ポートがホストレベルで露出たくないん

Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800 

^Not here  ^I want port 8800 accessible here 

編集:私は実行されているCIコンテナにシェルを取り付けた場合はまた、私は次を参照してください。

/ # docker ps 
CONTAINER ID  IMAGE     COMMAND     CREATED    STATUS    PORTS     NAMES 
ab192edf5872  luisbebop/echo-server "/opt/echo-server/..." 2 minutes ago  Up About a minute 0.0.0.0:8800->8800/tcp echo-server 
/# netstat -nltup 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 

だから、コンテナを「見る」、およびポートマッピングは大丈夫に見えますが、ポートは実際にリッスンしていません。

+0

このことは、「内部」ドッキングウィンドウは、まだ外ドッカエンジン上で動作するということです - ポートバインドは実際には "ルート"ホストマシンのローカルホストにバインドされます。ただし、docker-composeファイルで使用するドッカーネットワークを指定し、GitLabコンテナに接続されているドッカーネットワークを設定できます。あなたは 'nc echo-server 8800' –

+0

に私の前のコメントに接続することができます.GitLabのコンテナは' bridge'ネットワークを使うでしょう。 docker-compose.ymlの 'echo-server'に' network_mode:bridge'を追加してください。コマンドを 'nc echo-server 8800'に変更します。それでもドメイン名が解決されないことがあります。その場合、 '$(docker inspect -f '{{range .NetworkSettings.Networks}} {{。IPAddress}} {{end}} 'echo-server) ' –

+0

こんにちは@LukášDoležal、私は完全にそうであるとは思わない。 "root"ホストマシンで 'docker ps'を実行すると、' docker:dind'サービスと 'docker:latest'イメージの2つのコンテナが表示されます。 'docker:dind'コンテナの中で' docker ps'を実行すると、 'docker-compose'で開始された3つのコンテナが表示されます。さらに、「ルート」ホスト(私のMac)から、実行中であるにもかかわらず、私が8800上のWebサービスにアクセスすることができません。 (質問の先頭にあるように、 'docker-compose'を手動で実行しても問題ありません。) –

答えて

6

コンテナは、あなたのケースでは、Gitlabビルドをサポートしている他のコンテナである「ドッキングウィンドウのホスト」上で実行されている:私は間違っていないよ場合は、

services: 
    - docker:dind 

そのホストを名前はdockerです。したがって、このようにアクセス:

echo "Hello world" | nc docker 8800 

がドッキングウィンドウデーモンのホストであるかを把握するには、これを使用する:

script: 
    - echo $DOCKER_HOST 
+2

それはそうしました。あなたは私の最近のDockerの質問で2の2です。 〜:23時間での賞金。 –

+0

それを聞いてうれしい! @CraigOtis、多くのありがとう;)! – Robert

関連する問題