我有一个设置,将网站的所有部分都运行在 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 范围的请求?
答案1
你所需要的只是 Docker 的链接能力[已弃用]
只需摆脱您尝试做的所有复杂的事情,开始使用命名容器,然后将它们相互链接。
答案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