从Docker容器连接到远程数据库示例时遇到问题。
我有一个Docker容器,其中包含一段连接到远程MongoDB示例的简单Python代码
client = MongoClient('mongodb-example_conn_string.com')
db = client.test_db
collection = db.test_collection
print(collection.find_one())
我可以从我的主机(一台运行Linux Mint 20的笔记本电脑)运行这段代码,它会按预期打印结果。
当我为这个脚本构建一个Docker映像(python:3.6.10-alpine)和Docker Run then映像时,我得到一个错误消息。
例如:
docker build . -t py_connection_test
docker run --rm py_connection_test run
我收到此错误
pymongo.errors.ServerSelectionTimeoutError: mongodb-example_conn_string.com:27017: [Errno -2] Name does not resolve, Timeout: 30s, Topology Description: <TopologyDescription id: 60106f40288b81e007fe75a8, topology_type: Single, servers: [<ServerDescription ('mongodb-example_conn_string.com', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb-example_conn_string.com:27017: [Errno -2] Name does not resolve',)>]>
MongoDB远程示例是一个工作中的内部数据库,需要一个VPN(使用OpenVPN)来访问它。我已经在主机和Docker容器上使用了traceroute来确认网络流量是通过VPN路由的,看起来一切都很好。
我已经试过了
--network="host"
但同样的事情发生了
我很困惑,为什么同一个连接网址在两种情况下都不起作用?是不是有什么简单的事情我遗漏了?
2条答案
按热度按时间cbwuti441#
我已经解决了这个问题,感谢Max告诉我要调查DNS。
我的问题是Docker容器在我的主机上拾取了一个错误的/etc/resolv.conf文件。它包含2个名称服务器条目
在我的例子中,我可以在我的主机上创建文件/etc/docker/daemon. json,并在那里添加我的dns条目,以便运行时Container拾取。例如,添加行:
编辑/创建此文件需要重新启动Docker服务
我从https://l-lin.github.io/post/2018/2018-09-03-docker_ubuntu_18_dns/得到了一些有用的提示
ddrv8njm2#
如果您未使用DNS指定连接,而是使用VPN访问资源,并遇到此问题,则很可能与覆盖VPN IP范围的Docker网络有关,请参阅this github issue了解更多详细信息。
作为一个临时的解决方案,尝试
docker network prune
,如果这没有帮助,尝试杀死所有容器,然后修剪,如果这没有帮助,那么要么尝试一个完整的docker重新启动,而不是修剪或下一步。对于永久解决方案(或至少更持久),请查看本指南(它将需要重新启动Docker守护程序)。