docker-compose 和连接到 Mongo 容器
Posted
技术标签:
【中文标题】docker-compose 和连接到 Mongo 容器【英文标题】:docker-compose and connection to Mongo container 【发布时间】:2021-06-04 22:15:57 【问题描述】:我正在尝试根据以下 docker-compose.yml 文件创建 2 个容器。问题是,如果我启动 mongo 数据库容器,然后在本地运行我的代码(达到 127.0.0.1),那么一切都很好,但是如果我尝试运行我的 api 容器并点击它(参见 yml 文件),那么我会被拒绝连接即
172.29.0.12:27117:[Errno 111] 连接被拒绝,超时:30 秒,拓扑描述:
]>
请注意:我已将 mongo 设置为使用端口 27117 而不是 27017 我的应用程序是 Python Flask 应用程序,我正在以下列方式使用 PyMongo:
try:
myclient = pymongo.MongoClient('mongodb://%s:%s@%s:%s/%s' % (username, password, hostName, port, database))
mydb = myclient[database]
cursor = mydb["temperatures"]
app.logger.info('Database connected to: ' + database)
except:
app.logger.error('Error connecting to database')
让我抓狂的是它在本地运行并通过容器成功访问 mongo,但是一旦我在容器中尝试应用程序就会失败。
docker-compose.yml 如下:
version: '3.7'
services:
hotbin-db:
image: mongo
container_name: hotbin-db
restart: always
ports:
# <Port exposed> : < mysql Port running inside container>
- '27117:27017'
expose:
# Opens port 3306 on the container
- '27117'
command: [--auth]
environment:
MONGO_INITDB_ROOT_USERNAME: ***
MONGO_INITDB_ROOT_PASSWORD: ***
MONGO_INITDB_DATABASE: ***
MONGODB_DATA_DIR: /data/db
MONDODB_LOG_DIR: /dev/null
# Where our data will be persisted
volumes:
- /home/simon/mongodb/database/hotbin-db/:/data/db
#- my-db:/var/lib/mysql
# env_file:
# - .env
networks:
hotbin-net:
ipv4_address: 172.29.0.12
hotbin-api:
image: scsherlock/compost-api:latest
container_name: hotbin-api
environment:
MONGODB_DATABASE: ***
MONGODB_USERNAME: ***
MONGODB_PASSWORD: ***
MONGODB_HOSTNAME: 172.29.0.12
MONGODB_PORT: '27117'
depends_on:
- hotbin-db
restart: always
ports:
# <Port exposed> : < MySQL Port running inside container>
- '5050:5050'
expose:
- '5050'
networks:
hotbin-net:
ipv4_address: 172.29.0.13
# # Names our volume
volumes:
my-db:
networks:
hotbin-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.29.0.0/16
【问题讨论】:
是否需要为您指定 IP 地址?您可以使用服务名称作为 mongo db 的主机名 所以这给了我一个mongodb://username:password@hotbin-db:27117/hotbin
的URI,结果是hotbin-db:27117: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6043a57741b9a6faa46327e0, topology_type: Single, servers: [<ServerDescription ('hotbin-db', 27117) server_type: Unknown, rtt: None, error=AutoReconnect('hotbin-db:27117: [Errno 111] Connection refused')>]>
现在我很困惑。我特意使用端口 27117 来增加一点安全性,docker ps
显示 27117/tcp, 0.0.0.0:27117->27017/tcp hotbin-db
但是,如果我将 URI 更改为使用服务名称和标准 27017 端口,那么它就可以工作。所以URI现在是mongodb://username:password@hotbin-db:27017/hotbin
27117 是主机上的端口,当你在容器内时,你指向的是容器 IP 或名称,它仍在侦听27017
。因此,您将其映射到哪个外部/主机端口并不重要。您应该使用容器正在侦听的内部端口
【参考方案1】:
使用mongo容器的服务名和标准端口 27017 而不是 27117(即使这是在 docker-compose 文件)有效。我想知道为什么
您的 docker compose 文件确实不将 MongoDB 配置为在端口 27117 上运行。如果您想让它在 27117 上运行,您必须在 docker compose 中更改此行:
command: mongod --auth --port 27117
由于您没有指定端口,MongoDB 将在默认端口 27017 上运行。
您的 expose
部分将容器端口 27117 暴露给主机,但 Mongo 并未在该端口上运行,因此该行实际上什么也没做。
您的 ports
部分将 host 端口 27117 映射到 container 端口 27017。这意味着如果您从 host 进行连接,您可以连接到端口 27117,但那是连接到 容器 上的端口 27017。
现在到你的 python 程序。由于它在容器网络中运行,因此要连接 docker-compose 网络中的服务,您可以通过服务名称引用它们。
将这些放在一起,您的连接字符串将是:mongodb://hotbin-db:27017/yourdb?<options>
正如其他人所提到的,您确实不需要创建特定的 IP 地址除非您非常需要。您甚至不需要定义网络,因为 docker-compose 创建了它自己的内部网络。
参考:https://docs.docker.com/compose/networking/
【讨论】:
【参考方案2】:您是否使用 Windows 来运行容器?
如果是,localhost
被标识为容器的 localhost,而不是你的主机的 localhost。
因此,不要提供主机的 IP 地址,而是在 docker 容器内运行时尝试以这种方式修改 mongodB 字符串:
试试这个:
mongodb://host.docker.internal:27017/
代替:
mongodb://localhost:27017/
【讨论】:
我在 Linux 上,一旦准备好,它将被部署到 Linux VM。 我还是试了一下,得到了:host.docker.internal:27117: [Errno -2] Name or service not known, Timeout: 30s, Topology Description: <TopologyDescription id: 6043b8f637a41e8c54f70d53, topology_type: Single, servers: [<ServerDescription ('host.docker.internal', 27117) server_type: Unknown, rtt: None, error=AutoReconnect('host.docker.internal:27117: [Errno -2] Name or service not known')>]>
更新:见上文。使用 mongo 容器的服务名称和标准端口 27017 而不是 27117(即使这是在 docker-compose 文件中定义的)可以工作。我想知道为什么以上是关于docker-compose 和连接到 Mongo 容器的主要内容,如果未能解决你的问题,请参考以下文章
在 M1 Pro Monterey 12.0.1 上运行和连接到 MongoDB 时遇到问题
带有 docker-compose 的解析仪表板:无法连接到服务器