Docker Compose:暴露未生效

3

docker-ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
83b1503d2e7c        app_nginx      "nginx -g 'daemon ..."   2 hours ago         Up 2 hours                  0.0.0.0:80->80/tcp   app_nginx_1
c9dd2231e554        app_web        "/home/start.sh"         2 hours ago         Up 2 hours                  8000/tcp             app_web_1
baad0fb1fabf        app_gremlin    "/start.sh"              2 hours ago         Up 2 hours                  8182/tcp             app_gremlin_1
b663a5f026bc        postgres:9.5.1 "docker-entrypoint..."   25 hours ago        Up 2 hours                  5432/tcp             app_db_1

它们都正常工作:

  • app_nginx与app_web连接良好
  • app_web与postgres连接良好

没有可用的文件:

  • app_web无法连接到app_gremlin

docker-compose.yaml

version: '3'
services:
  db:
    image: postgres:9.5.12
  web:
    build: .
    expose:
      - "8000"
    depends_on:
      - gremlin
    command: /home/start.sh
  nginx:
    build: ./nginx
    links:
        - web
    ports:
        - "80:80"
    command: nginx -g 'daemon off;'
  gremlin:
    build: ./gremlin
    expose:
      - "8182"
    command: /start.sh

错误:

基本上我无法从我的app_web容器连接到gremlin容器。

以下所有操作都在web_app容器内执行

curl:

root@49a8f08a7b82:/# curl 0.0.0.0:8182
curl: (7) Failed to connect to 0.0.0.0 port 8182: Connection refused

netstat

root@49a8f08a7b82:/# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.11:42681        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN     
udp        0      0 127.0.0.11:54232        0.0.0.0:*                          
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path

nmap

root@49a8f08a7b82:/# nmap -p 8182 0.0.0.0

Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-22 09:28 UTC
Nmap scan report for 0.0.0.0
Host is up.

PORT     STATE    SERVICE
8182/tcp filtered vmware-fdm

Nmap done: 1 IP address (1 host up) scanned in 2.19 seconds

nslookup

root@88626de0c056:/# nslookup app_gremlin_1 服务器: 127.0.0.11 地址: 127.0.0.11#53

非权威答案: 名称: app_gremlin_1 地址: 172.19.0.3


实验中:

对于我所做的Gremlin容器,

ports:
      - "8182:8182"

然后从主机连接到gremlin容器,但是webgremlin容器之间仍然没有连接。


我正在创建一个重新创建示例Docker文件(最小化的内容以重新创建问题),同时有人知道问题可能是什么吗?

你将需要添加更多关于这个问题的信息:“app_web无法连接到app_gremlin”。你是如何测试连接的?你收到了什么错误信息? - undefined
我会添加更多内容,基本上我无法连接到8182端口。 - undefined
2个回答

8
curl 0.0.0.0:8182

0.0.0.0地址是一个通配符,告诉应用程序在所有网络接口上监听,您不需要作为客户端连接到此接口。对于容器之间的通信,您需要:

  • 处于同一用户生成的网络上的容器(compose默认情况下会为您执行此操作)
  • 连接到服务名称(或容器名称)
  • 连接到另一个容器内部的端口,而不是发布的端口。

在您的情况下,命令应该是:

curl http://gremlin:8182

在容器内运行的应用程序中,网络命名空间是隔离的,因此每个容器都会在桥接网络上获得其开放回环接口和IP地址。因此,将应用程序移入容器中意味着您需要在0.0.0.0上进行监听,并使用DNS连接到桥接IP。
您还应该从Dockerfile中删除链接和depends_on,因为它们不适用于版本3。链接早已被弃用,而共享网络则更受青睐。在Swarm模式下,depends_on不起作用,而且很可能并不符合您的要求,因为它只检查容器的启动,而不是目标应用程序是否正在运行。
最后一个注意事项是,暴露并不影响在公共网络上的容器之间进行通信或在主机上发布端口的能力。暴露仅在镜像上设置元数据,以供创建镜像的人和运行镜像的人之间进行文档化。应用程序不要求使用该值,但是使您的应用程序默认为该值是一个好习惯,以使下游用户受益。由于其作用,除非您有另一个应用程序检查了暴露的端口列表,比如自更新的反向代理,否则没有必要在compose文件中暴露端口,除非您将compose文件提供给其他人并且他们需要文档。

1
谢谢尝试……我的curl刚刚卡住了,而nslookup正常工作。正在尝试解决。 - undefined
1
谢谢。明白了问题所在。必须使用容器名称。 - undefined

5
在docker-compose.yaml文件中,web和gremlin之间没有配置链接。请尝试使用以下内容:
version: '3'
services:
  db:
    image: postgres:9.5.12
  web:
    links:
      - gremlin
    build: .
    expose:
      - "8000"
    depends_on:
      - gremlin
    command: /home/start.sh
  nginx:
    build: ./nginx
    links:
        - web
    ports:
        - "80:80"
    command: nginx -g 'daemon off;'
  gremlin:
    build: ./gremlin
    expose:
      - "8182"
    command: /start.sh

1
之前尝试过链接,但没有同时尝试链接和依赖项,我会试一下。 - undefined
1
尝试添加链接,但没有成功。在我的问题中添加了nmap、netstat等内容。 - undefined
1
你能在Web容器中运行nslookup gremlin吗? - undefined
2
我在我的问题中添加了完整的nslookup。总结为“服务器:127.0.0.11 地址:127.0.0.11#53”。 - undefined
2
好的,只需使用地址 app_gremlin_1:8182 连接到 Gremlin。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接