无法连接到 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
我可以看到列出了所有容器。
到目前为止我做了什么:
- 重新启动docker服务(多次)
- 手动删除并创建了 docker 网络(也使用了新名称)
- docker系统p运行e
真的需要帮助,因为我现在被困了 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 卷目录中,所以重新启动不会影响这个......但似乎我错了:)
谢谢大家的宝贵时间。
我通过
在我的 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
我可以看到列出了所有容器。
到目前为止我做了什么:
- 重新启动docker服务(多次)
- 手动删除并创建了 docker 网络(也使用了新名称)
- docker系统p运行e
真的需要帮助,因为我现在被困了 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 卷目录中,所以重新启动不会影响这个......但似乎我错了:)
谢谢大家的宝贵时间。