从Docker容器连接到Docker主机


10

我有一个设置,可以在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范围?

Answers:


5

您需要的只是Docker的链接功能 [不建议使用]

只需摆脱您尝试执行的所有复杂操作,并开始使用命名容器,然后将它们彼此链接。


我看了看docker链接功能,但是如果我理解正确的话,就会遇到一些问题。1.如果孩子重新启动,它将获得一个新的IP地址。然后,还必须重新启动该孩子的所有父母,以获取新的环境变量。2.我必须在我的应用程序中添加逻辑以读取那些环境变量以建立连接。
user3133475

重新启动的容器(docker restart your_container)应该保留其IP地址。仅当您基于给定的图像运行一个新的容器时,它才会获得一个新的IP(docker run -d image command)。
伊利亚斯·普罗布斯特

2
过去确实如此,但是至少从docker 1.0开始,“ docker restart”为容器提供了一个新的IP地址。只需在一些依赖ip先前行为的脚本中更改此脚本即可。
jamshid

1
虽然我认为这可能是OP的正确选择,但我还是来这里寻找问题的答案。即如何链接到主机上的服务。
mc0e 2014年

2

Elias的回答是正确的,但是链接很长且令人困惑。这是一个简单的摘要:

首先,运行要链接的容器,并将其命名为:

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

然后运行另一个容器,将其链接到第一个容器:

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

从第一个容器到第二个容器的链接被放入/etc/hosts。因此,您可以像主机名一样使用它。例如:

sudo docker run --name web --link db:db training/webapp ping db
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.