无法从 Docker 容器连接到 MongoDB

问题描述

我正在使用以下命令运行 Mongo DB 映像:

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=test -e MONGO_INITDB_ROOT_PASSWORD=password --name=testdb mongo

这个创建的容器,我可以从 robo3T 连接到这个容器。

现在我使用以下命令运行 mongo-express 图像并尝试在数据库上方:

docker run -d -p 8081:8081 -e ME_CONfig_MONGODB_ADMINUSERNAME=test -e ME_CONfig_MONGODB_ADMINPASSWORD=password -e ME_CONfig_MONGODB_SERVER=testdb --name=mongo-ex mongo-express

但我收到以下错误

UnhandledPromiseRejectionWarning: MongoNetworkError: Failed to connect to server [testb:27017] on first connect [Error: getaddrinfo ENOTFOUND testb

如果我正在创建自定义桥接网络并在该容器中运行这两个映像,则它可以正常工作。

我的问题是:由于认网络是桥接网络,而这些容器是在认桥接网络中创建的,为什么它们无法通信?为什么它与自定义桥接网络一起工作?

解决方法

two kinds of "bridge network";如果您没有 Select (t1.count+t2.count) as countTotal from t1 LEFT JOIN t2 ON (t1.ID = t2.ID); 选项,那么您会得到非常有限的 "default" bridge network。您几乎总是想要docker run --net一个“用户定义的”桥接网络,它具有标准的 Docker 网络功能。

docker network create

默认情况下,您在没有 # Use modern Docker networking docker network create myapp docker run -d --net myapp ... --name testdb mongo docker run -d --net myapp ... -e ME_CONFIG_MONGODB_SERVER=testdb mongo-express # Because both containers are on the same --net,the first # container's --name is usable as a host name from the second 的情况下获得的“默认”桥接网络禁止容器间通信,您需要一个特殊的 --net 选项来建立连接。这被认为已过时,the Docker documentation page describing links 指出链接“最终可能会被删除”。

--link

在现代 Docker 设置中,您真的不应该使用 # Use obsolete Docker networking; may stop working at some point docker run -d ... --name testdb mongo docker run -d ... -e ME_CONFIG_MONGODB_SERVER=testdb --link testdb mongo-express # Containers can only connect to each other by name if they use --link 或等效的 Compose --link 选项。更喜欢使用更现代的 links: 形式。如果您使用 Compose,请注意 Compose creates a network named default 但这是一个“用户定义的桥”;在大多数情况下,您根本不需要任何 docker network create 选项来获得合理的容器间网络。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...