web-dev-qa-db-ja.com

1つのIPをDockerコンテナーに転送する

私が理解している限り、Dockerは、ブリッジインターフェイスdocker0で、独自のIPと完全に開いたポートを使用してコンテナーを実行します。

コンテナを起動し、独自のIP:172.17.0.11があり、パブリックイーサネット93.x.x.xの仮想イーサネットインターフェイスeth0.1があるとします。

Eth0.1をdockerコンテナーに転送して、eth0.1 IP経由でコンテナーに到達できるようにするにはどうすればよいですか?

すべてのポートを一度に転送できますか? (多分台本付き)

Dockerのデフォルトの動作を無効にして、各コンテナーがdocker0インターフェイスでのみIPを取得し、転送を手動でセットアップするにはどうすればよいですか?

あずきっく

あそこに説明された方がいいと思ってリンクしました。 debianの設定を確認した場合、/ etc/net/interfacesファイルに次のように追加します。

post-up /sbin/ifconfig eth0:X IP.OF.FAIL.OVER netmask 255.255.255.255 broadcast IP.OF.FAIL.OVER
post-down /sbin/ifconfig eth0:X down

このようにして、仮想インターフェイス(eth0:0)ができました。これには、プロバイダーから転送されたパブリックIPがあります。私のサーバーには追加のルートや設定がないため、ルーティングはプロバイダーによって行われていると思います

注:

フォローアップの質問があります

この設定でポート転送が機能しないのはなぜですか?

4
Mascarpone

まず、必ずしもすべてのポートを一度に転送する必要はありません。その場合、必ずしもホストにアクセスできるとは限らないためです。これは間違いなく手動プロセスでなければなりません。

DockerコンテナーでWebサービスが実行されていると思います。たとえば、ポート80をeth0.1 IPアドレスからDockerコンテナーのIPアドレスに転送する場合は、次のiptablesルールを使用できます。 ;

iptables -A PREROUTING -t nat -i eth0.1 -p tcp --dport 80 -j DNAT --to 172.17.0.11:80
iptables -A FORWARD -p tcp -d 172.17.0.11 --dport 80 -j ACCEPT

これらのルールは、必要に応じて他のポート/ドッカーコンテナー用に変更できます。

7
Chris Davidson

では、仮想インターフェースではなくIPエイリアスについて言及していることを理解したので、ここで別の答えを投げます。

最初に、すべてのポートを転送する必要がない場合は、1つだけを使用します(ポートを明らかにdockerfileに公開する必要があります)。

docker run -d -p 93.x.x.x:hostPort:containerPort registry/image

他のケースでは、このIPエイリアスを、コンテナーと他のネットワークとの通信以外の目的で使用しない場合は、私の控えめなプロジェクトを見ることができます: docker-flatip =そして、このIPを、コンテナーからフラットコンテナー専用の2番目のブリッジに接続された仮想イーサネットリンクに直接割り当てます。

ユースケースに少し注意しながら書きました。これはDockerコンテナーの境界であり、オーケストレーションとスケーラビリティーの目的で特定のIPアドレスをコンテナーにバインドしないようにするために、可能であれば解決策を見つけることは非常に良いことを覚えておいてください。

これの主なポイントは、iptablesルールの設定が簡単な、ネットワーク上の他のホストと同じようにコンテナーに到達できることです。私の場合、それぞれがパブリックIPを必要とし、自動検出できない特定のiptablesルールを使用して、商用ソリューションから一連の負荷生成エージェントを展開する必要がありました。コンテナーの実行後/停止前のラッパーとして機能するため、iptablesルールの追加/削除が容易になります。

この小さなツールを使用すると、このようにコンテナを起動することになります(もし本当に推奨されないまったく):

cid=$(docker run -d registry/image)

または

docker start $cid

次に:

docker-flatip add $cid 93.x.x.x/32 -i tcp:all,udp:all

そして、このようにそれを停止します:

docker-flatip del $cid

docker stop $cid
6
Xavier Lucas