代码之家  ›  专栏  ›  技术社区  ›  Srinath Ganesh

docker compose:公开不工作

  •  1
  • Srinath Ganesh  · 技术社区  · 8 年前

    码头工人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
    

    错误:

    基本上我无法连接到 gremlin 我的集装箱 app_web 容器。

    下面这些都是在里面被执行的 web_app 容器

    卷曲 :

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

    网通

    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
    

    扫描器

    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
    

    NSLoopUp

    根目录@88626de0c056:/nslookup app_gremlin_1 服务器:127.0.0.11 地址:127.0.0.11 53

    非权威回答: 姓名:app_gremlin_1 地址:172.19.0.3


    做实验:

    对于我做的小精灵容器,

    ports:
          - "8182:8182"
    

    然后从 Host 我可以连接到 格雷姆林 容器 但是 仍然没有联系 web 格雷姆林 容器


    我正在努力创建一个重新创建的示例Docker文件(最小的东西来重新创建这个问题),同时有人知道这个问题是什么吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   BMitch    8 年前
    curl 0.0.0.0:8182
    

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

    • 同一个用户生成的网络上的容器(默认情况下为您编写)
    • 连接到服务的名称(或容器名称)
    • 连接到另一个容器中的端口,而不是已发布的端口。

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

    curl http://gremlin:8182
    

    在容器内运行的应用程序中,网络是有名称空间的,因此每个容器都会获得开放的环回接口和网桥网络上的IP地址。因此,将应用程序移动到容器中意味着您需要监听0.0.0.0并使用DNS连接到网桥IP。

    您还应该从Dockerfile中删除链接和依赖项,它们不适用于版本3。长期以来,人们一直反对使用链接来支持共享网络。而且depends_on在swarm模式下不起作用,可能也不会做你想做的事情,因为它从未检查过目标应用程序是否在运行,只是启动了该容器。

    最后一点要注意的是,expose不会影响在公共网络上的容器或主机上的发布端口之间进行通信的能力。简单地在图像上设置元数据,这是创建图像的人和运行图像的人之间的文档。应用程序不需要使用该值,但为了下游用户的利益,将应用程序默认为该值是一个好习惯。因为它的作用,除非你有另一个应用程序检查暴露的端口列表,就像一个自更新的反向代理,没有必要在组成文件中公开端口,除非你把组成文件交给另一个人,他们需要文档。

        2
  •  3
  •   Ignacio Millán    8 年前

    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
    
    推荐文章