1. ホーム
  2. linux

[解決済み】Dockerコンテナにホストポートを転送する

2022-04-11 02:16:18

質問

Dockerコンテナから、ホストが開放しているポートにアクセスさせることは可能でしょうか?具体的には、ホスト上でMongoDBとRabbitMQが動作しており、Dockerコンテナ内でプロセスを実行してキューをリッスンし、(オプションで)データベースに書き込むようにしたいのです。

コンテナからホストにポートを転送して(-pオプションで)、Dockerコンテナ内から外部(つまりインターネット)に接続できることは知っていますが、ホストからのRabbitMQとMongoDBのポートを外部に公開しないようにしたいのです。

EDIT: いくつかの明確化。

Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT     STATE SERVICE
6311/tcp open  unknown

joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway

Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT     STATE    SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds

コンテナ内でインターネットに接続するためには、このような仕掛けをしなければなりませんでした。 ファイアウォールが、Dockerコンテナから外部へのネットワーク接続をブロックしています。

EDIT : 最終的に、私は、以下の方法でカスタムブリッジを作成しました。 パイプワーク で、そのブリッジのIPでサービスをリッスンするようにしました。MongoDBとRabbitMQをDockerブリッジでリッスンさせるのではなく、この方法を採用したのは、その方がより柔軟性が高いからです。

解決方法は?

ドッカーホストはすべてのコンテナに対してアダプタを公開します。最近のubuntuを使用していると仮定すると、以下のように実行できます。

ip addr

これにより、ネットワーク・アダプタのリストが得られ、そのうちの1つは次のようなものになります。

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::a402:65ff:fe86:bba6/64 scope link
   valid_lft forever preferred_lft forever

rabbit/mongoにそのIP(172.17.42.1)にバインドするように指示する必要があります。その後、コンテナ内から172.17.42.1への接続を開くことができるようになるはずです。