代码之家  ›  专栏  ›  技术社区  ›  usr-local-ΕΨΗΕΛΩΝ

没有端口,没有与Docker compose堆栈的连接

  •  0
  • usr-local-ΕΨΗΕΛΩΝ  · 技术社区  · 4 年前

    我是Docker compose的新手,我正在努力运行我的Tomcat+Postgres堆栈。

    我已经“成功地”启动了这个堆栈,这意味着我的javaweb应用程序成功地连接到Postgresql并部署到Tomcat中。

    以下是我的项目布局(我使用 Palantir's Gradle Docker plugin )

      • edcom3 tomcat公司/
      • 生成.gradle
      • src/主/
        • docker/Dockerfile文件
        • 网络应用程序/edcom3.war
        • (其他我懒得罗列的东西)
      • edcom3博士后/
      • 生成.gradle
      • src/主/
      • src/主/码头工/
      • .env文件

    感谢Gradle Docker插件,上下文被内置到 $baseDir/build/docker

    以下是我目前的情况 docker-compose.yml . 我需要扩展目录结构来证明链接的合理性

    version: '3'
    services:
      edcom3-postgres:
        build: ../../../edcom3-postgres/build/docker
        image: edcom3-postgres
        restart: always
        environment:
          POSTGRES_PASSWORD: postgres
    #    networks:
    #      - edcom3-net
        expose:
          - "5432/tcp"
        ports:
        - "${EDCOM3_SQL_PORT}:5432"
        volumes:
          - "edcom3-postgres-data:/var/lib/postgresql/data"
      edcom3-tomcat:
        depends_on:
          - edcom3-postgres
        build: ../../../edcom3-tomcat/build/docker
        image: edcom3-tomcat
        expose:
          - "8009/tcp"
          - "8080/tcp"
        ports:
        - "${EDCOM3_AJP_PORT}:8009"
        volumes:
          - "edcom3-config-location:/home/tomcat"
          - "edcom3-file-repository:/mnt/fileRepository"
          - "edcom3-logs:/mnt/phoenix-logs"
          - "edcom3-tomcat-logs:/usr/local/tomcat/logs"
        restart: always
    #    networks:
    #      - edcom3-net
        links:
          - edcom3-postgres
    
    #networks:
    #  edcom3-net:
    #    driver: bridge
    #    internal: true
    
    volumes:
      edcom3-config-location:
      edcom3-file-repository:
      edcom3-logs:
      edcom3-tomcat-logs:
      edcom3-postgres-data:
    

    我试过的

    我先跑 gradle :edcom3-tomcat:docker and :edcom3-postgres:gradle 构建上下文。

    然后我唱成 src/main/docker

    edcom3-tomcat_1    | 06-Feb-2020 15:51:12.943 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/edcom3.war] has finished in [66,278] ms
    

    堆栈启动并部署应用程序。如您所见,我已经指示docker compose公开AJP端口(变量绑定到端口50000和50001),以便Apache可以将代理反向转换为Tomcat。Apache是一个独立的容器。

    但我在中找不到端口绑定 docker ps

    [docker@DOCKER01 ~]$ docker ps
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                      PORTS                                                      NAMES
    78acb0e5ff5d        edcom3-tomcat                    "catalina.sh run"        11 minutes ago      Up 11 minutes (unhealthy)                                                              edcom3_edcom3-tomcat_1
    60bbed143adf        edcom3-postgres                  "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes (unhealthy)                                                              edcom3_edcom3-postgres_1
    23265ae20793        postgres:11.6-alpine             "docker-entrypoint.s…"   7 weeks ago         Up 2 days                   192.168.0.72:5432->5432/tcp                                postgres11
    9c8b0eda42e9        portainer/portainer:1.23.0       "/portainer --ssl --…"   7 weeks ago         Up 2 days                   192.168.0.72:8000->8000/tcp, 192.168.0.72:9000->9000/tcp   keen_grothendieck
    63985a2c656f        initech/sqlserver2017:20191204   "/opt/mssql/bin/nonr…"   2 months ago        Up 2 days (healthy)         192.168.0.72:1433->1433/tcp                                sqlserver2017
    09589b076513        oracle/database:12.2.0.1-SE2     "/bin/sh -c 'exec $O…"   2 months ago        Up 2 days (healthy)         192.168.0.72:1521->1521/tcp, 192.168.0.72:5500->5500/tcp   oracle12c
    

    注意事项:(取消)在合成文件中注释网络没有效果。

    Dockerfile 但它没有任何影响:集装箱还没有确定其健康状况,但仍然没有可用的港口

    docker-compose 注释掉了)。从我的Windows工作站

    > docker inspect 4ce2be94fbe8 (tomcat)
    
    ....
    
                        "NetworkID": "8196b4a9dab76b899494f427286c0a9250ba4b74f8e4c6dbb8cd4459243509ac",
                        "EndpointID": "17d969ad49fe127870f73e63211e309f23d37a23d2918edb191381ffd7b2aaff",
                        "Gateway": "172.25.0.1",
                        "IPAddress": "172.25.0.3",
    
    ....
    

    > telnet 172.25.0.1 8009
    (connection failed)
    
    > tracert 172.25.0.1
    (a number of nodes)
    

    看到tracert结果很有趣(我省略了)。基本上,Windows 10试图通过主网关访问172.25.x.x,这是一个非常明显的16类专用IP地址,但是被我们的外部ISP忽略了(跟踪中出现了4个外部主机)

    好的,Windows没有配置路由表。

    $ docker inspect 60bbed143adf
    
    .....
    
                        "NetworkID": "10a52bc3f822f756f5b76c300787be5af255afd061453add0c70664f69ee06c8",
                        "EndpointID": "f054747f6a5d0370916caa74b8c01c3e7b30d255e06ebb9d0c450bf1db38efb1",
                        "Gateway": "172.19.0.1",
                        "IPAddress": "172.19.0.2",
                        "IPPrefixLen": 16,
    .....
    
    [docker@DOCKER01 ssl]$ telnet 172.19.0.3 8009
    Trying 172.19.0.3...
    Connected to 172.19.0.3.
    Escape character is '^]'.
    

    有趣的是,我终于可以接入网络了

    有人能帮我理解为什么我不能把端口8009(AJP)从web容器映射到主机吗?如果我能做到这一点,web应用程序将通过AJP协议提供给Apache负载平衡器

    1 回复  |  直到 4 年前
        1
  •  0
  •   zigarn    4 年前

    在compose文件中,容器端口 8009 在主机端口上公开 ${EDCOM3_AJP_PORT} .
    <IP-OF-DOCKER-SERVER>:${EDCOM3_AJP_PORT} .

    端口发布通过 ports expose 只有“暴露端口而不将它们发布到主机-它们只对链接的服务可用”

    我们可以看到 docker ps 那个 PORTS 节为空 edcom3-tomcat 容器,所以我建议 EDCOM3_AJP_PORT

    使用时 172.25.0.1:8009

    看到了吗 Container networking - Published ports

    默认情况下,创建容器时,它不会向外部发布其任何端口。
    要使端口可用于Docker之外的服务或未连接到容器网络的Docker容器,请使用--publish或-p标志。

        2
  •  0
  •   usr-local-ΕΨΗΕΛΩΝ    4 年前

    我发现edcom3网络是罪魁祸首。

    未与网络公开的端口

    主机启动,但当内部网络正在使用时无法访问

    我发现,当你将一个容器连接到一个内部网络时,它将获得它自己的私有IP地址,而不会暴露端口。不过,容器仍有可用的IP地址和端口。这里有两件值得注意的事

    2如果负载平衡器运行在Docker主机上

    设置反向代理应该更容易些。然而,不幸的是,我在Windows主机上运行了这个场景。在我的例子中,Docker Desktop没有设置路由表。即使之后 docker network inspect edcom3-net 好几次 172.16.x.x