【问题标题】:Can not connect to mongodb docker container on aws instance无法连接到 aws 实例上的 mongodb docker 容器
【发布时间】:2018-10-10 03:55:56
【问题描述】:

我通过

在我的 AWS EC2 实例上创建了一个新的 docker 网络
docker network create testnet

我有以下 docker-compose:

version: '2'

services:
  mongodb:
    image: mongo:3
    container_name: mongodb
    environment:
      - MONGO_DATA_DIR=/data/db
      - MONGO_LOG_DIR=/dev/null
    volumes:
      - mongodb_data_db:/data/db
    ports:
      - 27017:27017
    command: mongod --smallfiles --logpath=/dev/null --replSet rs0 # --quiet

volumes:
  mongodb_data_db:

networks:
  default:
    external:
      name: testnet

在同一网络上运行的第二个容器正在尝试使用此 docker-compose 连接到“mongodb”:

version: "2"
services:
  monstache:
    image: rwynn/monstache
    container_name: monstache
    command: -mongo-url=mongodb -elasticsearch-url=http://elasticsearch:9200 -direct-read-namespace=db.heartbeat -direct-read-split-max=2

networks:
  default:
    external:
      name: testnet

自上次 AWS 决定重新启动我的实例以来,它一直有效。之后,我不得不再次重新启动所有容器,但从那时起我从 monstache 容器中收到一条错误消息:

Unable to connect to MongoDB using URL MongoDB: timed out after 15 seconds

这意味着我无法再访问 MongoDB 容器了。此外,网络中的另一个容器无法再连接到“mongodb”,所以我认为这不仅仅是“monstache”容器的问题。我的 docker 系统似乎发生了一些变化。 至少在我跑步的时候。

docker network inspect testnet

我可以看到所有的容器都列出来了。

到目前为止我做了什么:

  • 重启 docker 服务(多次)
  • 手动删除并创建了 docker 网络(也使用了新名称)
  • docker 系统修剪

真的需要帮助,因为我现在被困了 2 天试图解决这个问题:(


更新:用于 Elasticsearch(和 Kibana)的 docker-compose.yml

version: "2"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.1
    container_name: elasticsearch
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  kibana:
    image: docker.elastic.co/kibana/kibana:6.4.1
    container_name: kibana
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
    ports:
      - 5601:5601

volumes:
  elasticsearch:
    driver: local

networks:
  default:
    external:
      name: testnet

更新:docker network inspect testnet

:~$ docker network inspect testnet
[
  {
    "Name": "testnet",
    "Id": "448018003d92c8802dd701931e21da018618abce360a147808a5c6b4b51f4b6d",
    "Created": "2018-10-08T12:40:10.163231318Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Containers": {
      "34df14ddf4ef004115b6e66b35177356a7c0c5e5d0d94d2c05406aa61cd1d744": {
        "Name": "kibana",
        "EndpointID": "bb38deafbd1929d268ba55c8fb28064d9b0afe7bbfb95289a6893ca62f91ff8b",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
      },
      "95034d04c4f6c07527f725436a84b20a1514d8aaf70d4e19c54344eb07c7632f": {
        "Name": "elasticsearch",
        "EndpointID": "269e42333b20dd01152f58329c87060059471a8ea68e3cd97cb45c502b102879",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
      "c3153881f2a8925bb74718afa9b33c5e9cfcc10f58b2fa7a5157e45b83bea343": {
        "Name": "mongodb",
        "EndpointID": "44c6ac5755897c056d7285eba83a0934e1871b6c2ca671cbbe846fc55e23ff3e",
        "MacAddress": "02:42:ac:12:00:04",
        "IPv4Address": "172.18.0.4/16",
        "IPv6Address": ""
      }
    },
    "Options": {},
    "Labels": {}
  }
]

【问题讨论】:

  • 你确定 mongodb 容器已经在运行了吗?
  • 是的,我可以看到所有容器都在使用 docker ps -a 运行
  • 所以您已经尝试过先运行 mongo 容器,然后手动运行 monstache 容器。在这些情况下,它们工作正常吗?
  • 不幸的是,即使手动启动每个容器,它也无法正常工作。实际上还有一个弹性搜索容器在同一个网络上运行。 Monstache 会将 mongodb 数据同步到 elasticsearch 索引,因此它必须知道 'mongodb' 和 'elasticsearch' 作为主机。但是“mongodb”不知何故无法连接。无论如何,设置是:mongodb + elasticsearch 作为自己的容器运行。之后我开始 monstache 容器
  • 你能提供 Docker compose 来进行弹性搜索吗?如果我正确理解你的问题。所有容器都正常启动,但没有一个可以通过服务发现访问。我说的对吗?

标签: docker amazon-ec2 docker-compose docker-networking


【解决方案1】:

我已经解决了我的问题。

因为我开始使用 mongod

--replSet rs0

重启后,我不得不重新实例化 mongodb 副本集。使用后

mongo --eval "rs.initiate()"

在 mongodb 容器上,我可以通过 'mongodb' 容器服务 url 从其他容器连接。

这也是重启后发生的原因。似乎我必须在重新启动后始终重新启动副本集。其实我认为这应该保存在mongodb卷目录中,所以重启不会影响这个......但似乎我错了:)

感谢大家的宝贵时间。

【讨论】:

    【解决方案2】:

    试试这个,订单很重要,基本上是从新开始......(一次复制和过去)

    docker-compose kill
    
    docker-compose down
    
    docker rm $(docker ps -aq)
    
    docker network rm $(docker network ls)
    
    docker volume rm $(docker volume ls --format {{.Name}})
    
    docker-compose up --force-recreate
    

    如果可能,您应该避免对副本使用 IP 地址。

    主机名

    使用逻辑 DNS 主机名而不是 IP 地址, 特别是在配置副本集成员或分片集群时 成员。使用逻辑 DNS 主机名可避免配置更改 由于IP地址更改。

    更多信息 --> replica-set-architectures

    您不应该需要在重启后启动,除非所有节点同时关闭。我假设如果所有容器都在 1 个实例上运行,就会发生这种情况。

    如果您留下一个,并且在配置文件中设置了replSet,其他人将自动重新加入。

    为了实现高可用性,请考虑在Swarm 中运行副本集。这是很好的walkthrough 使用 swarm 设置副本集。

    【讨论】:

    • 不幸的是,这对我不起作用。仍然无法访问“mongodb”。 docker 也不接受 --no-cache 和 --format {{.Id}} 参数
    • 更新后的答案应该是 name 而不是 id 和 --no-cache 仅适用于构建
    • 添加了更多信息来回答
    猜你喜欢
    • 2016-09-22
    • 2017-09-16
    • 2016-03-02
    • 2022-01-11
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多