golang - 把 Go 项目部署到 Docker 后连接不了MongoDB

查看:262
本文介绍了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 书》啃一遍再回头来看这问题。
感谢回答者。

解决方案

docker里面的程序是不能访问宿主机的服务的。你应该将mongodb也采用docker去运行,然后用link指令去链接两个容器

这篇关于golang - 把 Go 项目部署到 Docker 后连接不了MongoDB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆