docker-组成并连接到 Mongo 容器
docker-compose and connection to Mongo container
我正在尝试根据以下 docker-compose.yml 文件创建 2 个容器。问题是,如果我启动 mongo 数据库容器,然后在本地 运行 我的代码(命中 127.0.0.1),那么一切都很好,但是如果我尝试 运行 我的 api 容器并点击它(见 yml 文件)然后我得到连接被拒绝即
172.29.0.12:27117: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id:
60437a460a3e0fa904650e35, topology_type: Single, servers: [<ServerDescription ('172.29.0.12', 27117) server_type:
Unknown, rtt: None, error=AutoReconnect('172.29.0.12:27117: [Errno 111] Connection refused')>]>
请注意:我已将 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
您是否正在使用 Windows 到 运行 容器?
如果是,localhost
被识别为容器的本地主机,而不是您主机的本地主机。
因此,当 运行 在 docker 容器内时,尝试以这种方式修改 mongodB 字符串,而不是提供主机的 IP 地址:
试试这个:
mongodb://host.docker.internal:27017/
代替:
mongodb://localhost:27017/
Using the service name of the mongo container and the standard port of
27017 instead of 27117 (even though that's what is defined in the
docker-compose file) works. I'd like to understand why though
您的 docker 撰写文件 NOT 在端口 27117 上将 MongoDB 配置为 运行。如果您想将其发送到 运行 在 27117 上,您必须在 docker 撰写中更改此行:
command: mongod --auth --port 27117
由于您没有指定端口,MongoDB 将 运行 使用默认端口 27017。
您的 expose
部分将容器端口 27117 公开给主机,但 Mongo 不在该端口上 运行,因此该行实际上什么都不做。
您的 ports
部分将 host 端口 27117 映射到 container 端口 27017。这意味着如果您正在连接从 host,您可以连接到端口 27117,但这是连接到 container.
上的端口 27017
现在进入您的 python 程序。由于这是容器网络中的 运行ning,要在 docker-compose 网络中连接服务,您可以通过服务名称引用它们。
将这些放在一起,您的连接字符串将是:mongodb://hotbin-db:27017/yourdb?<options>
正如其他人所提到的,您真的不需要创建特定的 IP 地址除非您非常需要。您甚至不需要定义网络,因为 docker-compose 会创建它自己的内部网络。
我正在尝试根据以下 docker-compose.yml 文件创建 2 个容器。问题是,如果我启动 mongo 数据库容器,然后在本地 运行 我的代码(命中 127.0.0.1),那么一切都很好,但是如果我尝试 运行 我的 api 容器并点击它(见 yml 文件)然后我得到连接被拒绝即
172.29.0.12:27117: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 60437a460a3e0fa904650e35, topology_type: Single, servers: [<ServerDescription ('172.29.0.12', 27117) server_type: Unknown, rtt: None, error=AutoReconnect('172.29.0.12:27117: [Errno 111] Connection refused')>]>
请注意:我已将 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
您是否正在使用 Windows 到 运行 容器?
如果是,localhost
被识别为容器的本地主机,而不是您主机的本地主机。
因此,当 运行 在 docker 容器内时,尝试以这种方式修改 mongodB 字符串,而不是提供主机的 IP 地址:
试试这个:
mongodb://host.docker.internal:27017/
代替:
mongodb://localhost:27017/
Using the service name of the mongo container and the standard port of 27017 instead of 27117 (even though that's what is defined in the docker-compose file) works. I'd like to understand why though
您的 docker 撰写文件 NOT 在端口 27117 上将 MongoDB 配置为 运行。如果您想将其发送到 运行 在 27117 上,您必须在 docker 撰写中更改此行:
command: mongod --auth --port 27117
由于您没有指定端口,MongoDB 将 运行 使用默认端口 27017。
您的 expose
部分将容器端口 27117 公开给主机,但 Mongo 不在该端口上 运行,因此该行实际上什么都不做。
您的 ports
部分将 host 端口 27117 映射到 container 端口 27017。这意味着如果您正在连接从 host,您可以连接到端口 27117,但这是连接到 container.
现在进入您的 python 程序。由于这是容器网络中的 运行ning,要在 docker-compose 网络中连接服务,您可以通过服务名称引用它们。
将这些放在一起,您的连接字符串将是:mongodb://hotbin-db:27017/yourdb?<options>
正如其他人所提到的,您真的不需要创建特定的 IP 地址除非您非常需要。您甚至不需要定义网络,因为 docker-compose 会创建它自己的内部网络。