从外部连接到在docker容器内运行的服务

时间:2016-01-26 15:43:33

标签: docker boot2docker

我有一个在docker容器(本地机器)中运行的服务。我可以在Ambari服务配置中看到服务URL。

现在我想使用我的本地开发环境连接到该服务。

我发现我可以连接到容器内的那个,但是当我在本地使用该URL时,我的连接被拒绝了。

def check(data) #Check if all sub lists are same length
    for i in data:
        if len(i) != len(data[0]):
            return False
    return True

if check(data_small):
    print list(combinations(chain(*data_small), 3))

[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'b', 'f'),
 ('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'c', 'f'), ('a', 'd', 'e'),
 ('a', 'd', 'f'), ('a', 'e', 'f'), ('b', 'c', 'd'), ('b', 'c', 'e'), 
 ('b', 'c', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('b', 'e', 'f'),
 ('c', 'd', 'e'), ('c', 'd', 'f'), ('c', 'e', 'f'), ('d', 'e', 'f')]

如何从外部连接到容器内运行的服务?
在我的情况下,代码在我的本地机器上执行。

2 个答案:

答案 0 :(得分:1)

如果您的容器已在VM 12008端口上映射其端口,则需要确保在VirtualBox连接设置中将端口转发12008,正如我在" How to connect mysql workbench to running mysql inside docker?"中提到的那样。

VBoxManage controlvm "boot2docker-vm" --natpf1 "tcp-port12008 ,tcp,,12008,,12008"
VBoxManage controlvm "boot2docker-vm" --natpf1 "udp-port12008 ,udp,,12008,,12008"

答案 1 :(得分:0)

这个问题需要更多澄清,但我会回答一些假设。

我使用了Ambari docker image(根据受欢迎程度随机选择)。 然后我按照提到的方式启动了3个群集,我的amb-settingsdocker ps看起来像这样:

anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ amb-settings 
  NODE_PREFIX=amb
  CLUSTER_SIZE=3
  AMBARI_SERVER_NAME=amb-server
  AMBARI_SERVER_IMAGE=hortonworks/ambari-server:latest
  AMBARI_AGENT_IMAGE=hortonworks/ambari-agent:latest
  DOCKER_OPTS=
  AMBARI_SERVER_IP=172.17.0.6
  CONSUL=amb-consul
  CONSUL_IMAGE=sequenceiq/consul:v0.5.0-v6
  EXPOSE_DNS=false
  DRY_RUN=false
anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
d2483a74d919        hortonworks/ambari-agent:latest    "/usr/sbin/init syste"   20 minutes ago      Up 20 minutes                                                                          amb2
4acaec766eaa        hortonworks/ambari-agent:latest    "/usr/sbin/init syste"   21 minutes ago      Up 20 minutes                                                                          amb1
47e9419de59f        hortonworks/ambari-server:latest   "/usr/sbin/init syste"   21 minutes ago      Up 21 minutes       8080/tcp                                                           amb-server
548730bb1824        sequenceiq/consul:v0.5.0-v6        "/bin/start -server -"   22 minutes ago      Up 22 minutes       53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 8500/tcp   amb-consul
27c725af6531        sequenceiq/ambari                  "/usr/sbin/init"         23 minutes ago      Up 23 minutes       8080/tcp                                                           awesome_tesla
anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ 

截至目前,我可以通过以下方式访问Ambari服务器:http://172.17.0.6:8080/

这也适用于我的主机。但是,如果您希望从类似网络中的另一台计算机连接它,那么一个选项是使用haproxy从以下位置进行重定向: localhost:8080 - > 172.17.0.6:8080

所以,我创建了一个小的haproxy.cfgDockerfile来实现这个目标:

anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ cat Dockerfile 
FROM haproxy:1.6

COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ cat haproxy.cfg 
frontend localnodes
    bind *:8080
    mode http
    default_backend ambari

backend ambari
    mode http
    server ambari-server 172.17.0.6:8080 check


anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ docker build --rm -t ambariproxy .
Sending build context to Docker daemon 9.635 MB
Step 1 : FROM haproxy:1.6
 ---> af749d0291b2
Step 2 : COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> Using cache
 ---> 60cdd2c7bb05
Successfully built 60cdd2c7bb05
anovil@anovil-Latitude-E6440:~/tmp/docker-ambari$ docker run -d  -p 8080:8080 ambariproxy
63dd026349bbb6752dbd898e1ae70e48a8785e792b35040e0d0473acb00c2834

现在,如果我说localhost:8080MY_HOST_IP:8080,我可以看到ambari-server,这也可以来自同一网络中的计算机。

希望我设法回答你的问题:)

谢谢,