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';