拨打 tcp 127.0.0.1:8080:连接:连接被拒绝。去码头工人应用

Posted

技术标签:

【中文标题】拨打 tcp 127.0.0.1:8080:连接:连接被拒绝。去码头工人应用【英文标题】:dial tcp 127.0.0.1:8080: connect: connection refused. go docker app 【发布时间】:2022-01-23 04:34:33 【问题描述】:

我有两个 Go 语言的应用程序。 user_management 应用程序,我首先运行 (docker-compose up --build),然后运行 ​​(docker-compose up --build) sport_app。 sport_app 依赖于 user_management 应用。

sport_app Dockerfile 文件如下。

FROM golang:alpine

RUN apk update && apk upgrade && apk add --no-cache bash git openssh curl

WORKDIR /go-sports-entities-hierarchy

COPY . /go-sports-entities-hierarchy/
RUN rm -rf /go-sports-entities-hierarchy/.env
RUN go mod download
RUN chmod +x /go-sports-entities-hierarchy/scripts/*
RUN ./scripts/build.sh

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait

ENV GIN_MODE="debug" \
    GQL_SERVER_HOST="localhost" \
    GQL_SERVER_PORT=7777 \
    ALLOWED_ORIGINS=* \
    USER_MANAGEMENT_SERVER_URL="http://localhost:8080/user/me" \
    # GQLGen config
    GQL_SERVER_GRAPHQL_PATH="graphql" \
    GQL_SERVER_GRAPHQL_PLAYGROUND_ENABLED=true \
    GQL_SERVER_GRAPHQL_PLAYGROUND_PATH="playground" \
# Export necessary port
EXPOSE 7777

CMD /wait && ./scripts/run.sh

sport_app docker-compose.yml 文件如下。

version: '3'

volumes:
  postgres_data:
      driver: local
services:
  go-sports-entities-hierarchy:
      restart: always
      build:
        dockerfile: Dockerfile
        context: .
      environment:
        WAIT_HOSTS: postgres:5432
        # Web framework config
        GIN_MODE: debug
        GQL_SERVER_HOST: go-sports-entities-hierarchy
        GQL_SERVER_PORT: 7777
        ALLOWED_ORIGINS: "*"
        USER_MANAGEMENT_SERVER_URL: http://localhost:8080/user/me
        # GQLGen config
        GQL_SERVER_GRAPHQL_PATH: graphql
        GQL_SERVER_GRAPHQL_PLAYGROUND_ENABLED: "true"
        GQL_SERVER_GRAPHQL_PLAYGROUND_PATH: playground
      ports:
        - 7777:7777
      depends_on:
        - postgres
        - redisearch
  go-sports-events-workflow:
      restart: always
      build:
        dockerfile: Dockerfile
        context: .
      environment:
        WAIT_HOSTS: postgres:5432
        # Web framework config
        GIN_MODE: debug
        GQL_SERVER_HOST: go-sports-events-workflow
        GQL_SERVER_PORT: 7778
        ALLOWED_ORIGINS: "*"
        # GQLGen config
        GQL_SERVER_GRAPHQL_PATH: graphql
        GQL_SERVER_GRAPHQL_PLAYGROUND_ENABLED: "true"
        GQL_SERVER_GRAPHQL_PLAYGROUND_PATH: playground
      depends_on:
        - postgres
        - redisearch
        - go-sports-entities-hierarchy

user_management 应用 Dockerfile 如下:

FROM golang:alpine

RUN apk update && apk add --no-cache git ca-certificates && update-ca-certificates

# Set necessary environmet variables needed for our image
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# Move to working directory /build
WORKDIR /build

# Copy and download dependency using go mod
COPY go.mod .
COPY go.sum .
RUN go mod download

# Copy the code into the container
COPY . .

# Build the application
RUN go build -o main .

# Move to /dist directory as the place for resulting binary folder
WORKDIR /dist

# Copy binary from build to main folder
RUN cp -r /build/html .
RUN cp /build/main .

# Environment Variables
ENV DB_HOST="127.0.0.1" \
    APP_PROTOCOL="http" \
    APP_HOST="localhost" \
    APP_PORT=8080 \
    ALLOWED_ORIGINS="*"

# Export necessary port
EXPOSE 8080

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait

# Command to run when starting the container
CMD /wait && /dist/main

user_management app docker-compose.yml 文件如下:

version: '3'

volumes:
  postgres_data:
      driver: local

services:
  postgres:
      image: postgres
      volumes:
        - postgres_data:/var/lib/postgresql/data
      ports:
        - 5432:5432
  go-user-management:
      restart: always
      build:
        dockerfile: Dockerfile
        context: .
      environment:
        # Postgres Details
        DB_PORT: 5432
        # APP details
        APP_PROTOCOL: http
        APP_HOST: localhost
        APP_PORT: 8080
        # System Configuration Details
        ALLOWED_ORIGINS: "*"
      ports:
        - 8080:8080
      depends_on:
        - postgres

在 sport_app 我写下面的代码并得到错误:

client := resty.New()
resp, err := client.R().SetHeader("Content-Type", "application/json").SetHeader("Authorization", "Bearer "+token).Get("http://localhost:8080/user/me")

错误是:Get "http://localhost:8080/user/me": dial tcp 127.0.0.1:8080: connect: connection denied:" 此 API(http://localhost:8080/user/me)是在 user_management 应用程序中编写的,并且可以正常工作,我与邮递员核实。 我已经阅读了这个问题answers,但无法解决我的问题。 我是 docker 新手,请帮忙。

【问题讨论】:

所有容器都运行在同一个 docker 机器上吗? 不,user_management app和sport_app分开运行,每个app都有自己的Dockerfile和docker-compose.yml文件。 如果两个 docker 容器是不同 docker-compose.yml 文件的一部分,那么将它们链接在一起将会更加困难。这是你设计的必要部分吗? 是的,现在有必要,我不能改变设计。你有什么建议? 【参考方案1】:

为了在多个docker-compose 客户端之间进行通信,您需要确保要相互通信的容器位于同一网络上。

例如,(为简洁起见进行了编辑)这里有docker-compose.yml 之一

# sport_app docker-compose.yml
version: '3'
services:
  go-sports-entities-hierarchy:
    ...
    networks:
      - some-net
  go-sports-events-workflow
    ...
    networks:
      - some-net
networks:
  some-net:
    driver: bridge

还有另一个docker-compose.yml

# user_management app docker-compose.yml
version: '3'
services:
  postgres:
    ...
    networks:
      - some-net
  go-user-management
    ...
    networks:
      - some-net
networks:
  some-net:
    external: true

注意:您的应用网络的名称基于 project name,该名称基于其所在目录的名称,在本例中添加了前缀 user_

然后他们可以使用服务名称相互交谈,即go-user-management等。

你可以在运行docker-compose up --build命令后运行docker network ls命令查看,然后docker network inspect bridge

【讨论】:

感谢您的回答,我有点困惑。让我告诉你我做了什么。在 user_management 应用程序 docker-compose.yml 文件中,我添加了 networks: - um-api_some-net 来结束所有服务。并结束这个 docker-compose.yml 我添加 networks: um-api_some-net: driver: bridge 。并在我的运动应用程序 docker-compose.yml 文件中结束所有服务,我添加了 networks: - sport-api_some-net 。为了结束这个 docker-compose.yml 文件,我添加了 networks: sport-api_some-net: external: true。和往常一样,我首先运行 user_management 应用程序,然后运行运动应用程序。 user_management 应用程序运行正常,但是当我运行 (docker-compose up --build) sport-app 时出现此错误:Network sport-api_some-net 声明为外部,但不能成立。请手动创建网络。我用这个命令手动创建它sudo docker network create sport-api_some-net。但我得到同样的错误:Get \"localhost:8080/user/me\": dial tcp 127.0.0.1:8080: connect: connection denied:". 那我就试着用你说的服务名。而不是 resp, err := client.R().SetHeader("Content-Type", "application/json").SetHeader("Authorization", "Bearer "+token).Get("localhost:8080/user/me" ) 我写了 resp, err := client.R().SetHeader("Content-Type", "application/json").SetHeader("Authorization", "Bearer"+token).Get ("go-user-management:8080/user/me") 但得到类似的错误:Get \"go-user-management:8080/user/me\": dial tcp:lookup go-user-management: Try again:" 我做错了什么? 在此链接中,您可能会看到我的 docker network inspect bridge 命令结果。 go.dev/play/p/oxpJn6X_-LV 这里是 docker network ls go.dev/play/p/uy-PfrJhT2E 的结果。运行应用程序后创建的最后四个网络。

以上是关于拨打 tcp 127.0.0.1:8080:连接:连接被拒绝。去码头工人应用的主要内容,如果未能解决你的问题,请参考以下文章

网络连接返回getsockopt: connection refused错误原因 及 listen

TCP基础server与client

socket编程

网络编程 --- TCP

TCP和UDP基本写法

第二十九天