1. ホーム

[解決済み】Dockerコンテナからホストポートにアクセスする方法

2022-03-23 22:10:04

質問

私はjenkinsを実行しているdockerコンテナを持っています。ビルドプロセスの一部として、ホストマシンでローカルに実行されているWebサーバーにアクセスする必要があります。ホストのウェブサーバー(ポートで実行するように設定可能)をjenkinsコンテナに公開する方法はありますか?

EDIT: 私はLinuxマシンでdockerをネイティブに動かしています。

UPDATE

下記の@larsksの回答に加え、ホストマシンからHost IPのIPアドレスを取得するために、私は以下のようにしています。

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

解決方法は?

Linux上でDockerをネイティブに動作させる場合、ホストサービスへは 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

を修正する必要があるかもしれません。 iptables を許可するために、ホスト上で Dockerコンテナからの接続。このようなもので対応できます。 を使用します。

# iptables -A INPUT -i docker0 -j ACCEPT

これは、Dockerからホスト上の任意のポートへのアクセスを許可するものです。 コンテナです。 そのことに注意してください。

  • iptables のルールは順序付けされており、このルールが実行されることも、されないこともあります。 は、その前に来る他のルールに依存して正しいことを行います。

  • のどちらかであるホストサービスにのみアクセスすることができます。 でリスンしている INADDR_ANY (aka 0.0.0.0)、または明示的に をリッスンしています。 docker0 インターフェイスを使用します。


でDockerを使用している場合 MacOS または ウィンドウズ 18.03+ では、マジックホストネームの host.docker.internal .


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