【发布时间】: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。因此,您将其映射到哪个外部/主机端口并不重要。您应该使用容器正在侦听的内部端口
标签: python mongodb flask docker-compose pymongo