2013-07-21 16 views
92

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 

[email protected] ~ % docker run -i -t base /bin/bash 
[email protected]:/# apt-get install nmap 
[email protected]:/# 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 

私はコンテナをwithing任意のインターネット接続を取得するには、このトリックを行う必要がありました:My firewall is blocking network connections from the docker container to outside

EDIT:結局私はpipeworkを使用してカスタムブリッジの作成を行ってきましたがサービスがブリッジIP上でリッスンするようにします。このアプローチでは、MongoDBとRabbitMQをドッカーブリッジでリッスンさせるのではなく、柔軟性が高いので、

答えて

35

それが正常に動作しなければならないということです。あなたは最近のUbuntuの上にあると仮定すると、あなたはこれがあなたにネットワークアダプタのリストが表示されます

ip addr 

を実行することができ、のいずれかが

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 

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

+22

コンテナは要求をどのIPに送信するのかをどのように知っていますか?私は値をハードコーディングすることができます(172.17.42.1ここと私のテストリグですが、それはいつも本当ですか?)、それはどんなホストと一緒に働くドッカーの原則に反しているようです! –

+0

別のオプションは、ホストマシンサービス(たとえばmongodb)をバインドしてすべてのネットワークインターフェイス(0.0.0.0など)をリッスンし、内部ネットワーク上のマシンだけが関連するポートに接続してからホストに接続できるようにファイアウォールを設定することですコンテナ内のマシンのネットワークIPアドレス。 – Josh

+1

@Seldo:表示するには設定が必要ですか?私はドッカー1.7.1を使用しています。私は 'lo'と' eth0'しか持っていません。 – mknecht

4

MongoDBとRabbitMQがホスト上で実行されている場合、ポートはDocker内にないため、既に公開されているはずです。

コンテナからホストにポートを公開するために '-p'オプションは必要ありません。デフォルトでは、すべてのポートが公開されています。 '-p'オプションを使用すると、コンテナからホストの外部にポートを公開することができます。

だから、私の推測では、あなたがすべてでは「-p」必要はありませんし、お使いのドッキングウィンドウのホストは、すべてのコンテナにアダプタを公開:)

+0

Insideは、私がいることを知っていたが、私が情報のビットを欠けているようだ:参照します私はホスト上のポートに到達することができないので、最近の編集。 – JoelKuiper

+1

rabbitmqとmongodbを設定する必要があります。これは、メインネットワークインターフェイスだけでなく、ブリッジでも聴くことができます。 – creack

+7

@creack rabbitmqさんとmongodbさんはどうやって橋の上で聴くのですか? –

66

--net=hostオプションをdocker runに使用することは、単純ではありますが比較的安全性の低い方法です。

このオプションは、コンテナがホストのネットワークスタックを使用するようにします。次に、ホスト名として "localhost"を使用するだけで、ホスト上で実行されているサービスに接続できます。

これは、ドッキング・コンテナのIPアドレスからの接続を受け入れるようにサービスを構成する必要がなく、ドッキング・コンテナに特定のIPアドレスまたはホスト名を通知する必要がないため、構成が簡単です。ポートに接続してください。

docker run --rm -i -t --net=host my_image telnet localhost 25 

はたとえば、あなたのイメージがtelnetユーティリティが含まれており、接続したいサービスがポート25であり、my_imageと呼ばれる自分のイメージを前提とし、以下のコマンドを実行することによってそれをテストすることができます

あなたはこのようにそれを行うことを検討する場合は、このページにセキュリティに関する注意を参照してください。

https://docs.docker.com/articles/networking/

それは言う:

--net = host - 別のネットワークスタック内にコンテナを置くことをスキップするようにDockerに指示します。本質的に、この選択はDockerにコンテナのネットワークをコンテナ化しないように指示します。コンテナプロセスは依然として独自のファイルシステムとプロセスリストとリソース制限に限定されていますが、quick ip addrコマンドはネットワーク上でDockerホストの「外」に住み、ネットワークインターフェイスに完全にアクセスできることを示します。これはコンテナがホストネットワークスタックを再構成するのを許さないことに注意してください - それは--privileged = trueを必要としますが、コンテナプロセスが他のルートプロセスのように低い番号のポートを開くことを可能にします。また、コンテナはDバスのようなローカルネットワークサービスにアクセスすることができます。これにより、コンテナ内のプロセスがコンピュータの再起動などの予期せぬ事態を引き起こす可能性があります。このオプションは慎重に使用してください。

+7

Linux上でドッカーを使用していない人(例:いくつかの仮想化を使用している人)の場合、ホストは実際のホストOSではなく、含まれているVMであるため動作しません。 –

+3

特に、MacOSでは**回避策はありません** https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-コンテナからホストへのサービス – pje

4

また、sshトンネルを作成することもできます。

docker-compose.yml

--- 

version: '2' 

services: 
    kibana: 
    image: "kibana:4.5.1" 
    links: 
     - elasticsearch 
    volumes: 
     - ./config/kibana:/opt/kibana/config:ro 

    elasticsearch: 
    build: 
     context: . 
     dockerfile: ./docker/Dockerfile.tunnel 
    entrypoint: ssh 
    command: "-N elasticsearch -L 0.0.0.0:9200:localhost:9200" 

docker/Dockerfile.tunnel

FROM buildpack-deps:jessie 

RUN apt-get update && \ 
    DEBIAN_FRONTEND=noninteractive \ 
    apt-get -y install ssh && \ 
    apt-get clean && \ 
    rm -rf /var/lib/apt/lists/* 

COPY ./config/ssh/id_rsa /root/.ssh/id_rsa 
COPY ./config/ssh/config /root/.ssh/config 
COPY ./config/ssh/known_hosts /root/.ssh/known_hosts 
RUN chmod 600 /root/.ssh/id_rsa && \ 
    chmod 600 /root/.ssh/config && \ 
    chown $USER:$USER -R /root/.ssh 

config/ssh/config

# Elasticsearch Server 
Host elasticsearch 
    HostName jump.host.czerasz.com 
    User czerasz 
    ForwardAgent yes 
    IdentityFile ~/.ssh/id_rsa 

elasticsearchは、実行中のサービス(Elasticsearch、MongoDBは、使用してサーバーへのトンネルを有し、この方法PostgreSQL)を開き、poを公開しますrt 9200とそのサービス。

+0

基本的にDockerイメージに秘密鍵を入れています。秘密は決してドッカーのイメージに入るべきではありません。 –

1

ドッカーコンテナからLDAP-Serverにアクセスするのと同様の問題がありました。 コンテナの固定IPを設定し、ファイアウォールルールを追加しました。

docker-compose.yml:

version: '2' 
services: 
    containerName: 
    image: dockerImageName:latest 
    extra_hosts: 
     - "dockerhost:192.168.50.1" 
    networks: 
     my_net: 
     ipv4_address: 192.168.50.2 
networks: 
    my_net: 
    ipam: 
     config: 
     - subnet: 192.168.50.0/24 

iptablesのルール:

iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost

コンテナアクセスdockerhost:portnumberOnHost

関連する問題