无法从 docker 连接到 mongodb 实例:连接被拒绝
Cannot connect to mongodb instance from docker: Connection refused
我正在使用 docker-compose 创建一个多容器环境,其中我有一个 mongodb 实例和两个 python 应用程序。问题是,第一个应用程序能够建立到 mongodb 的连接,而第二个应用程序失败并出现以下错误:
File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py",
line 377, in __init__ notification_1 |
raise ConnectionFailure(str(e)) notification_1 |
pymongo.errors.ConnectionFailure: [Errno -2] Name or service not known
我的项目结构:
.
├── docker-compose.yml
├── form
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── static
│ └── templates
│ ├── form_action.html
│ └── form_sumbit.html
├── notify
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
└── README
这是我的 [更新] docker-compose.yml 文件:
version: '3'
services:
db:
image: mongo:3.0.2
container_name: mongo
networks:
db_net:
ipv4_address: 172.16.1.1
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.2
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.3
networks:
db_net:
external: true
volumes:
form:
notify:
第一个应用基于Flask,使用mongokit连接数据库。这是建立连接的代码:
MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017
app = Flask(__name__)
app.config.from_object(__name__)
# connect to the database
try:
connection = Connection(app.config['MONGODB_HOST'], app.config['MONGODB_PORT'])
except ConnectionFailure:
print("Connection to db failed. Start MongoDB instance.")
sys.exit(1)
第二个应用程序是一个简单的 python 应用程序。连接代码如下:
MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017
connection = Connection(MONGODB_HOST, MONGODB_PORT)
您的 docker-compose.yml 文件格式不正确
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
这部分的空格太多。它应该是 2 个空格,就像你文件的其余部分一样
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
yaml 对格式非常挑剔
我会尝试使用 Docker-compose 的最新版本 3 让您更轻松。
Web、数据库和通知可以放在同一个 docker 网络上。
您可以指定每个容器的 IP。然后,将这些 IP 存储在环境变量中。您可以对端口执行相同的操作。
connection = Connection(process.env.MONGODB_HOST, app.config['MONGODB_PORT']
以下命令将创建 db_net 网络:
docker network create db_net --subnet 172.16.0.0/24
这里是修改后的第3版docker-compose.yml文件。请注意,环境变量使用我们为 mongo 容器定义的 IP 地址。
version: '3'
services:
db:
image: mongo
container_name: mongo
networks:
db_net:
ipv4_address: 172.16.1.1
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.2
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.3
networks:
db_net:
external: true
您明确指定所有服务的 IP 地址以及数据库服务的容器名称是否有原因?我建议删除它们并使用服务名称在同一网络上的容器之间进行连接。
version: '3'
services:
db:
image: mongo:3.0.2
networks:
- db_net
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: db
networks:
- db_net
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: db
networks:
- db_net
networks:
db_net:
volumes:
form:
notify:
我正在使用 docker-compose 创建一个多容器环境,其中我有一个 mongodb 实例和两个 python 应用程序。问题是,第一个应用程序能够建立到 mongodb 的连接,而第二个应用程序失败并出现以下错误:
File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py",
line 377, in __init__ notification_1 |
raise ConnectionFailure(str(e)) notification_1 |
pymongo.errors.ConnectionFailure: [Errno -2] Name or service not known
我的项目结构:
.
├── docker-compose.yml
├── form
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── static
│ └── templates
│ ├── form_action.html
│ └── form_sumbit.html
├── notify
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
└── README
这是我的 [更新] docker-compose.yml 文件:
version: '3'
services:
db:
image: mongo:3.0.2
container_name: mongo
networks:
db_net:
ipv4_address: 172.16.1.1
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.2
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.3
networks:
db_net:
external: true
volumes:
form:
notify:
第一个应用基于Flask,使用mongokit连接数据库。这是建立连接的代码:
MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017
app = Flask(__name__)
app.config.from_object(__name__)
# connect to the database
try:
connection = Connection(app.config['MONGODB_HOST'], app.config['MONGODB_PORT'])
except ConnectionFailure:
print("Connection to db failed. Start MongoDB instance.")
sys.exit(1)
第二个应用程序是一个简单的 python 应用程序。连接代码如下:
MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017
connection = Connection(MONGODB_HOST, MONGODB_PORT)
您的 docker-compose.yml 文件格式不正确
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
这部分的空格太多。它应该是 2 个空格,就像你文件的其余部分一样
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
yaml 对格式非常挑剔
我会尝试使用 Docker-compose 的最新版本 3 让您更轻松。
Web、数据库和通知可以放在同一个 docker 网络上。 您可以指定每个容器的 IP。然后,将这些 IP 存储在环境变量中。您可以对端口执行相同的操作。
connection = Connection(process.env.MONGODB_HOST, app.config['MONGODB_PORT']
以下命令将创建 db_net 网络:
docker network create db_net --subnet 172.16.0.0/24
这里是修改后的第3版docker-compose.yml文件。请注意,环境变量使用我们为 mongo 容器定义的 IP 地址。
version: '3'
services:
db:
image: mongo
container_name: mongo
networks:
db_net:
ipv4_address: 172.16.1.1
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.2
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: 172.16.1.1
networks:
db_net:
ipv4_address: 172.16.1.3
networks:
db_net:
external: true
您明确指定所有服务的 IP 地址以及数据库服务的容器名称是否有原因?我建议删除它们并使用服务名称在同一网络上的容器之间进行连接。
version: '3'
services:
db:
image: mongo:3.0.2
networks:
- db_net
web:
build: form
command: python -u app.py
ports:
- "5000:5000"
volumes:
- form:/form
environment:
MONGODB_HOST: db
networks:
- db_net
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
environment:
MONGODB_HOST: db
networks:
- db_net
networks:
db_net:
volumes:
form:
notify: