首页 > 解决方案 > 与运行 golang 的多个容器通信

问题描述

我正在尝试使用golangDocker

我不明白如何add.gomainmodule.

这篇文章也是这样做的,但它使用githubrepo 并构建它。

我对两者都很陌生golangDocker所以任何让这个简单的应用程序工作的建议都会很棒。

这是我的文件夹结构。

- addmodule
    - add.go
    - Dockerfile
- mainmodule
    - main.go
    - Dockerfile

- docker-compose.yml

Dockerfileaddmodule

FROM   golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src
RUN go build -o add .
EXPOSE 7070
RUN chmod 755 add
CMD [ "./add" ]

Dockerfilemainmodule

FROM golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src
CMD [ "go","run","main.go" ]

码头工人-compose.yml

version: '3'

services:
  addmodule:
    image: addmodule
    build:
      context: ./addmodule
      dockerfile: Dockerfile
    depends_on:
      - mainmodule

  mainmodule:
    image : mainmodule
    build:
      context: ./mainmodule
      dockerfile: Dockerfile

我的add.go

package main

import (
    "log"
    "net/http"
)

func add(reswt http.ResponseWriter, req *http.Request) {
    log.Println("Request came to here")
}

func main() {
    http.HandleFunc("/add", add)
    http.ListenAndServe("0.0.0.0:7070", nil)

}

main.gomainmodule

package main

import (
    "log"
    "net/http"
)

func main() {
    log.Println("From main package")

    res, err := http.Get("0.0.0.0:7070/add")

    if err != nil {
        log.Println("couldnt send get request")
    }

    log.Println(res)

}

当我跑步时sudo docker-compose up --build,我会得到couldnt send get request

PS:根据@MaartenDev 给出的建议,用修改后的代码编辑问题

标签: dockergo

解决方案


Docker compose 默认会创建一个网络。服务名称可用于访问同一网络中的包含。

version: '3'

services:
  addmodule:
    image: addmodule
    build:
      context: ./addmodule
      dockerfile: Dockerfile
    depends_on:
      - mainmodule

  mainmodule:
    image : mainmodule
    build:
      context: ./mainmodule
      dockerfile: Dockerfile

并且mainmodule可以通过连接来访问添加模块,http://addmodule:<port>并且addmodule可以mainmodule通过以下方式访问:http://mainmodule

这假设这些是 http 服务。任何其他传输都将起作用,因为addmodulemainmodule使用 DNS 提供。

使用自定义端口时,请确保端口在 Dockerfile 中公开:

FROM   golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src

EXPOSE 7070

你的 http 应该绑定到 0.0.0.0 而不是 localhost。这确保服务可以从容器外部访问:

http.ListenAndServe("0.0.0.0:7070", nil)

主要代码应使用以下内容:

package main

import (
    "log"
    "net/http"
)

func main() {
    log.Println("From main package")

    res, err := http.Get("http://addmodule:7070/add")  // The mistake I made after a long chat. forgot http://

    if err != nil {
        log.Println("couldnt send get request")
    }

    log.Println(res)

}

阅读有关默认网络的更多信息:https ://docs.docker.com/compose/networking/


推荐阅读