在Docker容器之间获取HTTP端点时,为什么networking别名可以工作,但Docker Compose服务名称失败?

我有两个基于gists/pure-ftpd Docker容器,而这个容器又是基于Alpine的。 它们由Docker Compose启动,并放置在相同的自定义networking上,以便他们可以看到对方。

当我做docker-compose up (用适当的参数,在这里不需要列出),它会调出所有的容器,提供HTTP端点的盒子会得到两个DNS条目:

  • 从服务名称派生的标准Composenetworking名称; 服务名称是integration_missive-testbox_1 ,而项目名称是integration ,所以容器变成了integration_missive-testbox_1
  • 指定了一个附加的missive-testbox别名

奇怪的是,如果我在其他容器上做了一个wget ,我会得到不同的结果。 一个是成功的(发现端点200个,未find端点404个),另一个失败(400个)。

这是一个来自调用容器( missive-transmitter )的插图,它们都可以访问并指向相同的本地networking地址:

 ~ # ping integration_missive-testbox_1 PING integration_missive-testbox_1 (172.27.0.4): 56 data bytes 64 bytes from 172.27.0.4: seq=0 ttl=64 time=0.351 ms ^C --- integration_missive-testbox_1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.351/0.351/0.351 ms ~ # ping missive-testbox PING missive-testbox (172.27.0.4): 56 data bytes 64 bytes from 172.27.0.4: seq=0 ttl=64 time=0.718 ms 

让我显示我用来调出这些容器docker-compose.yml文件。 实际上有12个容器,但我只会展示这两个容器。 我正在使用YAML的覆盖function,所以我有三个文件,每个覆盖上面的文件中的设置(这使我可以创build最小的复制和粘贴不同的环境)。

顶层:

 version: '2' services: missive-transmitter: image: missive-transmitter volumes: - ${QUEUE_LOCAL_PATH}:${TRANSMITTER_CONTAINER_ROOT}/queue - ${LOGS_LOCAL_PATH}:/var/log/missive volumes_from: - missive-investigator:ro networks: - main_network - mail_network networks: storage_network: driver: bridge main_network: driver: bridge traffic_network: driver: bridge mail_network: driver: bridge 

第二层:

 version: '2' services: missive-testbox: image: missive-testbox networks: main_network: aliases: - missive-testbox mail_network: 

第三层:

 version: '2' services: missive-transmitter: volumes: - ${TRANSMITTER_LOCAL_ROOT}/src:${TRANSMITTER_CONTAINER_ROOT}/src # Docker host access to the web port of the test box missive-testbox: ports: - "9000:80" 

所以,我不认为我在这里做了太多不寻常的事情。 这是困难(首先失败,成功第二):

 ~ # wget http://integration_missive-testbox_1/ Connecting to integration_missive-testbox_1 (172.27.0.4:80) wget: server returned error: HTTP/1.1 400 Bad Request ~ # wget http://missive-testbox/ Connecting to missive-testbox (172.27.0.4:80) index.html 100% |*********************************************************************************************************************************************************************************************| 341 0:00:00 ETA 

事实并非如此:在任何集成testing中,我都会记得使用“正确的”。 但是,鉴于我需要学习Docker和Linuxnetworking的细节,我想知道是怎么回事,我可以做些什么来debugging。

我的第一个想法是,端点需要一个用户代理标题string,但将其添加到wget没有帮助(可能它会影响这两个地址无论如何,显然不是这种情况)。

更新

HTTP端点由Apache提供动力,如果我使用访问日志,我确实在使用“bad”域时看到了400 HTTP响应:

 172.27.0.5 - - [23/Nov/2017:18:59:54 +0000] "GET / HTTP/1.1" 400 421 "-" "Wget"