从容器内连接到mongoDB会话

从容器内连接到mongoDB会话,mongodb,docker,go,Mongodb,Docker,Go,我刚学会如何使用goLang构建微服务。我有一个完整的项目,并在本地运行,但当我试图部署它时,我遇到了一个问题。我使用的会话(mgo.Dial(“localhost”)不再工作。当我把它放到docker映像中时,它无法连接到本地主机,这是有道理的,因为docker映像在一个新的操作系统上构建它(在我的例子中是alpine)。我在想我应该怎么做才能让它连接起来 明确地说,当我研究这个问题时,大多数人都希望连接到mongoDB会话(docker容器),我希望从docker容器中连接到mongoDB会

我刚学会如何使用goLang构建微服务。我有一个完整的项目,并在本地运行,但当我试图部署它时,我遇到了一个问题。我使用的会话
(mgo.Dial(“localhost”)
不再工作。当我把它放到docker映像中时,它无法连接到本地主机,这是有道理的,因为docker映像在一个新的操作系统上构建它(在我的例子中是alpine)。我在想我应该怎么做才能让它连接起来

明确地说,当我研究这个问题时,大多数人都希望连接到mongoDB会话(docker容器),我希望从docker容器中连接到mongoDB会话。而且,一旦我准备好部署,我将使用StatefulSet和kubernetes,如果这改变了什么

例如,我希望我的程序是这样的:

sess, err := mgo.Dial("localhost") //or whatever
if err != nil {
   fmt.Println("failed to connect")
else {
   fmt.Println("connected")
我试着做的是: Dockerfile:

FROM alpine:3.6

COPY /build/app /bin/
EXPOSE 8080

ENTRYPOINT ["/bin/app"]
在终端:

docker build -t hell:4 .
docker run -d -p 8080:8080 hell:4
正如你所料,上面写着“未连接”。此外,端口映射用于项目的其余部分,而不是此部分


谢谢你的帮助

如果您的mongoDB服务器正在主机上运行,请用主机IP替换本地主机。

我认为您不应该尝试连接到您的主机上运行的mongoDB服务器。如果希望MongoDB服务器与您的服务一起在某个云或服务器上运行,请考虑以后部署整个应用程序

这个问题可以通过设置一个额外的容器并将其链接到您的Go Web应用程序来解决。Docker compose可以处理这个问题。只需将docker-compose.yml文件放在执行
docker构建的目录中即可

version: '3'
  services:
    myapp:
      build: .
      image: hell:4
      ports:
        - 8080:8080
      links:
        - mongodb
      depends_on:
        - mongodb
  mongodb:
    image: mongo:latest
    ports:
        - "27017:27017"
    environment:
        - MONGODB_USER="user" 
        - MONGODB_PASS="pass"

像这样的东西应该可以(未经测试)。您有两个服务:一个用于根据您当前所在目录中的
Dockerfile
生成的应用程序。此外,它还链接到下面定义的名为
mongodb
的服务。mongodb服务可以通过服务名称
mongodb

尝试
docker run--net=“host”-d-p 8080:8080 hell:4
访问。我得到:警告:使用主机网络模式时,会丢弃已发布的端口,以及一个长哈希代码。您的mongodb是否在容器中运行?我只是尝试了一下,但没有效果。我基本上从cmd中创建了一个标志,并传入了我的ip地址,代码将其链接到mgo.Dial(等等)。它看起来像是docker run-d-p8080:8080 7b0bbcf671d1——mongo url=11.111.11.111
我的代码接受了它:
flags.StringVar(&ipAdd,“mongo url”,“localhost”,“mongoDB的url”)mgo.Dial(ipAdd)
我还尝试了docker run-d-p8080:8080地狱:4——mongo url=mongo:11.111.11/go/src/db