docker连接的集装箱所有港口closures

我尝试从一个docker集装箱连接到另一个。

  • 容器A安装并启动了Derby DB,在端口3301上侦听
  • 集装箱B应连接到集装箱A

docker文件看起来像:容器A.

FROM java:8 # Install Derby COPY db-derby-10.12.1.1-bin.tar.gz db-derby-10.12.1.1-bin.tar.gz RUN mkdir /opt/Apache RUN cp db-derby-10.12.1.1-bin.tar.gz /opt/Apache RUN tar xzvf /opt/Apache/db-derby-10.12.1.1-bin.tar.gz EXPOSE 3301 CMD ["/db-derby-10.12.1.1-bin/bin/startNetworkServer", "-p 3301"] 

容器B

 FROM java:8 # Install nmap RUN apt-get update RUN apt-get install -y nmap COPY db-derby-10.12.1.1-bin.tar.gz db-derby-10.12.1.1-bin.tar.gz RUN mkdir /opt/Apache RUN cp db-derby-10.12.1.1-bin.tar.gz /opt/Apache RUN tar xzvf /opt/Apache/db-derby-10.12.1.1-bin.tar.gz EXPOSE 9080 

我开始这两个容器,并给他们的名字容器A

 docker run -it --name derby <image> 

容器B

 docker run -it --link derby:derby <image> /bin/bash 

然后我附上容器B和

 ping derby or ping 172.17.0.2 

这是成功的。 但是当我尝试通过cli工具连接到德比数据库并给出一个类似jdbc的url

 connect 'jdbc:derby://172.17.0.2:3301/testdb;create=true'; 

我得到一个连接拒绝错误。

使用nmap来扫描容器A的端口会导致“所有端口都closures”,这是令人困惑的,因为Docker引用声明:

那么连接容器究竟做了什么? 您已经了解到,链接允许源容器向收件人容器提供有关其自身的信息。 在我们的例子中,收件人web可以访问关于源数据库的信息。 为此, Docker在容器之间创build一个安全隧道,不需要在容器外部公开任何端口 ; 你会注意到当我们启动db容器时,我们没有使用-P或-p标志。 这是链接的一大好处:我们不需要将源容器(这里是PostgreSQL数据库)暴露给networking。

有没有人可能为我提示或解决scheme?

问候

好吧,我解决了。 对于其他所有可能被推荐的人,你需要用命令启动德比

 startNetworkServer -h 0.0.0.0 

这样你告诉德比接受来自外部的所有连接,如果你需要限制它,但参数必须存在,否则连接被拒绝。

问候

港口没有开放,因为你没有告诉docker打开它。

EXPOSE中EXPOSE指示docker容器监听指定的端口,但是它不会打开该端口或将其公开给主机。

--link也不打开端口,这是链接的好处,你可以安全地连接2个容器,而不必将任何端口暴露给主机。

所以,要用你的命令行工具连接到德比BD,你有两个select。

1)打开端口 – (可能的安全隐患?)

当你运行容器时,你需要指定要打开的端口。

 docker run -it --name derby -p 3301:3301 <image> 

以上将把容器上的3301端口映射到主机上的3301端口。

然后您可以使用主机IP和端口3301连接到该容器。

2)直接连接到容器

你可以有效地ssh进入容器并在容器本身上运行命令…

 $ sudo docker exec -it derby bash 

然后你直接在derby容器上进行bash会话,并且可以在其上运行命令。

UPDATE

要通过链接从一个容器连接到另一个容器,可以使用Docker在容器上公开链接的ENVvariables。 http://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#environment-variables

因此,在容器B上,您将会看到包含链接名称DERBY ENVvariables。

所以, DERBY_PORT将是一个IP和端口连接到德比容器。

但是,如果“derby”容器重新启动,则ENVvariables中的IP将过期。 所以最好通过链接名称来连接它。

Docker也设置了关于链接的主机名,所以你可以通过连接到derby容器

 http://derby:3301 

从容器B内

所以你可以试试..

 connect 'jdbc:derby://derby:3301/testdb;create=true';