无法连接到AWS实例上的mongodb docker容器

时间:2018-10-08 14:40:51

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

我通过以下方式在我的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网络检查测试网

:~$ 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": {}
  }
]

2 个答案:

答案 0 :(得分:0)

尝试一下,顺序很重要,基本上是重新开始...(一次复制并全部过去)

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建立副本集的不错方法。

答案 1 :(得分:0)

我已解决问题。

由于我是从

开始使用mongod
--replSet rs0

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

mongo --eval "rs.initiate()"

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

这也是重启后发生这种情况的原因。似乎我必须在重新启动出现后始终重新启动复制集。实际上,我认为应该将其保存在mongodb卷目录中,因此重新启动不会对此产生影响。但是似乎我错了:)

谢谢大家的时间。