首頁  >  問答  >  主體

golang - 把 Go 專案部署到 Docker 後連接不了MongoDB

跟著一本書做了一個 API Server,這裡是專案。專案啟動後,本地運行mongod來啟動 MongoDB 是可以連接的。但是當我打包Server 成docker 後(docker build -t taskmanager .),並且用容器啟動這個Server(docker run --publish 8080:8080 taskmanager),就不知道怎麼樣和以前一樣連接到資料庫了。不知道自己是 Dockerfile 寫錯了還是連接埠沒設定好,自己對 Docker 也不太熟。

// 连接 mongodb
func createDbSession() {
    var err error
    session, err = mgo.DialWithInfo(&mgo.DialInfo{
        Addrs:    []string{"127.0.0.1"},
        Username: "",
        Password: "",
        Timeout:  60 * time.Second,
    })
    if err != nil {
        log.Fatalf("[createDbSession]: %s\n", err)
    }
}
// 报错
$ docker run --publish 8080:8080 taskmanager
2017/04/25 13:37:59 [createDbSession]: no reachable servers

Dockerfile:

# golang image where workspace (GOPATH) configured at /go.
FROM golang

# Copy the local package files to the conainer's workspace
ADD . /go/src/github.com/Latias94/taskmanager

# Setting up working directory
WORKDIR /go/src/github.com/Latias94/taskmanager

# Get godeps for managing and restoring dependencies
RUN go get github.com/tools/godep

# Restore godep dependencies
RUN godep restore

# Build the taskmanager command inside the container.
RUN go install github.com/Latias94/taskmanager

# Run the taskmanager command when the container starts.
ENTRYPOINT /go/bin/taskmanager

# Service listens on port 8080.
EXPOSE 8080

我應該把資料庫也包在 Docker 裡面嗎?還是我 Docker 的啟動方式有問題? Mongodb 的連接埠是預設的27017,專案如果成功啟動開啟會顯示404。 godep restore可以安裝專案依賴。


Update:

func createDbSession() {
    var err error
    // 改为 mgo.Dial
    session, err = mgo.Dial(AppConfig.MongoDBHost) // "mongo:27017"
    if err != nil {
        log.Fatalf("[GetSession]: %s\n", err)
    }
    if err != nil {
        log.Fatalf("[createDbSession]: %s\n", err)
    }
}

docker build -t taskmanager . build 後嘗試 link

$ docker run -it --link mongodb:mongo --name taskmanager2 taskmanager --publish 8080:8080
2017/04/26 13:17:07 Listening...

現在能啟動了,但是localhost:8080看不到項目,自己愣是找不到伺服器位址..
打算這幾天把《第一本Docker 書》啃一遍再回頭來看這問題。
感謝回答者。

仅有的幸福仅有的幸福2685 天前918

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-05-16 13:19:18

    docker裡面的程式是不能存取宿主機的服務的。你應該將mongodb也採用docker去運行,然後用link指令去連結兩個容器

    回覆
    0
  • 巴扎黑

    巴扎黑2017-05-16 13:19:18

    你的問題跟link不link沒太大關係
    docker訪問宿主機服務不能用 127.0.0.1 得用內網或外網IP 如192.168.x.x

    回覆
    0
  • 取消回覆