无法使用 mongo 连接到 docker 容器

Posted

技术标签:

【中文标题】无法使用 mongo 连接到 docker 容器【英文标题】:Can't connect to docker container with mongo 【发布时间】:2018-08-11 13:28:18 【问题描述】:

我有 docker-compose.yml

version: '3.3'

services:
  java-app:
    image: java-app:latest
    depends_on:
      - elasticsearch
      - mongo
    environment:
      - WAIT_HOSTS=elasticsearch:9200,mongo:27017
    ports:
      - "8080:8080"

  elasticsearch:
    image: elasticsearch:latest
    command: elasticsearch

  mongo_connector:
    build:
      ./mongo-connector
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - WAIT_HOSTS=elasticsearch:9200,mongo:27017

  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"

当我运行 docker-compose.yml 时,我的应用程序能够连接到 Mongo 实例。另外,我可以通过终端连接到这个实例。

但是,默认情况下,mongo 容器在没有 --replSet 参数的情况下启动。但我需要使用此选项运行 mongo,因为 mongo-connector 需要启用副本集的实例。

所以我改变了 docker-compose.yml:

mongo:
  image: mongo:latest
  entrypoint: ["mongod", "--replSet", "rs0"]
  ports:
    - "27017:27017"

在这种情况下,mongo 容器正常启动,我在控制台中看到以下消息:

mongo_1 | 2018-03-03T12:35:27.106+0000 I NETWORK  [initandlisten] waiting for connections on port 27017

尽管如此,我的应用程序无法连接到此实例。来自终端的连接也不起作用。 如果我删除entrypoint: ["mongod", "--replSet", "rs0"],应用程序将照常连接。

你能帮帮我吗,怎么了?

UPD 我已经执行了docker inspect mongo:latest,这就是输出(稍微清理了一下):

[
    
        "Id": "sha256:43099507792a5214bd452a0eba3482e8da488b0008525578f309f040c2f7704e",
        "RepoTags": [
            "mongo:latest"
        ],
        "ContainerConfig": 
            "Hostname": "a630f7a68640",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": 
                "27017/tcp": 
            ,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.10",
                "JSYAML_VERSION=3.10.0",
                "GPG_KEYS=2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5",
                "MONGO_PACKAGE=mongodb-org",
                "MONGO_REPO=repo.mongodb.org",
                "MONGO_MAJOR=3.6",
                "MONGO_VERSION=3.6.3"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"mongod\"]"
            ],
            "ArgsEscaped": true,
            "Volumes": 
                "/data/configdb": ,
                "/data/db": 
            ,
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": [],
            "Labels": 
        ,
        "DockerVersion": "17.06.2-ce",
        "Author": "",
        "Config": 
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": 
                "27017/tcp": 
            ,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.10",
                "JSYAML_VERSION=3.10.0",
                "GPG_KEYS=2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5",
                "MONGO_PACKAGE=mongodb-org",
                "MONGO_REPO=repo.mongodb.org",
                "MONGO_MAJOR=3.6",
                "MONGO_VERSION=3.6.3"
            ],
            "Cmd": [
                "mongod"
            ],
            "ArgsEscaped": true,
            "Volumes": 
                "/data/configdb": ,
                "/data/db": 
            ,
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ]
        ,
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 365987009,
        "VirtualSize": 365987009
    
]

仍然无法弄清楚如何修改默认参数并通过--replSet。最初我覆盖了默认入口点,看起来这是错误的方式。

【问题讨论】:

执行 docker inspect mongo:latest 并检查哪些是原始入口点和 cmd 值。原始 cmd 值可能会覆盖您期望的行为。 @GonzaloMatheu 用输出更新了帖子。你能查一下吗? 正如@Oleg 回答的那样,您必须将自定义配置放在 cmd 而不是入口点上。 【参考方案1】:

保持入口点不变并改用命令:

mongo:
  image: mongo:latest
  command: ["mongod", "--replSet", "rs0"]
  ports:
    - "27017:27017"

如果您检查Dockerfile,您会看到它显示为:

ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD ["mongod"]

通过替换 entrypoint,您将替换一个 300 行长的 bash 脚本,该脚本应该使用实际命令进行一些设置,而该命令最初与您的相同,只是没有额外的参数

【讨论】:

试过这个解决方案。如果我使用 command: ["mongod", "--replSet", "rs0"] 它工作正常(例如应用程序连接到实例)。但我还需要启动副本集以使 mongo-connector 正常工作,因此我将命令更改为 command: ["sh", "-c", "mongod --replSet rs0 && mongo admin --eval 'rs.initiate();'"]。不幸的是,应用程序无法连接到使用此命令启动的 mongo 实例 这是一个完全不同的问题。我建议您从原始镜像中获取您自己的 docker 镜像,然后根据自己的喜好修改入口点脚本。 知道了。谢谢!

以上是关于无法使用 mongo 连接到 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

无法从节点连接到 docker 中的 mongo 副本集

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码

从主机连接到 mongo docker 容器

docker-compose 和连接到 Mongo 容器

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?

无法使用mongoose连接到mongo docker镜像