Linker docker链接容器所有端口关闭

Linker docker链接容器所有端口关闭,linker,docker,containers,derby,Linker,Docker,Containers,Derby,我尝试从一个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 R

我尝试从一个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"]
docker run -it --name derby <image>
集装箱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
docker run -it --link derby:derby <image> /bin/bash
我启动两个容器并给它们命名 容器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"]
docker run -it --name derby <image>
这是成功的。但是当我试图通过cli工具连接到derby数据库并给出一个JDBCURL时

connect 'jdbc:derby://172.17.0.2:3301/testdb;create=true';
我收到一个连接被拒绝的错误

使用nmap扫描容器A的端口会导致“所有端口均已关闭” 这让人困惑,因为Docker引用的声明:

那么链接容器实际上是做什么的呢?你已经学会了 链接允许源容器向用户提供有关其自身的信息 收件人容器。在我们的示例中,收件人web可以访问 有关源数据库的信息。为此,Docker创建一个安全的 不需要暴露任何端口的容器之间的隧道 在容器外部;你会注意到我们什么时候启动数据库的 我们没有使用-P或-P标志。这是一个大问题 链接的好处:在这里,我们不需要公开源容器 将PostgreSQL数据库连接到网络

有人能给我一个提示或解决办法吗


关于

端口未打开,因为您没有告诉docker打开它

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

--link
也不会打开端口,这是link的优点,您可以安全地连接两个容器,而无需向主机公开任何端口

因此,要使用命令行工具连接到derby BD,您有两个选项

1) 打开端口-(可能存在安全隐患?)

运行容器时,指定要打开的端口

docker run -it --name derby -p 3301:3301 <image>
然后直接在derby容器上有一个bash会话,并可以在其上运行命令

更新

要通过链接从一个容器连接到另一个容器,可以使用docker在容器上公开的关于链接的环境变量

因此,在容器B上,您将拥有包含链接名
DERBY
的环境变量

因此,
DERBY_PORT
将是连接到DERBY容器的IP和端口

但是,如果重新启动“derby”容器,ENV var中的IP将过期。因此,最好通过它的链接名连接到它

Docker还设置了链接的主机名,因此您可以使用

http://derby: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
docker run -it --link derby:derby <image> /bin/bash
所以你可以试试

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

好吧,我解决了。对于所有其他可能感兴趣的人,您需要使用命令启动Derby

startNetworkServer -h 0.0.0.0
通过这种方式,您可以告诉Derby接受来自外部的所有连接,如果需要,可以对其进行限制,但参数必须存在,否则连接将被拒绝


关于

好的,我尝试了选项1,但结果相同。在容器B内部,我无法连接到容器A。nmap输出:derby(172.17.0.2)主机的nmap扫描报告已启动(0.000077s延迟)。端口状态服务3301/tcp关闭未知MAC地址:02:42:AC:11:00:02(未知)选项2我不太清楚,我不会从主机执行docker吗?啊!抱歉,我没有理解,我不知道您正在另一个容器中运行该命令。当docker创建一个链接时,它还会在容器上公开一组关于该链接的环境变量。使用这些工具,您可以锁定链接的机器。。。因此,在您试图从中运行命令的容器中,将有一个名为
DERBY_PORT
的环境变量,其中将包含一个主机IP和DERBY链接的端口。不过,如果重新启动DERBY主机,则另一个容器中的链接IP不会更新。如果这是一个问题,您可以通过其
名称连接到它。我会更新答案……是的,我知道变量,但它不起作用的设置如下:DERBY_ENV_CA_CERTIFICATES_JAVA_VERSION=20140324 DERBY_ENV_JAVA_DEBIAN_VERSION=8u66-b17-1~bpo8+1 DERBY_ENV_JAVA_VERSION=8u66 DERBY_ENV_LANG=C.UTF-8 DERBY_NAME=/claas_overview/DERBY DERBY DERBY_端口=tcp://172.17.0.2:3301 DERBY_端口_3301_TCP=tcp://172.17.0.2:3301 DERBY_端口_3301_TCP_地址=172.17.0.2DERBY_PORT_3301_TCP_PORT=3301 DERBY_PORT_3301_TCP_PROTO=TCP,但我仍然无法连接到DERBY容器