问题描述
我正在使用以下命令运行 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
选项来获得合理的容器间网络。