【发布时间】:2020-08-17 07:57:29
【问题描述】:
我创建了一个包含 api 的 Go 后端服务器。在本地运行“运行服务器”时一切正常。然而,我在 docker 中运行它时确实遇到了问题。所以我创建了一个 Dockerfile 并在 networkmode 主机中运行 linux 容器,但无法在浏览器中访问 api。如果它工作正常,我应该能够看到来自http://localhost:8500/status 的 json 响应。所以我想我需要权限或添加标志或更多与安装相关的脚本。我一直在 docker 中测试不同的标志和端口,但无法识别问题。请参阅下面的代码、dockerfile 和命令。
注意:当我在 windows 上本地运行程序时,会弹出一个安全警告,也许这与问题有关?
我正在运行 docker desktop community v 2.2.0.5 stable。
API 代码:
import (
"log"
"net/http"
conf "server/conf"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var db *gorm.DB
// Middleware used to add correct permissions for all requests
func middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
next.ServeHTTP(w, r)
})
}
func StartApi(config conf.Config, _db *gorm.DB) {
log.Println("Start Api")
db = _db
router := mux.NewRouter()
// Create
router.HandleFunc("/login", login).Methods("POST", "OPTIONS")
router.HandleFunc("/network", createNetwork).Methods("POST", "OPTIONS")
// Read
router.HandleFunc("/users/{networkName}", getUsers).Methods("GET", "OPTIONS")
router.HandleFunc("/streams/{networkName}", getStreams).Methods("GET", "OPTIONS")
router.HandleFunc("/status", showStatus).Methods("GET", "OPTIONS")
log.Println("API started at port " + config.Backend.Api_port) // api port is stored in config
log.Println(http.ListenAndServe(":"+config.Backend.Api_port, middleware(router)))
log.Println("Api done!") }
Dockerfile:
# Start from the latest golang base image
FROM golang:latest
WORKDIR /go/src/server
COPY ./src/server .
# Download packages
RUN go get .
# Compile code
#RUN go build -o server
RUN go install server
# Expose ports
EXPOSE 8500
EXPOSE 8600
#ENTRYPOINT ./server
CMD ["go", "run", "server"]
Docker 撰写:
version : '3'
services:
react:
build: ./ReactFrontend/
container_name: ReactFrontend
tty: true
ports:
- 4000:3000
backend:
network_mode: host
build: ./GoBackend/
container_name: goserver
ports:
- 8500:8500
- 8600:8600
Docker 命令:
docker run --net=host goserver
感谢您的帮助,
干杯!
【问题讨论】:
-
您使用的是哪种 Docker 设置? (是 Docker 工具箱吗?)你能展示你的应用程序代码中绑定到网络套接字的部分吗?为什么需要主机网络或 tty?
-
要跟进@DavidMaze 的评论,您确实需要提供有关 Docker 设置的更多信息(因为在 Windows 下可能有两种不同的方法),以及警告/错误/不需要的行为你观察。
-
仅供参考,此答案中提到了在这种情况下可能发生的三个典型问题(在 Windows 上部署后端和浏览
http://localhost…):Not open web page on port 8080 when start tomcat inside Docker。 -
顺便说一句,@DavidMaze 提到,使用
docker run --net=host是一种不好的做法,因为它基本上会阻碍 Docker 提供的网络隔离。我建议您使用诸如docker-compose up 之类的命令。