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

Can not connect to mongodb docker container on aws instance

我通过

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

我有以下 docker-撰写:

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

同一网络上的第二个容器 运行ning 正在尝试使用此 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

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

到目前为止我做了什么:

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


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

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

试试这个,顺序很重要,基本上是从头开始...(一次复制并过去)

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 地址。

Hostnames

Use a logical DNS hostname instead of an ip address, particularly when configuring replica set members or sharded cluster members. The use of logical DNS hostnames avoids configuration changes due to ip address changes.

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

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

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

对于高可用性,请考虑 运行 Swarm 中的副本集。这是使用 swarm 设置副本集的好方法 walkthrough

我已经解决了我的问题。

因为我用

启动 mongod
--replSet rs0

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

mongo --eval "rs.initiate()"

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

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

谢谢大家的宝贵时间。