551

ジェンキンスを実行しているドッカー コンテナーがあります。ビルド プロセスの一環として、ホスト マシンでローカルに実行されている Web サーバーにアクセスする必要があります。ホスト Web サーバー (ポートで実行するように構成できる) を jenkins コンテナーに公開する方法はありますか?

編集: Linux マシンで docker をネイティブに実行しています。

アップデート:

以下の@larsksの回答に加えて、ホストマシンからホストIPのIPアドレスを取得するには、次のことを行います。

ip addr show docker0 | grep -Po 'inet \K[\d.]+'
4

18 に答える 18

344

Linux で Docker をネイティブに実行する場合、インターフェイスの IP アドレスを使用してホスト サービスにアクセスできdocker0ます。コンテナー内からは、これがデフォルト ルートになります。

たとえば、私のシステムでは:

$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

そしてコンテナ内:

# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.4 

シンプルなシェル スクリプトを使用して、この IP アドレスを簡単に抽出できます。

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip

iptablesDocker コンテナからの接続を許可するには、ホストのルールを変更する必要がある場合があります。このような何かがトリックを行います:

# iptables -A INPUT -i docker0 -j ACCEPT

これにより、Docker コンテナーからホスト上の任意のポートへのアクセスが許可されます。ご了承ください:

  • iptables ルールは順序付けられており、このルールは、その前にある他のルールに応じて、正しいことを行う場合としない場合があります。

  • INADDR_ANY(a) (別名 0.0.0.0) でリッスンしているか、インターフェイスで明示的にリッスンしているホスト サービスにのみアクセスできdocker0ます。


MacOSまたはWindows 18.03 以降でDocker を使用している場合は、マジック ホスト名 に接続できますhost.docker.internal


--net=host最後に、Linux では;を設定することで、ホスト ネットワークの名前空間でコンテナーを実行できます。この場合localhost、ホスト上はコンテナ内と同じlocalhostであるため、コンテナ化されたサービスはコンテナ化されていないサービスのように機能し、追加の構成なしでアクセスできます。

于 2015-07-09T20:54:28.943 に答える
0

ほぼ 7 年間、Docker が変更されたか、誰もこの方法を試していないかという質問がありました。だから私は私自身の答えを含めます。

すべての回答が複雑な方法を使用していることがわかりました。今日、私はこれを必要としており、2 つの非常に簡単な方法を見つけました。

  • ipconfigホストでまたはを使用ifconfigし、すべての IP アドレスを書き留めます。それらのうち少なくとも 2 つをコンテナーで使用できます。

    • WiFi LAN アダプターに固定ローカル ネットワーク アドレスがあります: 192.168.1.101。これは可能性があります10.0.1.101。結果はルーターによって異なります
    • 私は Windows で WSL を使用しており、独自のvEthernetアドレスがあります。172.19.192.1
  • 使用してhost.docker.internalください。ほとんどの回答には、OS に応じて、この形式または別の形式があります。その名前は、現在 docker によってグローバルに使用されていることを示しています。

3 番目のオプションは、マシンの WAN アドレス、つまりサービス プロバイダーから提供された IP を使用することです。ただし、IP が静的でなく、ルーティングとファイアウォールの設定が必要な場合、これは機能しない可能性があります。


PS:この質問 hereとかなり同じですが、この回答をそこに投稿しましたが、最初にこの投稿を見つけたので、自分の回答を忘れる可能性があるため、ここにも投稿します。

于 2022-01-26T21:23:56.237 に答える