2016-10-27 12 views
2

現在私の会社でDocker-Composeを使用して開発スタックを実行しており、アプリケーションをコーディングするために必要なものすべてを開発者に提供しています。Docker nginx-proxy:コンテナ間のプロキシ

それは具体的には含まれています:

  • Gitlabコンテナ(sameersbn/gitlab)プライベートGitリポジトリを管理するために、
  • ジェンキンスコンテナ(library/jenkins)建物と継続的な統合のために、
  • Archivaコンテナ(ninjaben/archiva-docker )を使用してMavenリポジトリを管理します。 HTTPS経由のサービスを確保するために

、そして外の世界にさらす、私はにコンテナに環境変数を使用して自動化されたnginxのプロキシの設定を可能にする優れたnginxのプロキシコンテナ(jwilder/nginx-proxy)、および自動化されたHTTPをインストールHTTPSリダイレクト。

DNSは、ドッキングされたサービスの各パブリックURLをホストのIPにマッピングするように構成されています。すべてが期待どおりに動作しますが、開発者のワークステーション用

version: '2' 
services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy 
    ports: 
    - "80:80" 
    - "443:443" 
    volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
    - /var/config/nginx-proxy/certs:/etc/nginx/certs:ro 
    postgresql: 
    # Configuration of postgresql container ... 
    gitlab: 
    image: sameersbn/gitlab 
    ports: 
    - "10022:22" 
    volumes: 
    - /var/data/gitlab:/home/git/data 
    environment: 
    # Bunch of environment variables ... 
    - VIRTUAL_HOST=gitlab.my-domain.com 
    - VIRTUAL_PORT=80 
    - CERT_NAME=star.my-domain.com 
    archiva: 
    image: ninjaben/archiva-docker 
    volumes: 
    - /var/data/archiva:/var/archiva 
    environment: 
    - VIRTUAL_HOST=archiva.my-domain.com 
    - VIRTUAL_PORT=8080 
    - CERT_NAME=star.my-domain.com 
    jenkins: 
    image: jenkins 
    volumes: 
    - /var/data/jenkins:/var/jenkins_home 
    environment: 
    - VIRTUAL_HOST=jenkins.my-domain.com 
    - VIRTUAL_PORT=8080 
    - CERT_NAME=star.my-domain.com 

は最後に、ドッカー・作曲を使用して、私のドッキングウィンドウ-compose.ymlファイルは、次のようになります。差額サービスにはhttps://gitlab.my-domain.com,https://repo.my-domain.comおよびhttps://jenkins.my-domain.comでアクセスできます。

ドッキングサービスの1つが別のドッキングサービスにアクセスすると問題が発生します。たとえば、jenkins dockerからhttps://archiva.my-domain.comにアクセスしようとすると、プロキシからタイムアウトエラーが発生します。

archiva.my-domain.comがドッカーコンテナからパブリックホストIPとして解決されても、ドッキングされたサービスからの要求はnginx-proxyによってプロキシされていないようです。

私が理解する限り、docker-nginxはホストネットワークからの要求を処理しますが、内部コンテナネットワークからの要求(Docker-Composeスタックの_dockerconfig_default_)は気にしません。

なぜ、私はコンテナからプロキシを使用する必要があると言えるでしょうか?もちろん、私はJenkinsコンテナからURL http://archiva:8080を使用することができ、それはうまくいくでしょう。しかし、この種の設定はスケーラブルではありません。

たとえば、Gradleビルドを使用して1つのアプリケーションをコンパイルすると、build.gradleは自分のプライベートリポジトリをhttps://archiva.my-domain.comで宣言する必要があります。ビルドはなく、ジェンキンスコンテナを通じて、開発者のワークステーションから起動された場合は

もう一つの例は、同じURL GitLab認証は両方利用可能にする必要があるのOAuth GitLabサービスによるジェンキンスで認証です...動作します外側から、そしてジェンキンスの容器の中から。

私の質問はここにあります:コンテナから別のコンテナへのリクエストをプロキシするようにnginx-proxyを設定するにはどうすればいいですか?

私はこの問題について議論していませんでしたが、nginx設定で解決策を構築するのに十分な問題はありません。

本当にありがとうございます。

+0

質問に関連していなかったため、私の回答は削除されました。私は 'nginx-proxy'の作者からドッカーの作文に関する情報をここに残しています。 _現在、これはdocker-composeの新しいv2構文では機能しません(新しいネットワークオーバーレイと互換性がないため#304を参照)。これは、古いドッカー - コンポーザーの構文を使用して動作します._ – Marcs

+0

ドッカーホスト上のiptablesとルーティング設定を確認してください。さらに、ドッカープロキシ(ホスト上のポートバインディングサービス)とnginx-proxyがどのインターフェイスをリッスンしているかを確認します。ファイアウォールのルールのために、コンテナがホスト上のポートに接続することが許可されていないというのは良いことです。あなたはまた、ナットとマンガのiptablesをチェックしていることを確認してください。 – BMitch

+0

内部で通信する必要のあるコンテナにリンクする必要があります。 – Rao

答えて

0

BMitch、オッズは良い、それは確かにiptablesのルールの問題であり、nginxプロキシの誤った設定ではありませんでした。

テーブルfilter用チェーン入力のデフォルトポリシーはDROPであり、いかなるルールは、コンテナIPアドレスからACCEPT要求(127.20.X.X)に行われませんでした。

他の人が同じ問題に直面している場合は、記録のために、状況の詳細を説明します。

外部からコンテナにアクセスするために、DockerはPREROUTINGおよびFORWARDルールにルールを置き、外部IPをホストIPからコンテナIPにDNATすることができます。これらのデフォルトルールは外部IPを許可します。そのため、コンテナへのアクセスを制限するには、高度なiptablesのカスタマイズが必要です。

例えば、このリンクを参照してください:http://rudijs.github.io/2015-07/docker-restricting-container-access-with-iptables/

しかし、あなたのコンテナがホストリソースにアクセスする必要がある場合(サービスがホスト上でruningて、または私の場合には、nginxのプロキシコンテナはHTTP/HTTPSのホストポートに耳を傾け、コンテナへのプロキシ)、INPUTチェーンのiptablesルールに注意する必要があります。

実際には、要求容器から来てホスト宛がドッカーデーモンによってホストネットワークスタックにルーティングされる

しかし要求src IPであるとして、次に(INPUTチェーンを通過する必要がありますホスト1)。あなたがホストのリソースを保護し、コンテナがそれらにアクセスできるようにしたいのであれば、このような何かを追加するために覚えていない:

iptables -A INPUT -s 127.20.X.X/24 -j ACCEPT 

どこ127.20.X.X/24はあなたのコンテナが実行されている仮想ネットワークです。

ありがとうございました。

関連する問題