docker - 与运行 golang 的多个容器通信
问题描述
我正在尝试使用golang
和Docker
我不明白如何add.go
从mainmodule
.
这篇文章也是这样做的,但它使用github
repo 并构建它。
我对两者都很陌生golang
,Docker
所以任何让这个简单的应用程序工作的建议都会很棒。
这是我的文件夹结构。
- addmodule
- add.go
- Dockerfile
- mainmodule
- main.go
- Dockerfile
- docker-compose.yml
Dockerfile
在addmodule
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" ]
Dockerfile
在mainmodule
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.go
的mainmodule
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 给出的建议,用修改后的代码编辑问题
解决方案
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 服务。任何其他传输都将起作用,因为addmodule
和mainmodule
使用 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/
推荐阅读
- javascript - firebase 事务和 if-then-else 行为
- java - 如何改进我对 Android SharedPreference 的使用?
- android - 无法加载类'kotlin.reflect.KDeclarationContainer'.android studio 3.1.4
- c# - 为局部变量或方法参数添加代码样式命名 - C# Visual Studio
- spring - 运行 Spring Boot 2 休息服务的最佳方式
- sql - 分层查询以返回具有根父级的所有子级
- java - Java - 如何将 InputStream 转换为适当的格式以使用 IBM Watson 的 Speech-to-Text 服务?
- asp.net-core - Getting the Roles of the current user in .NET Core2.1
- javascript - 即使一项中只有一个属性发生了变化,我是否必须重新加入整个数据集?
- c# - C# - 如何为调用者创建堆栈 ID?