我正在尝试使用these instructions来尝试在容器中运行mongodb docker映像。
我能够运行图像:
(virtual) anonymous@anonymous:~/PycharmProjects/PostDekko/climbticks-flaskmongoangul$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
431a9d693f48 mongo:bionic "docker-entrypoint.s…" 24 minutes ago Up 24 minutes 27017/tcp climbticks-mongodb
f12d227dcdd8 climbticks-flaskmongoangul_web_dev "python3.8 index.py" 3 hours ago Up 3 hours 0.0.0.0:4000->4000/tcp climbticks-flaskmongoangul_web_dev_1
我的项目在第二个容器中,而mongodb映像为container_id 431a9d693f48
。我还可以访问日志,因此我知道它可以运行。
根据他们的指示:
映像中的MongoDB服务器在标准MongoDB端口上侦听, 27017,因此通过Docker网络进行的连接将与 连接到远程蒙哥。以下示例开始另一个 MongoDB容器实例并运行mongo命令行客户端 相对于上面示例中的原始MongoDB容器, 允许您对数据库执行MongoDB语句 实例:
> $ docker run -it --network some-network --rm mongo mongo --host
> some-mongo test
...,其中some-mongo是原始mongo容器的名称。
但是...。我不知道我的“网络”应该是什么。从docker的角度来看,我认为network参数表示网络ID。如果我运行:
(virtual) anonymous@anonymous:~/PycharmProjects/PostDekko/climbticks-flaskmongoangul$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
7fbed634dbdf bridge bridge local
0843e5ae6173 host host local
6b3c8eb4b216 none null local
cc3d76f1f109 web_dev bridge local
我得到4个网络ID。 web_dev是我项目的(网络服务器)容器。如果尝试4种方法之一,我将得到:
(virtual) anonymous@anonymous:~/PycharmProjects/PostDekko/climbticks-flaskmongoangul$ sudo docker run -it --network cc3d76f1f109 --rm mongo mongo --host climbticks-mongodb test
MongoDB shell version v4.2.7
connecting to: mongodb://climbticks-mongodb:27017/test?compressors=disabled&gssapiServiceName=mongodb
2020-05-31T01:55:08.771+0000 E QUERY [js] Error: couldn't connect to server climbticks-mongodb:27017, connection attempt failed: HostNotFound: Could not find address for climbticks-mongodb:27017: SocketException: Host not found (authoritative) :
connect@src/mongo/shell/mongo.js:341:17
@(connect):2:6
2020-05-31T01:55:08.779+0000 F - [main] exception: connect failed
2020-05-31T01:55:08.779+0000 E - [main] exiting with code 1
我也尝试了各种本地主机(0.0.0.0,本地主机等)的表达式,即使这对我来说没有意义。
那么......我怎么找到网络应该是什么?
编辑:尽管如果我在外壳中连接到数据库:
sudo docker exec -it climbticksmongodb bash
然后我可以谈谈。因此,数据库处于活动状态。看来,我真的只需要弄清楚网络问题。
答案 0 :(得分:1)
启动容器时,它将在默认的桥接网络中启动,因此,如果不指定连接到容器的任何网络,它们将无法相互连接。
有几种方法可以使它们彼此交互。您可以创建一个网络,然后将它们都连接。
例如:
docker network create -d bridge my-bridge-network
然后用--network my-bridge-network
将其附加到两个docker run命令。
或使用docker <container> attach <network>
这也是docker-compose修复程序的问题,您可以在连接了相同网络的情况下运行各种容器。
另一种方法是使用特殊的DNS host.docker.internal
,它实际上是容器主机localhost。因此,如果您执行docker run mongo -p 27017:27017
并且要连接到另一个容器中,则可以连接到host.docker.internal:27017
,这是您的端口27017
绑定到mongo容器27017
的地方。
有关docker文档的更多详细信息:
https://docs.docker.com/network/network-tutorial-standalone/