DockerコンテナーからDockerホストへの接続


10

Webサイトのすべての部分をDockerコンテナーで実行する設定があります。ポート80および443でリッスンする私のnginxは、コンテナーで実行されます。

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

別のコンテナのサービスにプロキシを設定したい。このコンテナは、ホストのポート3000にバインドされています。

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

Dockerホストのiptablesは次のようになります。

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

コンテナー内から、iptables構成のため、ホストマシンのポート3000に接続できません。

パブリックインターネットにポート3000を開きたくありません。

ポート3000でコンテナーとホストの間に直接ブリッジを開く方法はありますか?

または、私は自分のiptablesを変更してdocker ip範囲から受け入れる必要がありますか?

回答:


5

必要なのはDockerのリンク機能だけです [非推奨]

やろうとした複雑なことをすべて取り除き、名前付きコンテナを使い始めて、それらを互いにリンクするだけです。


私はDockerリンク機能を調べましたが、正しく理解するといくつかの問題があります。1.子を再起動すると、新しいIPアドレスが取得されます。次に、その子のすべての親を再起動して、新しい環境変数を取得する必要があります。2.接続を確立するために、これらの環境変数を読み取るロジックをアプリケーションに追加する必要があります。
user3133475 2013

再起動されたコンテナ(docker restart your_container)は、そのIPアドレスを保持する必要があります。特定のイメージに基づいて新しいコンテナを実行した場合のみ、新しいIP(docker run -d image command)が取得されます。
エリアスプロブスト

2
以前は真実でしたが、少なくともdocker 1.0以降では、「docker restart」によってコンテナに新しいIPアドレスが付与されます。変更されないIPの以前の動作に依存するいくつかのスクリプトでこれを実行してください。
jamshid 14年

1
これはおそらくOPにとって正しいことだと思いますが、私はここに来て、質問に対する答えを探しました。つまり、ホスト上のサービスにリンクする方法。
mc0e 2014

2

エリアスの答えは正しいですが、リンクは長くて混乱しています。ここに簡単な要約があります:

まず、リンクするコンテナを実行して名前を付けます。

sudo docker run -d --name db training/postgres

次に、他のコンテナを実行して、最初のコンテナにリンクします。

sudo docker run -d -P --name web --link db:db training/webapp python app.py

最初のコンテナから2番目のコンテナへのリンクがに入れられ/etc/hostsます。したがって、ホスト名のように使用できます。例えば:

sudo docker run --name web --link db:db training/webapp ping db
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.